stored outline迁移
stored outline是对SQL语句的一组hint。hint指示优化器对SQL语句选择一个特定的执行计划。stored outline是一种遗留技术用于提供执行计划的稳定。
stored outline迁移是用户将stored outline转换为SQL执行计划基线的处理过程。SQL执行计划基线是一组能保证提供良好性能的执行计划。
stored outline迁移的目的
假设你依赖stored outlines来维护执行计划的稳定来阻止性能的下降。Oracle提供了一种方便的方法来安全的将stored outlines转换成SQL执行计划基线。在转换后,可以与stored outline一样来维护执行计划的稳定。通过SQL执行计划基线可以使用更多先进的功能。
有以下问题需要解决:
.stored outlines不能随着时间而进行演进。因此stored outline在创建时性能良好,但是在数据库发生改变之后可能就变的性能很差。
.stored outline中的hints可能会变为无效,例如,一个index hint所指定的索引被删除了。在这种情况下,数据库仍然会使用outline,但不会排除无效索引,生成的执行计划通常比原始执行计划或由优化器所生成的当前执行计划性能要差。
.对于一个SQL语句,优化器只能选择在当前指定目录中存储在stored outline中所定义的执行计划。优化器不能从不同目录中选择不同的stored outline或性能所有提高的当前执行计划。
.stored outlines是一种被动的优化技术,它意味着你只能使用stored outline来解决已经出现的性能问题。例如,你可能创建一个stored outline来修正一个高负载SQL语句。在这种情况下,你可以使用stored outline在SQL语句变为高负载语句之前来代替主动对其进行优化。
stored outline迁移PL/SQL API可以使用以下方式来解决以上问题:
.SQL执行计划基线能让优化器使用同样性能良好的执行计划并且会随着时间推移而进行演进。对于一个特定的SQL语句,可以在验证新执行计划不会影响性能之后将其添加到SQL执行计划基线中。
.SQL执行计划基线会阻止因为无效hint而让执行计划性能变差。如果存储在执行计划中的hint变为无效,那么优化器将不能重复生成该执行计划。在这种情况下,优化器选择一种替代的可重复生成的执行计划基线或者由优化器生成当前成本最低的执行坟墓。
.对于特定SQL语句,数据库可以维护多个执行计划基线。优化器会从一组性能良好的执行计划中选择。
stored outline迁移操作
stored outline迁移操作如下:
1.用户调用一个函数指定要被迁移的outline
2.数据库按照以下方式来处理outline:
a.通过执行计划基线数据库从outline中复制所要的信息。数据库基于outline中的信息可以复制或计算。例如,在两个方案中存在的SQL语句文本,数据库可以从outline复制SQL文本到执行计划基线中。
b.数据库为了获得outline中没有的信息需要重新解析hint。plan hash值与plan cost不能从outline中获得,它需要重新解析hint。
c.数据库创建执行计划基线。
3.当数据库第一次执行相同SQL语句时选择SQL执行计划基线时就能获得丢失的信息。编译环境与执行统计信息只有在执行计划基线被解析与编译时才可以使用。
Outline目录与基线模块
outline是一组hint,而SQL执行计划基线是一组执行计划。因为它们是不同的技术,outline的有些功能不会精确映射成执行计划基线的功能。例如,单个SQL语句可以有多个outline,每一个属于不同的outline目录,但对于当前存在的执行计划基线只有一个目录default。
outline目录:对一组stored outlines指定分组。可以使用不同的目录来对SQL语句维护不同的stored outline。例如,单个语句在oltp与dw目录中创建outline。每个stored outline只能属于一个目录。一个语句可以有多个outline存储在不同目录中,但在每个目录中每个语句只能有一个outline。在执行迁移时,数据库将每个outline目录映射为SQL执行计划基线的模块。缺省的目录名为default
基线模块:指定被执行的高级别函数。一个SQL执行计划基线只能属于一个模块。在outline被迁移到SQL执行计划基线后,模块名缺省值为outline目录名。
基线目录:只能有一个SQL执行计划基线目录存在。这个基线目录叫default。在执行stored outline迁移时,SQL执行计划基线的模块名被设置为stored outline的目录名。在default目录中一个SQL语句可以有多个SQL执行计划基线。
当把stored outline迁移成SQL执行计划基线时,Oracle数据库将使用相同的名称将每个outline目录映射成SQL执行计划基线模块。
dbms_spm执行stored outline迁移
dbms_spm包有以下函数用来执行stored outline迁移:
a.dbms_spm.migrate_stored_outline:将现有stored outline迁移为SQL执行计划基线。可以使用以下格式来执行迁移:
.指定outline名称,SQL文本,outline目录或所有stored outlines
.指定outline名称列表
b.dbms_spm.alter_sql_plan_baseline:改变与SQL语句相关的单个或所有执行计划属性。
c.dbms_spm.drop_migrated_stored_outline:,删除已经补迁移为SQL执行计划基线的stored outline。这个函数将找到dba_outlines中的stored outline并标记为migrated,并且从数据库中删除这些otulines。
与stored outline迁移相关的初始化参数:
.create_stored_outlines:决定Oracle数据库是否自动创建与存储outline。
.optimizer_capture_sql_plan_baselines:启用与禁用自动识可重复SQL语句并为这些SQL语句生成SQL执行计划基线。
.use_stored_outlines:判断是否优化器使用stored outline来生成执行计划。
.optimizer_use_sql_plan_baselines:启用与禁用存储在SQL Management Base中的SQL执行计划基线。
与stored outline迁移相关的视图
.dba_outlines:描述数据库中的所有stored outline。migrated列对于outline迁移很重要并且它的值为not-migrated与migrated。当为migrated时,stored outline已经迁移为执行计划基线并且不能再使用。
.dba_sql_plan_baselines:显示为特定SQL语句当前所创建的SQL执行计划基线。origin列指示执行计划基线是怎么创建的。当值为stored-outline时指示执行计划基线是通过迁移outline而创建的。
stored outline迁移的基本操作:
1.stored outline迁移的准备操作:
检查迁移条件并且决定要迁移的执行计划基线的行为
2.选择以下操作之一:
.使用SQL执行计划管理功能来迁移outline
.当完全保留stored outline行为时迁移outline为执行计划基线
3.执行迁移后的确认与清理
stored outline迁移的准备操作
1.使用SQL*Plus以sysdba权限或有dbms_spm执行权限的用户登录数据库
[oracle@db1 ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Sat Oct 29 20:55:52 2016 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP, Data Mining and Real Application Testing options
2.查询数据库中的stored outline
SQL> select name,category,sql_text from dba_outlines where migrated='NOT-MIGRATED'; no rows selected
3.决定那个stored outline满足迁移条件:
.语句必须不是insert as select语句
.语句必须没有引用远程对象
.语句必须没有私有stored outline
4.决定是否迁移所有outline,特定stored outline或者属于某个特定outline目录中的outlines。如果不打算迁移所有outline,那么就要列出你要迁移的outline或outline目录。
5.决定stored outline被迁移成SQL执行计划基线时是使用固定执行计划还是非固定执行计划:
.固定执行计划
一个固定执行计划是冻结的。如果一个固定执行计划使用执行计划基线中的hint来重新生成,那么优化器总是选择成本最低的固定执行计划而不是那些不固定的执行计划基线。本质上,一个固定的执行计划基线实际是使用有效hint的stored outline。当数据库基于执行计划基线中的hint并且使用执行计划基线中相同plan hash值来创建执行计划时,这个固定执行计划就能被重新生成。如果多个hint中的一个变为无效,那么数据库不可能使用相同的plan hash值来创建执行计划。在这种情装饰品下,这种执行不可重新生成。当使用hint解析时,如果一个固定的执行计划不能重新生成,那么优化器将选择不同的执行计划,它可能是:
.SQL执行计划基线中的另一个执行计划。
.通过优化器重新生成执行计划
在有些情况下,因为不同的执行计划会出现性能差异,这时就需要进行SQL优化。
.非固定执行计划
如果执行计划基线没有包含固定的执行计划,那么SQL Plan Management将考虑为SQL语句选择一个等价的执行计划。
6.在开始真下迁移之前,确保Oracle满足以下条件:
.数据库必须是企业版本
.数据库必须是open且不能是暂停状态
.数据库必须不能是限制模式来访问,只读或迁移模式
使用SQL Plan Management来迁移outline
这个任务的目标是:
.为了允许SQL Plan Management来从执行计划基线中为一个SQL语句选择所有执行计划来代替在迁移后应用相同的固定执行计划。
.为了允许SQL执行计划基线通过向基线中增加新的执行计划来面对数据库的改变
下面的例子假设以下条件成立:
.迁移所有outline
.想要执行计划基线的模块名与被迁移的outline目录名相同
.不想SQL执行计划被固定
缺省情况下,生成的执行计划是不固定的并且SQL Plan Management当为SQL语句选择执行计划时会考虑所有等价的执行计划。这个方法允许先进的执行计划演进可以为SQL语句捕获新的执行计划,验证它们的性能,并接受新执行计划加入到执行计划基线。
执行dbms_spm.migrate_stored_outline来迁移stored outline
下面的例子执行dbms_spm.migrate_stored_outline来迁移所有stored outline为固定的执行计划基线:
declare my_report CLOB; begin my_report:=dbms_spm.migrate_stored_outline(attribute_name=>'all'); end;
迁移outline并保留stored outline行为
这个任务的目标是为了把stored outline迁移成SQL执行计划基线并且通过创建固定执行计划基线来保留stored outline行为。一个固定执行计划比其它执行计划的优先级高。如果执行计划被固定,那么执行计划基线不能被演进。数据库不会向包含固定执行计划的基线增加新的执行计划。
这种情况适用于以下场景:
.想要迁移目录名为firstrow中的stored outline
.想执行计划基线的模块名与被迁移的outline目录名相同
将stored outline迁移为执行计划基线:
1.
declare my_report CLOB; begin my_outlines:=dbms_spm.migrate_stored_outline (attribute_name=>'category',attribute_value=>'firstrow',fixed=>'YES'); end; /
在完成迁移操作之后,SQL执行计划基线的模块名为firstrow,目录名为default。
执行迁移后的确认与清理
这个任务的目标是:
.为了配置数据库使用执行计划基线来代替使用那些已经被迁移为SQL执行计划基线的stored outline
.为了将来执行的SQL语句创建SQL执行计划基线来代替使用stored outline
.为了删除那些已经迁移为SQL执行计划基线的stored outline
这个任务适用于以下场景:
.已经完成了stored outline迁移的基本步骤
.一些stored outline可能是在oracle 10g之前被创建
下面说明optimizer_capture_sql_plan_baselines与create_stored_outlines参数的组合是如何决定数据库创建stored outline与SQL执行计划基线的:
create_stored_outlines为false,optimizer_capture_sql_plan_baselines为false时,当执行SQL语句时,数据库不会创建stored outline或SQL执行计划基线。
create_stored_outlines为false,optimizer_capture_sql_plan_baselines为true时,数据库会自动识别重复的SQL语句并为这些语句生成SQL执行计划基线。当执行SQL语句时,如果不存在SQL执行计划基线就会使用default目录名来生成新的SQL执行计划基线。
create_stored_outlines为true,optimizer_capture_sql_plan_baselines为false时,Oracle数据库会自动创建与存储outline。当执行SQL语句时,如果不存在outline,就会使用目录名default为SQL语句创建outline。
create_stored_outlines为category,optimizer_capture_sql_plan_baselines为false时,当执行SQL语句时,如果不存在outline,就会使用指定的目录名为SQL语句创建新的stored outlines。
create_stored_outlines为true,optimizer_capture_sql_plan_baselines为true时,Oracle数据库会自动为执行的每个查询语句创建与存储outline。自动识别重复SQL语句与为这些语句生成SQL执行计划基线。当执行SQL语句时,数据库会使用目录名default来创建stored outline与SQL执行计划基线。
create_stored_outlines为category,optimizer_capture_sql_plan_baselines为true,Oracle数据库会自动为执行的每个查询语句创建outline。自动识别重复SQL语句与为这些语句生成SQL执行计划基线。当执行SQL语句时,数据库会使用指定的目录名创建stored outline并使用目录名default来创建SQL执行计划基线。
下面说明optimizer_use_sql_plan_baselines与use_stored_outlines参数的组合是如何决定数据库使用stored outline与SQL执行计划基线的:
use_stored_outlines为false,optimizer_use_sql_plan_baselines为false时,当为SQL语句选择执行计划时,数据库不会使用stored outline或执行计划基线。
use_stored_outlines为false,optimizer_use_sql_plan_baselines为true时,当为SQL语句选择执行计划时,数据库只会使用SQL执行计划基线。
use_stored_outlines为true,optimizer_use_sql_plan_baselines为false时,当为SQL语句选择执行计划时,数据库会使用目录名为default中的stored outline。
use_stored_outlines为category,optimizer_use_sql_plan_baselines为false时,当为SQL语句选择执行计划时,数据库会使用指定目录名中的stored outline。如果指定的目录名中不存在stored outline,如果在default目录中存在stored outline,那么数据库就会使用。
use_stored_outlines为true,optimizer_use_sql_plan_baselines为true时,当为SQL语句选择执行计划时,stored outline的优先级比SQL执行计划基线高。如果在default目录中存在可以用于SQL语句的stored outline,那么数据库会使用stored outline,否则数据库使用SQL执行计划基线。
use_stored_outlines为category,optimizer_use_sql_plan_baselines为true时,当为SQL语句选择执行计划时,stored outline的优先级比SQL执行计划基线高。如果指定目录或default目录中存在可以用于SQL语句的stored outline,那么数据库会使用stored outline。否则,数据库会使用SQL执行计划基线。然而,如果stored outline有migrated属性,那么数据库不会使用outline,如果存在SQL执行计划基线,那么数据库会使用SQL执行计划基线。
在完成stored outline迁移后将数据库置于合适的状态:
1.检查迁移结果,看SQL执行计划基线是否已经创建,确保执行计划被启用与接受:
SQL> select sql_handle,plan_name,origin,enabled,accepted,fixed,module from dba_sql_plan_baselines; SQL_HANDLE PLAN_NAME ORIGIN ENABLED ACCEPTED FIXED MODULE ------------------------------ ------------------------------ -------------- ------- -------- ----- -------------------------------- SQL_d0cb53f0573bcb74 SQL_PLAN_d1kumy1bmrkvnae69e7ae AUTO-CAPTURE YES YES NO emagent_SQL_oracle_database SQL_9c0d7998b1d28680 SQL_PLAN_9s3btm2sx51n074830d3a AUTO-CAPTURE YES YES NO PL/SQL Developer SQL_91430157076ba9df SQL_PLAN_92hs1aw3qrafzb96d21b9 AUTO-CAPTURE YES YES NO JDBC Thin Client SQL_fbd80d3a7daa592f SQL_PLAN_grq0d79yunq9g3517892f AUTO-CAPTURE YES YES NO emagent_SQL_rac_database SQL_c9327c795e035d87 SQL_PLAN_ckcmwg5g06rc70298c760 AUTO-CAPTURE YES YES NO emagent_SQL_rac_database SQL_773b254f11d733b0 SQL_PLAN_7fft59w8xfcxh7d2358ba AUTO-CAPTURE YES YES NO emagent_SQL_rac_database SQL_952e0dafe13297d3 SQL_PLAN_9abhdpzhm55ymff175d6b AUTO-CAPTURE YES YES NO emagent_SQL_rac_database SQL_5bea1aec47de5c1d SQL_PLAN_5ruhuxj3xwr0x3517892f AUTO-CAPTURE YES YES NO emagent_SQL_rac_database SQL_11489cc82e27c733 SQL_PLAN_12k4wt0r2gjtmf1c17b40 AUTO-CAPTURE YES YES NO emagent_SQL_rac_database SQL_da9311fb2fec8c40 SQL_PLAN_dp4sjzcryt320849be660 AUTO-CAPTURE YES YES NO emagent_SQL_rac_database SQL_2097b7cb694841d0 SQL_PLAN_215xrtdnnhhfh35e87e58 AUTO-CAPTURE YES YES NO emagent_SQL_rac_database SQL_df059c6821f89598 SQL_PLAN_dy1cwd0hzj5cs35e87e58 AUTO-CAPTURE YES YES NO emagent_SQL_rac_database SQL_94a4564ac1318120 SQL_PLAN_9992q9b0m30902f8b24ae AUTO-CAPTURE YES YES NO SQL_fc093754bbae13fe SQL_PLAN_gs29rakxuw4zy37db554f AUTO-CAPTURE YES YES NO SQL_2fd9b3dc9d848e02 SQL_PLAN_2zqdmvkfs93h25179cde9 AUTO-CAPTURE YES YES NO SQL_73b82c249b7d0843 SQL_PLAN_77f1c4kdru223ebdc4e78 AUTO-CAPTURE YES YES NO SQL_6184e8ed31386bf0 SQL_PLAN_63178xnsmhuzh561aa499 AUTO-CAPTURE YES YES NO SQL_c42198d1d5f324f5 SQL_PLAN_c88csu7az697pebdc4e78 AUTO-CAPTURE YES YES NO SQL_674112d2daaadf76 SQL_PLAN_6fh8kubdaprvq83c346df AUTO-CAPTURE YES YES NO SQL_ffa1f1f91c5bca64 SQL_PLAN_gz8gjz4f5rkm4f59a06ad AUTO-CAPTURE YES YES NO SQL_af180c8ff9a1d861 SQL_PLAN_ay60cjzwu3q3182cd7aee AUTO-CAPTURE YES YES NO SQL_3ba02daa5cc73416 SQL_PLAN_3r81dp9fcfd0q94b64494 AUTO-CAPTURE YES YES NO SQL_9cc94d4239925ef4 SQL_PLAN_9tkad88wt4rrn5976b5eb AUTO-CAPTURE YES YES NO SQL_1dc6cbd35acb4efd SQL_PLAN_1vjqbuddcqmrx5d4b54d5 AUTO-CAPTURE YES YES NO SQL_9ed410d70ee4f2fe SQL_PLAN_9xp0huw7f9wry2f8b24ae AUTO-CAPTURE YES YES NO SQL_f7a25d7938972912 SQL_PLAN_gg8kxg4w9fa8kebdc4e78 AUTO-CAPTURE YES YES NO SEVERITY EVALUATION SQL_90cda4f1c4064ca9 SQL_PLAN_91md4y720cm5924d38443 AUTO-CAPTURE YES YES NO SEVERITY EVALUATION SQL_c42ff7e665ca18ec SQL_PLAN_c8bzrwtkwn67c55df0880 AUTO-CAPTURE YES YES NO SEVERITY EVALUATION SQL_a56d8c52cbac8dc5 SQL_PLAN_aavccab5ut3f5a9b3d668 AUTO-CAPTURE YES YES NO SEVERITY EVALUATION SQL_35a61a655e37564d SQL_PLAN_3b9hucpg3fpkd5454b1ea AUTO-CAPTURE YES YES NO SEVERITY EVALUATION SQL_ac3326a11f142cac SQL_PLAN_asct6n4gj8b5c76def5aa AUTO-CAPTURE YES YES NO SEVERITY EVALUATION SQL_581db5ae5093f1d2 SQL_PLAN_5h7dppt897wfk15aad75e AUTO-CAPTURE YES YES NO SEVERITY EVALUATION SQL_2531d59ec295a26c SQL_PLAN_2acfpmv19b8mc6943321d AUTO-CAPTURE YES YES NO SEVERITY EVALUATION SQL_09070338bc78471e SQL_PLAN_0k1s372y7hjsyebdc4e78 AUTO-CAPTURE YES YES NO SEVERITY EVALUATION SQL_8bd89c2a8626630d SQL_PLAN_8rq4w5a32cssdd7a28287 AUTO-CAPTURE YES YES NO SEVERITY EVALUATION SQL_c99cfd0ca0ec6d27 SQL_PLAN_cm77x1khfsv97e0d1d869 AUTO-CAPTURE YES YES NO SEVERITY EVALUATION SQL_1178b3f40ee9079d SQL_PLAN_12y5myh7fk1wx7fa68824 AUTO-CAPTURE YES YES NO SEVERITY EVALUATION SQL_30c826839bd031c7 SQL_PLAN_31k16hfdx0cf7ebdc4e78 AUTO-CAPTURE YES YES NO SEVERITY EVALUATION SQL_75642813e87d55ba SQL_PLAN_7at182gn7upduc9e4a408 AUTO-CAPTURE YES NO NO SEVERITY EVALUATION SQL_75642813e87d55ba SQL_PLAN_7at182gn7updu4d0fe611 AUTO-CAPTURE YES YES NO SEVERITY EVALUATION SQL_0398f5dac9a26bd2 SQL_PLAN_0767pvb4u4uykaa9fb8f2 AUTO-CAPTURE YES YES NO SEVERITY EVALUATION SQL_5bf2fdd320991dc8 SQL_PLAN_5rwrxuch9k7f815aad75e AUTO-CAPTURE YES YES NO SEVERITY EVALUATION SQL_faff45acb48c010c SQL_PLAN_gpzu5pku8s08c3b4f0583 AUTO-CAPTURE YES NO NO SEVERITY EVALUATION SQL_faff45acb48c010c SQL_PLAN_gpzu5pku8s08c0a771b57 AUTO-CAPTURE YES YES NO SEVERITY EVALUATION SQL_0edbf315864797cd SQL_PLAN_0xqzm2q34g5ydf06d473d AUTO-CAPTURE YES YES NO SEVERITY EVALUATION SQL_6807bab99db0361a SQL_PLAN_6h1xur6fv0dhu2e8a86b7 AUTO-CAPTURE YES YES NO PL/SQL Developer SQL_1a45242d50349a41 SQL_PLAN_1nj945p8396k1c9e4a408 AUTO-CAPTURE YES NO NO SEVERITY EVALUATION SQL_1a45242d50349a41 SQL_PLAN_1nj945p8396k14d0fe611 AUTO-CAPTURE YES YES NO SEVERITY EVALUATION SQL_4c66704928a28228 SQL_PLAN_4stmh94na50j86943321d AUTO-CAPTURE YES YES NO SEVERITY EVALUATION SQL_7757ffeb83333a7e SQL_PLAN_7fpzzxf1m6fmy68d74995 AUTO-CAPTURE YES YES NO SEVERITY EVALUATION SQL_17c90a44687b6622 SQL_PLAN_1gk8a8jn7qtj26943321d AUTO-CAPTURE YES YES NO SEVERITY EVALUATION SQL_6d5efcdbb0af4493 SQL_PLAN_6urrwvfsayj4m4efadb75 AUTO-CAPTURE YES YES NO SQL_2c0bedfc971b5441 SQL_PLAN_2s2zdzkbjqp212f8b24ae AUTO-CAPTURE YES YES NO OEM.BoundedPool SQL_fc7e68bc886477c5 SQL_PLAN_gszm8rk468xy5f4b84801 AUTO-CAPTURE YES YES NO OEM.BoundedPool SQL_9425c7639bc97782 SQL_PLAN_989f7cfdwkxw245768591 AUTO-CAPTURE YES YES NO OEM.BoundedPool SQL_1205bbc63c6b2eeb SQL_PLAN_141dvssy6qbrb47a21cb4 AUTO-CAPTURE YES YES NO OEM.BoundedPool SQL_1367e948428a55f2 SQL_PLAN_16tz99118npgk7a54464c AUTO-CAPTURE YES YES NO emagent_SQL_oracle_database SQL_a47e7f9f186b16f8 SQL_PLAN_a8zmzmwc6q5rs799d6e65 AUTO-CAPTURE YES YES NO emagent_SQL_oracle_database SQL_03d675f2172c4dff SQL_PLAN_07pmpy8bksmgz6d032274 AUTO-CAPTURE YES YES NO emagent_SQL_oracle_database 59 rows selected
2.可选操作,修改SQL执行计划基线的属性。例如,下面的语句将修改特定SQL语句的执行计划基线为fixed:
SQL> declare 2 v_cnt PLS_INTEGER; 3 begin 4 v_cnt:=dbms_spm.alter_sql_plan_baseline( 5 sql_handle=>'SQL_9c0d7998b1d28680', 6 attribute_name=>'FIXED', 7 attribute_value=>'YES'); 8 dbms_output.put_line('Plans altered: '|| v_cnt); 9 end; 10 / PL/SQL procedure successfully completed
3.检查原stored outline的状态:
select name,owner,category,used,migrated from dba_outlines;
4.删除那些已经被迁移到SQL执行计划基线中的所有stored outline,下面的语将用来删除dba_outlines中状态为migrated的所有stored outline:
declare v_cnt PLS_INTEGER; begin v_cnt:=dbms_spm.drop_migrated_stored_outline(); dbms_output.put_line('Migrated stored outlines dropped: '|| v_cnt); end;
5.设置初始化参数:
.当执行SQL语句时,数据库创建SQL执行计划基线但不创建stored outline
.当不存在等价的SQL执行计划基线时,数据库只使用stored outline
下面的例子,当执行SQL语句时,指示数据库创建SQL执行计划基线来代替stored outline。并且指示
数据库当目录allrows或default中的没有被迁移到SQL执行计划基线中的stored outline。否则数据
库只使用SQL执行计划基线。
alter system set create_stored_outline = false;
alter system set optimizer_capture_sql_plan_baselines = true;
alter system set optimizer_use_sql_plan_baselines = true;
alter session set use_stored_outlines = allrows;