SQL执行计划管理可以分为哪些基本任务
本篇内容介绍了“SQL执行计划管理可以分为哪些基本任务”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
使用dbms_spm与dbms_xplan包来执行大部分的SQL执行计划管理任务。SQL执行计划管理可以分为以下基本任务:
.配置SQL执行计划管理
.显示SQL执行计划基线中的执行计划
.加载SQL执行计划基线
.手动evolve执行计划基线中的执行计划
.删除SQL执行计划基线
.管理SQL Management Base(SMB)
.迁移Stored Outlines to SQL Plan Baselines
配置SQL执行计划管理
.配置捕获与使用SQL Plan Baselines
.管理SPM Evolve Advisor Task
配置捕获与使用SQL Plan Baselines
可以使用optimizer_capture_sql_plan_baselines与optimizer_use_sql_plan_baselines参数来控制SQL plan管理。
SQL>showparametersql_planNAMETYPEVALUE-----------------------------------------------------------------------------optimizer_capture_sql_plan_baselinesbooleanFALSEoptimizer_use_sql_plan_baselinesbooleanTRUE
optimizer_capture_sql_plan_baselines的缺省值为false。对于不在执行计划历史中的任何重复的SQL语句,数据库不会对SQL语句自动创建一个初始的SQL Plan Baseline。如果optimizer_capture_sql_plan_baselines参数设置为true,那么可以使用dbms_spm.configure过程来配置过滤器来判断哪些SQL语句满足捕获条件。缺省情况是没有配置过滤器的,这意味着所有重复执行的SQL语句都满足捕获条件。
optimizer_use_sql_plan_baselines的缺省值为true。对于已经在SQL plan baseline中存在的任何SQL语句,数据库会自动向SQL plan baselines中以未接受的执行计划来添加新的SQL plan。
对SQL Plan管理启用自动初始化Plan捕获
将optimizer_capture_sql_plan_baselines参数设置为true是对在plan历史中不存在的任何SQL语句自动创建一个初始化SQL Plan baseline所必要的。缺省情况下,当自动SQL plan baseline捕获被启用后,数据库会为每个重复的SQL语句,包括所有递归SQL语句与监控SQL语句创建一个SQL Plan baseline。因此,自动捕获功能可能会造成大量的SQL Plan Baseline。 为了限制捕获的SQL Plan Baselines的数量可以使用dbms_spm.configure过程来配置过滤条件。optimizer_capture_sql_plan_baselines参数不控制自动向之前创建的SQL plan baseline添加新发现的执行计划。
启用自动捕获SQL plan baseline操作如下:
1.以有相关权限的用户用SQL*Plus登录数据库
[oracle@jytest1~]$sqlplussys/abcd@jypdbassysdbaSQL*Plus:Release12.2.0.1.0ProductiononTueFeb1221:50:102019Copyright(c)1982,2016,Oracle.Allrightsreserved.Connectedto:OracleDatabase12cEnterpriseEditionRelease12.2.0.1.0-64bitProduction
2.显示当前SQL Plan管理的设置情况
SQL>showparametersql_planNAMETYPEVALUE-----------------------------------------------------------------------------optimizer_capture_sql_plan_baselinesbooleanFALSEoptimizer_use_sql_plan_baselinesbooleanTRUE
3.为了对重复的SQL语句启用自动生成SQL Plan Baseline执行下面的语句
SQL>altersystemsetoptimizer_capture_sql_plan_baselines=truescope=bothsid='*';Systemaltered.SQL>showparameteroptimizer_capture_sql_plan_baselinesNAMETYPEVALUE-----------------------------------------------------------------------------optimizer_capture_sql_plan_baselinesbooleanTRUE
当启用SQL Plan Baselines自动捕获功能后可以从下面的结果看到对重复的所有SQL语句进行了执行执行的捕获
SQL>selectt.sql_handle,t.sql_text,t.creator,t.originfromDBA_SQL_PLAN_BASELINESt;SQL_HANDLESQL_TEXTCREATORORIGIN--------------------------------------------------------------------------------------------------------------------------------SQL_187ebe987c151d1bselectvaluefromv$nls_parameterswhereparameter='NLS_LENGTH_SEMANTICS'SYSAUTO-CAPTURESQL_65afdf280fbfa69fselect*fromDBA_SQL_PLAN_BASELINEStSYSAUTO-CAPTURESQL_6807bab99db0361aselectvaluefromv$sesstatwheresid=:sidorderbystatistic#SYSAUTO-CAPTURE
为自动SQL Plan Baseline捕获配置过滤条件
如果optimizer_capture_sql_plan_baselines设置为true,那么你可以使用dbms_spm.configure过程来对重复执行的SQL语句创建一个自动捕获过滤条件。自动过滤可以只捕获想要的SQL语句并排除非关键语句,这样可以节省SYSAUX表空间的使用。可以对不同的类型配置多个参数,也可以在单独的语句中对相同的参数指定多个参数值,数据库会进行组合。这种设置是附加型的:一个参数设置不会覆盖之前的设置。例如,下面的过滤设置用来捕获解析方案SYS或SYSTEM中的SQL语句:
execdbms_spm.configure('auto_capture_parsing_schema_name','sys',true);execdbms_spm.configure('auto_capture_parsing_schema_name','system',true);
然而,不能在相同的过程中对相同的参数指定多个参数值。例如不能对AUTO_CAPTURE_SQL_TEXT指定多个SQL文本字符串。DBA_SQL_MANAGEMENT_CONFIG视图可以用来显示当前参数值。
下面的操作假设optimizer_capture_sql_plan_baselines参数被设置为true。只要捕获sh方案所有执行的SQL语句并且想要排除包含test_only文本的语句
1.以有相关权限的用户用SQL*Plus登录数据库
[oracle@jytest1~]$sqlplussys/abcd@jypdbassysdbaSQL*Plus:Release12.2.0.1.0ProductiononTueFeb1221:50:102019Copyright(c)1982,2016,Oracle.Allrightsreserved.Connectedto:OracleDatabase12cEnterpriseEditionRelease12.2.0.1.0-64bitProduction
2.为了删除对解析方案与SQL文本已经存在的任何过滤条件执行以下语句:
SQL>execdbms_spm.configure('auto_capture_parsing_schema_name',null,true);PL/SQLproceduresuccessfullycompleted.SQL>execdbms_spm.configure('auto_capture_sql_text',null,true);PL/SQLproceduresuccessfullycompleted.SQL>selectparameter_name,parameter_value2fromdba_sql_management_config3whereparameter_namelike'%AUTO%';PARAMETER_NAMEPARAMETER_VALUE----------------------------------------------------------------AUTO_CAPTURE_PARSING_SCHEMA_NAMEAUTO_CAPTURE_MODULEAUTO_CAPTURE_ACTIONAUTO_CAPTURE_SQL_TEXT
3.只对sh方案所执行的语句启用自动捕获
SQL>execdbms_spm.configure('auto_capture_parsing_schema_name','sh',true);PL/SQLproceduresuccessfullycompleted.
4.从自动捕获中排除任何包含test_only文本的语句
SQL>execdbms_spm.configure('auto_capture_sql_text','%test_only%',false);PL/SQLproceduresuccessfullycompleted.
5.通过查询dba_sql_management_config视图来确认配置的过滤条件
SQL>colparameter_nameformata32SQL>colparameter_valueformata32SQL>selectparameter_name,parameter_value2fromdba_sql_management_config3whereparameter_namelike'%AUTO%';PARAMETER_NAMEPARAMETER_VALUE----------------------------------------------------------------AUTO_CAPTURE_PARSING_SCHEMA_NAMEparsing_schemaIN(SH)AUTO_CAPTURE_MODULEAUTO_CAPTURE_ACTIONAUTO_CAPTURE_SQL_TEXT(sql_textNOTLIKE%test_only%)
禁用所有SQL Plan Baselines
当optimizer_use_sql_plan_baselines参数设置为false时,数据库不会使用任何SQL Plan Baseline。为了禁用所有SQL Plan baselines执行以下操作:
1.以有相关权限的用户用SQL*Plus登录数据库
[oracle@jytest1~]$sqlplussys/abcd@jypdbassysdbaSQL*Plus:Release12.2.0.1.0ProductiononTueFeb1221:50:102019Copyright(c)1982,2016,Oracle.Allrightsreserved.Connectedto:OracleDatabase12cEnterpriseEditionRelease12.2.0.1.0-64bitProductionSQL>showparametersql_planNAMETYPEVALUE-----------------------------------------------------------------------------optimizer_capture_sql_plan_baselinesbooleanFALSEoptimizer_use_sql_plan_baselinesbooleanTRUE
2.为了忽略所有现存的SQL Plan Baselines执行以下语句
SQL>altersystemsetoptimizer_use_sql_plan_baselines=falsescope=bothsid='*';Systemaltered.SQL>showparametersql_planNAMETYPEVALUE-----------------------------------------------------------------------------optimizer_capture_sql_plan_baselinesbooleanFALSEoptimizer_use_sql_plan_baselinesbooleanFALSE
管理SPM Evolve Advisor Task
SPM Evolve Advisor是一个SQL Advisor可以对最近添加到SQL Plan Baseline中的SQL Plan进行evolve。缺省情况下,SYS_AUTO_SPM_EVOLVE_TASK在调度维护窗口中每天运行。SPM Evolve Advisor Task执行以下操作:
1.定位未接受的SQL Plan
2.对所有未接受的SQL Plan进行排名
3.在维护窗口尽可能的对大量的SQL Plan进行测试执行
4.选择一个成本最低的执行计划与每个未接受的执行计划进行比较
5.使用基于成本的算法来自动接受比现有已接受的执行计划性能更好的任何未接受的执行计划
启用与禁用SPM Evolve Advisor Task
对于自动SPM Evolve Advisor Task没有单独的调度客户端存在。一个调度客户端控制着自动SQL Tuning Advisor与自动SPM Evolve Advisor。
配置自动SPM Evolve Advisor Task
通过使用dbms_spm.set_evolve_task_parameter过程来指定任务参数来配置自动SQL Plan Evolve。因为SYS_AUTO_SPM_EVOLVE_TASK任务的所有者为SYS,只有SYS用户可以设置任务参数。
dbms_spm.set_evolve_task_parameter有以下参数
alternate_plan_source:决定添加SQL Plan的搜索源:cursor_cache,automatic_workload_repository或sql_tuning_sets。可以使用+号来组合多个参数值,缺省值为cursor_cache+automatic_workload_repository
alternate_plan_baseline:决定那个替代plan应该被加载。EXISING它是缺省值,使用现有的SQL Plan baseline来为语句加载SQL plan。NEW不使用现有SQL plan baseline来为语句加载SQL plan,并且会创建一个新的SQL Plan baseline。可以使用+号来组合多个参数值。
alternate_plan_limit:指定可以加载SQL Plan的最大数量,缺省值为0。
accept_plans:指定是否自动接受建议的SQL Plan。当accept_plans设置为true(缺省值)时,SQL Plan管理自动接受由SPM Evolve Advisor Task所建议的所有SQL Plan。当设置为false时,如果找到替代的SQL plan,SPM Evolve Advisor Task会验证SQLPlan并生成一个报告,但不会evolve这个SQL plan。
下面的操作假如满足以下条件
.想要数据库自动接受SQL Plan
.想在任务每次执行1200秒后就会超时
.想要evolve任务在共享SQL区与AWR档案库中查找最多500个SQL Plan
设置自动evolve任务参数
1.以sys用户登录数据库
[oracle@jytest1~]$sqlplussys/abcd@jypdbassysdbaSQL*Plus:Release12.2.0.1.0ProductiononTueFeb1221:50:102019Copyright(c)1982,2016,Oracle.Allrightsreserved.Connectedto:OracleDatabase12cEnterpriseEditionRelease12.2.0.1.0-64bitProduction
2.查询sys_auto_spm_evolve_task任务的当前参数设置情况
SQL>colparameter_nameformata25SQL>colvalueformata42SQL>selectparameter_name,parameter_valueas"value"2fromdba_advisor_parameters3where((task_name='SYS_AUTO_SPM_EVOLVE_TASK')and4((parameter_name='ACCEPT_PLANS')or5(parameter_nameLIKE'%ALT%')or6(parameter_name='TIME_LIMIT')));PARAMETER_NAMEvalue-------------------------------------------------------------------TIME_LIMIT3600ALTERNATE_PLAN_LIMIT10ALTERNATE_PLAN_SOURCECURSOR_CACHE+AUTOMATIC_WORKLOAD_REPOSITORYALTERNATE_PLAN_BASELINEEXISTINGACCEPT_PLANSTRUE
3.使用以下PLSQL块来配置sys_auto_spm_evolve_task任务自动接收SQL plan,在共享SQL区与AWR档案库中查找最多500个SQL plan,并且在执行20分钟后任务就会超时终止。
SQL>begin2dbms_spm.set_evolve_task_parameter(task_name=>'SYS_AUTO_SPM_EVOLVE_TASK',parameter=>'TIME_LIMIT',value=>'1200');3dbms_spm.set_evolve_task_parameter(task_name=>'SYS_AUTO_SPM_EVOLVE_TASK',parameter=>'ACCEPT_PLANS',value=>'true');4dbms_spm.set_evolve_task_parameter(task_name=>'SYS_AUTO_SPM_EVOLVE_TASK',parameter=>'ALTERNATE_PLAN_LIMIT',value=>'500');5end;6/PL/SQLproceduresuccessfullycompleted.
4.确认sys_auto_spm_evolve_task任务的当前参数设置情况
SQL>colparameter_nameformata25SQL>colvalueformata42SQL>selectparameter_name,parameter_valueas"value"2fromdba_advisor_parameters3where((task_name='SYS_AUTO_SPM_EVOLVE_TASK')and4((parameter_name='ACCEPT_PLANS')or5(parameter_nameLIKE'%ALT%')or6(parameter_name='TIME_LIMIT')));PARAMETER_NAMEvalue-------------------------------------------------------------------TIME_LIMIT1200ALTERNATE_PLAN_LIMIT500ALTERNATE_PLAN_SOURCECURSOR_CACHE+AUTOMATIC_WORKLOAD_REPOSITORYALTERNATE_PLAN_BASELINEEXISTINGACCEPT_PLANStrue
显示SQL执行计划基线中的执行计划
为了查看指定SQL语句存储在SQL Plan Baseline中的SQL Plan,可以使用dbms_xplan.display_sql_plan_baseline 函数。这个函数使用存储在plan history中的执行计划信息来显示SQL Plan。它有以下参数:
sql_handle:语句的 SQL handle可以通过连接v$sql.sql_plan_baseline与dba_sql_plan_baselines.plan_name列来进行查询
plan_name:语句执行计划的名字
假设要显示SQL ID为34q7g1h59b79n的语句所存储在SQL Plan Baseline中的执行计划执行下面的语句
SQL>select*fromhr.jobs;JOB_IDJOB_TITLEMIN_SALARYMAX_SALARY-----------------------------------------------------------------AD_PRESPresident2008040000AD_VPAdministrationVicePresident1500030000AD_ASSTAdministrationAssistant30006000FI_MGRFinanceManager820016000FI_ACCOUNTAccountant42009000AC_MGRAccountingManager820016000AC_ACCOUNTPublicAccountant42009000SA_MANSalesManager1000020080SA_REPSalesRepresentative600012008PU_MANPurchasingManager800015000PU_CLERKPurchasingClerk25005500JOB_IDJOB_TITLEMIN_SALARYMAX_SALARY-----------------------------------------------------------------ST_MANStockManager55008500ST_CLERKStockClerk20085000SH_CLERKShippingClerk25005500IT_PROGProgrammer400010000MK_MANMarketingManager900015000MK_REPMarketingRepresentative40009000HR_REPHumanResourcesRepresentative40009000PR_REPPublicRelationsRepresentative45001050019rowsselected.SQL>select*fromtable(dbms_xplan.display_cursor(null,null,'advanced'));PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------SQL_ID4gc64454ax64x,childnumber1-------------------------------------select*fromhr.jobsPlanhashvalue:944056911--------------------------------------------------------------------------|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time|--------------------------------------------------------------------------|0|SELECTSTATEMENT||||3(100)|||1|TABLEACCESSFULL|JOBS|19|627|3(0)|00:00:01|PLAN_TABLE_OUTPUT----------------------------------------------------------------------------------------------------------------------------------------------------------QueryBlockName/ObjectAlias(identifiedbyoperationid):-------------------------------------------------------------1-SEL$1/JOBS@SEL$1OutlineData-------------/*+PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------BEGIN_OUTLINE_DATAIGNORE_OPTIM_EMBEDDED_HINTSOPTIMIZER_FEATURES_ENABLE('12.2.0.1')DB_VERSION('12.2.0.1')OPT_PARAM('optimizer_dynamic_sampling'0)ALL_ROWSNO_PARALLELOUTLINE_LEAF(@"SEL$1")FULL(@"SEL$1""JOBS"@"SEL$1")END_OUTLINE_DATA*/PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------ColumnProjectionInformation(identifiedbyoperationid):-----------------------------------------------------------1-"JOBS"."JOB_ID"[VARCHAR2,10],"JOBS"."JOB_TITLE"[VARCHAR2,35],"JOBS"."MIN_SALARY"[NUMBER,22],"JOBS"."MAX_SALARY"[NUMBER,22]Note------automaticDOP:ComputedDegreeofParallelismis1becauseofparallelthresholdPLAN_TABLE_OUTPUT---------------------------------------------------------------------------------SQLplanbaselineSQL_PLAN_bmz5xhst6b31y41975532usedforthisstatement45rowsselected.SQL>SELECTPLAN_TABLE_OUTPUT2FROMV$SQLs,DBA_SQL_PLAN_BASELINESb,3TABLE(4DBMS_XPLAN.DISPLAY_SQL_PLAN_BASELINE(b.sql_handle,b.plan_name,'basic')5)t6WHEREs.EXACT_MATCHING_SIGNATURE=b.SIGNATURE7ANDb.PLAN_NAME=s.SQL_PLAN_BASELINE8ANDs.SQL_ID='4gc64454ax64x';PLAN_TABLE_OUTPUT----------------------------------------------------------------------------------------------------------------------------------------------------------------SQLhandle:SQL_b9fcbd8632658c3eSQLtext:select*fromhr.jobs----------------------------------------------------------------------------------------------------------------------------------------------------------------Planname:SQL_PLAN_bmz5xhst6b31y41975532Planid:1100436786Enabled:YESFixed:NOAccepted:YESOrigin:AUTO-CAPTUREPlanrows:Fromdictionary--------------------------------------------------------------------------------PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------Planhashvalue:944056911----------------------------------|Id|Operation|Name|----------------------------------|0|SELECTSTATEMENT|||1|TABLEACCESSFULL|JOBS|----------------------------------20rowsselected.
上面的结果显示SQL ID为4gc64454ax64x的执选执行计划名字叫SQL_PLAN_bmz5xhst6b31y41975532并且是被自动捕获的。
加载SQL执行计划基线
使用dbms_spm可以批量加载一组现有的执行计划到一个SQL Plan Baseline中。dbms_spm包可以从以下来源加载执行计划:
.AWR:要从AWR快照加载执行计划,那么必须指定快照开始与结束的范围,另外也可以应用过滤条件来只加载满足条件的执行计划。缺省情况下,数据库在下一次执行SQL语句时优化器就会使用加载到SQL Plan Baseline中的执行计划。
.共享SQL区:直接从共享SQL区来加载执行计划。通过对模块名,方案名或SQL ID应用过滤条件可以标识需要被捕获的SQL语句或一组SQL语句。数据库在下一次执行SQL语句时优化器就会使用加载到SQL Plan Baseline中的执行计划。当应用程序SQL已经通过手写hints进行过优化之后直接从共享SQL区中加载执行计划是非常有用的。因为你可能不能更改SQL包括hint,使用SQL Plan Baseline可以确保应用程序SQL使用最优的执行计划。
.SQL tuning set(STS):捕获SQL工作量的执行计划到一个STS中,然后加载执行计划到SQL Plan Baselines中。数据库在下一次执行SQL语句时优化器就会使用加载到SQL Plan Baseline中的执行计划。从STS中批量加载执行计划是在数据库升级后防止执行计划回归有效的方法。
.Staging table:使用dbms_spm包可以定义一个staging表,dbms_spm.pack_stgtab_baseline过程可以复制SQLPlan baseline到一个staging表中,并使用Oracle data pump将共staging表传输到另一个数据库。在目标数据库中,使用dbms_spm.unpack_stgtab_baseline过程来从staging表中把SQL plan baseline加载到SMB中。
.Stored outline:迁移stroed outlines到SQL Plan Baselines中。在迁移之后,你可以通过SQL Plan管理所提供的更高级的功能来维护相同的执行计划稳定性。
从AWR加载执行计划
假设我们要将下面的查询语句的执行计划加载到SQL Plan Baseline中,那么要确保用户sh有查询dba_hist_snapshot和dba_sql_plan_baselines视图,执行dbms_workload_repository.create_snapshot和dbms_spm.load_plans_from_awr的权限
SELECT/*LOAD_AWR*/*FROMsh.salesWHEREquantity_sold>40ORDERBYprod_id;
为了从AWR中加载执行计划到SQL Plan Baselines中执行以下操作
1.以有相关权限的用户登录到数据库,然后查询最近生成的3个AWR快照
SQL>select*2from(selectinstance_number,snap_id,snap_level,3to_char(begin_interval_time,'dd/mm/yyhh34:mi:ss')begin4fromdba_hist_snapshot5orderbysnap_iddesc)6whererownum<=3;INSTANCE_NUMBERSNAP_IDSNAP_LEVELBEGIN----------------------------------------------------17061114/02/1916:00:0927061114/02/1916:00:0917060114/02/1915:00:35
2.查询sh.sales表,使用load_awr标记来识别这个SQL语句
SQL>select/*load_awr*/*2fromsh.sales3wherequantity_sold>404orderbyprod_id;norowsselected
3.生成一个新的AWR快照
SQL>execdbms_workload_repository.create_snapshot;PL/SQLproceduresuccessfullycompleted.
4.查询最近生成的3个AWR快照来确保新的AWR快照已经生成了
SQL>select*2from(selectinstance_number,snap_id,snap_level,3to_char(begin_interval_time,'dd/mm/yyhh34:mi:ss')begin4fromdba_hist_snapshot5orderbysnap_iddesc)6whererownum<=3;INSTANCE_NUMBERSNAP_IDSNAP_LEVELBEGIN----------------------------------------------------17062114/02/1917:00:0927062114/02/1917:00:0917061114/02/1916:00:09
5.使用最近生成的2个AWR快照来加载执行计划
SQL>variablev_plan_cntnumberSQL>exec:v_plan_cnt:=dbms_spm.load_plans_from_awr(begin_snap=>7061,end_snap=>7062);PL/SQLproceduresuccessfullycompleted.
6.查询数据字典来确保load_awr语句的执行计划被加载到SQL Plan Baselines中了
SQL>colsql_handleformata20SQL>colsql_textformata20SQL>colplan_nameformata30SQL>coloriginformata20SQL>selectsql_handle,sql_text,plan_name,2origin,enabled,accepted3fromdba_sql_plan_baselines4wheresql_textlike'%load_awr%';SQL_HANDLESQL_TEXTPLAN_NAMEORIGINENAACC------------------------------------------------------------------------------------------------SQL_495d29c5f4612cdaselect/*load_awr*/SQL_PLAN_4kr99sru62b6u54bc8843MANUAL-LOAD-FROM-AWRYESYES*fromsh.saleswherequantity_sold>40orderbyprod_id
7.再次执行load_awr语句,查看其执行计划可以看到SQL plan baseline SQL_PLAN_4kr99sru62b6u54bc8843 used for this statement这样的信息,说明生成的执行计划基线应用到该语句了
SQL>select/*load_awr*/*2fromsh.sales3wherequantity_sold>404orderbyprod_id;norowsselectedSQL>select*fromtable(dbms_xplan.display_cursor(null,null,'advanced'));PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------------------------SQL_IDdybku83zppk0d,childnumber1-------------------------------------select/*load_awr*/*fromsh.saleswherequantity_sold>40orderbyprod_idPlanhashvalue:3803407550----------------------------------------------------------------------------------------------|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time|Pstart|Pstop|----------------------------------------------------------------------------------------------|0|SELECTSTATEMENT||||511(100)|||||1|SORTORDERBY||1|29|511(2)|00:00:01||||2|PARTITIONRANGEALL||1|29|510(2)|00:00:01|1|28||*3|TABLEACCESSFULL|SALES|1|29|510(2)|00:00:01|1|28|----------------------------------------------------------------------------------------------QueryBlockName/ObjectAlias(identifiedbyoperationid):-------------------------------------------------------------1-SEL$13-SEL$1/SALES@SEL$1OutlineData-------------/*+BEGIN_OUTLINE_DATAIGNORE_OPTIM_EMBEDDED_HINTSOPTIMIZER_FEATURES_ENABLE('12.2.0.1')DB_VERSION('12.2.0.1')OPT_PARAM('optimizer_dynamic_sampling'0)ALL_ROWSNO_PARALLELOUTLINE_LEAF(@"SEL$1")FULL(@"SEL$1""SALES"@"SEL$1")END_OUTLINE_DATA*/PredicateInformation(identifiedbyoperationid):---------------------------------------------------3-filter("QUANTITY_SOLD">40)ColumnProjectionInformation(identifiedbyoperationid):-----------------------------------------------------------1-(#keys=1)"SALES"."PROD_ID"[NUMBER,22],"SALES"."CUST_ID"[NUMBER,22],"SALES"."TIME_ID"[DATE,7],"SALES"."CHANNEL_ID"[NUMBER,22],"SALES"."PROMO_ID"[NUMBER,22],"SALES"."QUANTITY_SOLD"[NUMBER,22],"SALES"."AMOUNT_SOLD"[NUMBER,22]2-(rowset=256)"SALES"."PROD_ID"[NUMBER,22],"SALES"."CUST_ID"[NUMBER,22],"SALES"."TIME_ID"[DATE,7],"SALES"."CHANNEL_ID"[NUMBER,22],"SALES"."PROMO_ID"[NUMBER,22],"QUANTITY_SOLD"[NUMBER,22],"SALES"."AMOUNT_SOLD"[NUMBER,22]3-(rowset=256)"SALES"."PROD_ID"[NUMBER,22],"SALES"."CUST_ID"[NUMBER,22],"SALES"."TIME_ID"[DATE,7],"SALES"."CHANNEL_ID"[NUMBER,22],"SALES"."PROMO_ID"[NUMBER,22],"QUANTITY_SOLD"[NUMBER,22],"SALES"."AMOUNT_SOLD"[NUMBER,22]Note------automaticDOP:ComputedDegreeofParallelismis1becauseofparallelthreshold-SQLplanbaselineSQL_PLAN_4kr99sru62b6u54bc8843usedforthisstatement64rowsselected.
从共享SQL区加载执行计划
假设要从共享SQL区将下面的查询语句的执行计划加载到SQL Plan Baseline中需要执行以下操作
1.执行SQL语句
SQL>SELECT/*LOAD_CC*/*2FROMsh.sales3WHEREquantity_sold>404ORDERBYprod_id;norowsselected
2.查询v$sql视图查询执行语句的SQL ID
SQL>SELECTSQL_ID,CHILD_NUMBERAS"ChildNum",2PLAN_HASH_VALUEAS"PlanHash",3OPTIMIZER_ENV_HASH_VALUEAS"OptEnvHash"4FROMV$SQL5WHERESQL_TEXTLIKE'SELECT/*LOAD_CC*/%';SQL_IDChildNumPlanHashOptEnvHash---------------------------------------------09x8cz4wrn655038034075504099961812
3.从共享SQL区加载指定语句的执行计划到SQL Plan Baseline中
SQL>VARIABLEv_plan_cntNUMBERSQL>EXECUTE:v_plan_cnt:=DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(sql_id=>'09x8cz4wrn655');PL/SQLproceduresuccessfullycompleted.
4.查询dba_sql_plan_baselines视图来确认语句的执行计划是否加载到SQL Plan Baselines中了
SQL>SELECTSQL_HANDLE,SQL_TEXT,PLAN_NAME,2ORIGIN,ENABLED,ACCEPTED3FROMDBA_SQL_PLAN_BASELINESWHERESQL_TEXTLIKE'%LOAD_CC%';SQL_HANDLESQL_TEXTPLAN_NAMEORIGINENAACC------------------------------------------------------------------------------------------------SQL_f6cb7f742ef93547SELECT/*LOAD_CC*/*SQL_PLAN_gdkvzfhrgkda754bc8843MANUAL-LOAD-FROM-CURYESYESSOR-CACHEFROMsh.salesWHEREquantity_sold>40ORDERBYprod_id
从SQL Tuning Set中加载执行计划
一个SQL Tuning Set是一个数据库对象它包括一个或多个SQL语句,执行统计信息与执行上下文信息。假设SQLTuning Set包含下面的语句,要从SQL Tuning Set中加载该语句的执行计划到SQL Plan Baselines中要执行以下操作
1.执行SQL语句并找到其SQL ID
SQL>SELECT/*LOAD_STS*/*2FROMsh.sales3WHEREquantity_sold>404ORDERBYprod_id;norowsselectedSQL>SELECTSQL_ID,CHILD_NUMBERAS"ChildNum",2PLAN_HASH_VALUEAS"PlanHash",3OPTIMIZER_ENV_HASH_VALUEAS"OptEnvHash"4FROMV$SQL5WHERESQL_TEXTLIKE'SELECT/*LOAD_STS*/%';SQL_IDChildNumPlanHashOptEnvHash---------------------------------------------bma11r5a6r26j038034075504099961812
2.将执行的SQL语句加载到SQL Tuning Set中
SQL>execdbms_sqltune.create_sqlset(sqlset_name=>'sql_tuning_set');PL/SQLproceduresuccessfullycompleted.SQL>DECLARE2curDBMS_SQLTUNE.SQLSET_CURSOR;3BEGIN4OPENcurFOR5SELECTVALUE(P)6FROMtable(DBMS_SQLTUNE.SELECT_CURSOR_CACHE('sql_id=''bma11r5a6r26j''',7NULL,8NULL,9NULL,10NULL,111,12NULL,13'ALL'))P;14DBMS_SQLTUNE.LOAD_SQLSET(sqlset_name=>'sql_tuning_set',15populate_cursor=>cur);16END;17/PL/SQLproceduresuccessfullycompleted.SQL>SELECTSQL_TEXTFROMDBA_SQLSET_STATEMENTSWHERESQLSET_NAME='sql_tuning_set';SQL_TEXT--------------------SELECT/*LOAD_STS*/*FROMsh.salesWHEREquantity_sold>40ORDERBYprod_id
3.从SQL Tuning Set中加载执行计划到SQL Plan Baseline中
SQL>VARIABLEv_plan_cntNUMBERSQL>EXECUTE:v_plan_cnt:=DBMS_SPM.LOAD_PLANS_FROM_SQLSET(sqlset_name=>'sql_tuning_set',basic_filter=>'sql_textlike''SELECT/*LOAD_STS*/%''');PL/SQLproceduresuccessfullycompleted.
basic_filter参数指定了一个where子句用来只加载需要的SQL语句,v_plan_cnt用来存储从SQL Tuning Set所加载的执行计划数。
4.查询数据字典来确保SQL Tuning Set中的语句的执行计划是否成功加载到SQL Plan Baselines中
SQL>SELECTSQL_HANDLE,SQL_TEXT,PLAN_NAME,2ORIGIN,ENABLED,ACCEPTED3FROMDBA_SQL_PLAN_BASELINESWHERESQL_TEXTLIKE'%LOAD_STS%';SQL_HANDLESQL_TEXTPLAN_NAMEORIGINENAACC------------------------------------------------------------------------------------------------SQL_a8632bd857a4a25eSELECT/*LOAD_STS*/SQL_PLAN_ahstbv1bu98ky54bc8843MANUAL-LOAD-FROM-STSYESYES*FROMsh.salesWHEREquantity_sold>40ORDERBYprod_id
5.删除SQL Tuning Set
SQL>execdbms_sqltune.drop_sqlset(sqlset_name=>'sql_tuning_set');PL/SQLproceduresuccessfullycompleted.
从Staging Table中加载执行计划
有时可能需要从一个源数据库传输最优化的执行计划到一个目标数据库那么需要执行以下操作
1.使用create_stgtab_baseline过程来创建一个staging表
SQL>BEGIN2DBMS_SPM.CREATE_STGTAB_BASELINE(3table_name=>'stage1');4END;5/PL/SQLproceduresuccessfullycompleted.
2.在源数据库中,将SQL Plan Baseline从SQL管理基础框架中打包到staging表中
DECLAREv_plan_cntNUMBER;BEGINv_plan_cnt:=DBMS_SPM.PACK_STGTAB_BASELINE(table_name=>'stage1',enabled=>'yes',creator=>'spm');END;/
3.将staging表stage1使用Oracle Data Pump Export导出到一个dump文件中
4.将dump文件传输到目标数据库
5.在目标数据库中,使用Oracle Data Pump Import将dump文件中的数据导入到staging表stage1中
6.在目标数据库中,将SQL Plan Baseline从staging表中解压到SQL管理基础框架中
DECLAREv_plan_cntNUMBER;BEGINv_plan_cnt:=DBMS_SPM.UNPACK_STGTAB_BASELINE(table_name=>'stage1',fixed=>'yes');END;/
SQL Plan baselines Evolve
这里将介绍如何使用命令行来evolve sql plan baselines。为了evolve一个特定的sql执行计划执行以下操作:
1.创建一个evolve任务
2.设置evolve任务参数
3.执行evolve任务
4.实现任务中给出的建议
5.显示任务执行的结果
下面将举例来说明,假设满足以下条件
.数据库没有启用自动evolve任务
.对下面的查询创建一个SQL Plan Baseline
SELECT/*q2_group_by*/prod_name,sum(quantity_sold)FROMproductsp,salessWHEREp.prod_id=s.prod_idANDp.prod_category_id=204GROUPBYprod_name;
.想要创建两个索引来提高查询语句的性能,如果使用索引的性能比SQL Plan Baseline中的当前执行计划的性能好那么就evolve该执行计划
为了evolve一个特定的执行计划需要执行以下操作
1.执行初始化设置操作
清空共享池与缓冲区缓存
SQL>ALTERSYSTEMFLUSHSHARED_POOL;Systemaltered.SQL>ALTERSYSTEMFLUSHBUFFER_CACHE;Systemaltered.
启用自动捕获SQL Plan Baselines
SQL>ALTERSYSTEMSETOPTIMIZER_CAPTURE_SQL_PLAN_BASELINES=true;Systemaltered.SQL>showparametersql_planNAMETYPEVALUE-----------------------------------------------------------------------------optimizer_capture_sql_plan_baselinesbooleanTRUEoptimizer_use_sql_plan_baselinesbooleanTRUE
以sh用户登录到数据库,然后设置SQLPLUS的显示参数
[oracle@jytest1~]$sqlplussh/sh@jypdbSQL*Plus:Release12.2.0.1.0ProductiononThuFeb1423:30:092019Copyright(c)1982,2016,Oracle.Allrightsreserved.LastSuccessfullogintime:ThuFeb14201923:01:23+08:00Connectedto:OracleDatabase12cEnterpriseEditionRelease12.2.0.1.0-64bitProductionSQL>SETPAGES10000LINES140SQL>SETSERVEROUTPUTONSQL>COLSQL_TEXTFORMATA20SQL>COLSQL_HANDLEFORMATA20SQL>COLPLAN_NAMEFORMATA30SQL>COLORIGINFORMATA12SQL>SETLONGC60535SQL>SETLONG60535SQL>SETECHOON
2.执行SQL语句,因此可以自动捕获它
执行下面的SQL语句
SQL>SELECT/*q1_group_by*/prod_name,sum(quantity_sold)2FROMproductsp,saless3WHEREp.prod_id=s.prod_id4ANDp.prod_category_id=2035GROUPBYprod_name;PROD_NAMESUM(QUANTITY_SOLD)--------------------------------------------------------------------EnvoyExternal6XCD-ROM11526ModelSM26273BlackInkCartridge15910PCMCIAmodem/fax28800baud19278Multimediaspeakers-3"cones10969Internal8XCD-ROM11197DeluxeMouse11609ModelCD13272TricolorInkCartridge12321ModelNM500XHighYieldTonerCartridge646618"FlatPanelGraphicsMonitor4415External8XCD-ROM13886SIMM-8MBPCMCIAIIcard17544PCMCIAmodem/fax19200baud20467EnvoyExternal8XCD-ROM14850EnvoyExternalKeyboard2857External6XCD-ROM11732ModelA3827HBlackImageCartridge17314Internal6XCD-ROM853317"LCDw/built-inHDTVTuner4874SIMM-16MBPCMCIAIIcard14191Multimediaspeakers-5"cones10419StandardMouse871421rowsselected.
查询数据字典确认在SQL Plan Baseline中不存在执行计划,因为只有重复执行的SQL语句才会被捕获
SQL>SELECTSQL_HANDLE,SQL_TEXT,PLAN_NAME,ORIGIN,ENABLED,2ACCEPTED,FIXED,AUTOPURGE3FROMDBA_SQL_PLAN_BASELINES4WHERESQL_TEXTLIKE'%q1_group%';norowsselected
再次执行SQL语句
SQL>SELECT/*q1_group_by*/prod_name,sum(quantity_sold)2FROMproductsp,saless3WHEREp.prod_id=s.prod_id4ANDp.prod_category_id=2035GROUPBYprod_name;PROD_NAMESUM(QUANTITY_SOLD)--------------------------------------------------------------------EnvoyExternal6XCD-ROM11526ModelSM26273BlackInkCartridge15910PCMCIAmodem/fax28800baud19278Multimediaspeakers-3"cones10969Internal8XCD-ROM11197DeluxeMouse11609ModelCD13272TricolorInkCartridge12321ModelNM500XHighYieldTonerCartridge646618"FlatPanelGraphicsMonitor4415External8XCD-ROM13886SIMM-8MBPCMCIAIIcard17544PCMCIAmodem/fax19200baud20467EnvoyExternal8XCD-ROM14850EnvoyExternalKeyboard2857External6XCD-ROM11732ModelA3827HBlackImageCartridge17314Internal6XCD-ROM853317"LCDw/built-inHDTVTuner4874SIMM-16MBPCMCIAIIcard14191Multimediaspeakers-5"cones10419StandardMouse871421rowsselected.
3.查询数据字典来确保执行计划已经被加载到SQL Plan Baseline中了,下面的查询显示执行计划已经被接受,这意味着执行计划已经存储在SQL Plan Baselines中了。origin列显示为AUTO-CAPTURE,这意味着执行计划是被自动捕获的
SQL>SELECTSQL_HANDLE,SQL_TEXT,PLAN_NAME,2ORIGIN,ENABLED,ACCEPTED,FIXED3FROMDBA_SQL_PLAN_BASELINES4WHERESQL_TEXTLIKE'%q1_group%';SQL_HANDLESQL_TEXTPLAN_NAMEORIGINENAACCFIX-------------------------------------------------------------------------------------------SQL_07f16c76ff893342SELECT/*q1_group_bSQL_PLAN_0gwbcfvzskcu242949306AUTO-CAPTUREYESYESNOy*/prod_name,sum(quantity_sold)FROMproductsp,salessWHEREp.prod_id=s.prod_idANDp.prod_category_id=203GROUPBYprod_name
4.下面对SQL语句进行解析并验证优化器是否会使用SQL Plan Baseline中的执行计划
SQL>EXPLAINPLANFOR2SELECT/*q1_group_by*/prod_name,sum(quantity_sold)3FROMproductsp,saless4WHEREp.prod_id=s.prod_id5ANDp.prod_category_id=2036GROUPBYprod_name;Explained.SQL>SELECT*FROMTABLE(DBMS_XPLAN.DISPLAY(null,null,'basic+note'));PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------------------------------------------------------------------Planhashvalue:3535171836------------------------------------------|Id|Operation|Name|------------------------------------------|0|SELECTSTATEMENT|||1|HASHGROUPBY|||2|HASHJOIN|||3|TABLEACCESSFULL|PRODUCTS||4|PARTITIONRANGEALL|||5|TABLEACCESSFULL|SALES|------------------------------------------Note------SQLplanbaseline"SQL_PLAN_0gwbcfvzskcu242949306"usedforthisstatement16rowsselected.
从执行计划的Note部分可以看到SQL Plan Baseline已经应用到这个SQL语句了
5.创建两个索引用来提高上面SQL语句的性能
SQL>CREATEINDEXind_prod_cat_nameONproducts(prod_category_id,prod_name,prod_id);Indexcreated.SQL>CREATEINDEXind_sales_prod_qty_soldONsales(prod_id,quantity_sold);Indexcreated.
6.再次执行SQL语句,因为启用了自动捕获功能,所以新的执行计划会被加载到SQL Plan Baseline中
SQL>SELECT/*q1_group_by*/prod_name,sum(quantity_sold)2FROMproductsp,saless3WHEREp.prod_id=s.prod_id4ANDp.prod_category_id=2035GROUPBYprod_name;PROD_NAMESUM(QUANTITY_SOLD)--------------------------------------------------------------------EnvoyExternal6XCD-ROM11526ModelSM26273BlackInkCartridge15910PCMCIAmodem/fax28800baud19278Multimediaspeakers-3"cones10969Internal8XCD-ROM11197DeluxeMouse11609ModelCD13272TricolorInkCartridge12321ModelNM500XHighYieldTonerCartridge646618"FlatPanelGraphicsMonitor4415External8XCD-ROM13886SIMM-8MBPCMCIAIIcard17544PCMCIAmodem/fax19200baud20467EnvoyExternal8XCD-ROM14850EnvoyExternalKeyboard2857External6XCD-ROM11732ModelA3827HBlackImageCartridge17314Internal6XCD-ROM853317"LCDw/built-inHDTVTuner4874SIMM-16MBPCMCIAIIcard14191Multimediaspeakers-5"cones10419StandardMouse871421rowsselected.
7.查询数据字典来确保新的执行计划被加载到SQL Plan Baseline中了
SQL>SELECTSQL_HANDLE,SQL_TEXT,PLAN_NAME,ORIGIN,ENABLED,ACCEPTED2FROMDBA_SQL_PLAN_BASELINES3WHERESQL_HANDLEIN('SQL_07f16c76ff893342')4ORDERBYSQL_HANDLE,ACCEPTED;SQL_HANDLESQL_TEXTPLAN_NAMEORIGINENAACC----------------------------------------------------------------------------------------SQL_07f16c76ff893342SELECT/*q1_group_bSQL_PLAN_0gwbcfvzskcu20135fd6cAUTO-CAPTUREYESNOy*/prod_name,sum(quantity_sold)FROMproductsp,salessWHEREp.prod_id=s.prod_idANDp.prod_category_id=203GROUPBYprod_nameSQL_07f16c76ff893342SELECT/*q1_group_bSQL_PLAN_0gwbcfvzskcu242949306AUTO-CAPTUREYESYESy*/prod_name,sum(quantity_sold)FROMproductsp,salessWHEREp.prod_id=s.prod_idANDp.prod_category_id=203GROUPBYprod_name
上面的查询结果显示新的执行计划是为被接受的。
8.再次解析SQL语句并验证优化器是不是使用原始没有索引的执行计划
SQL>EXPLAINPLANFOR2SELECT/*q1_group_by*/prod_name,sum(quantity_sold)3FROMproductsp,saless4WHEREp.prod_id=s.prod_id5ANDp.prod_category_id=2036GROUPBYprod_name;Explained.SQL>SELECT*FROMTABLE(DBMS_XPLAN.DISPLAY(null,null,'basic+note'));PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------------------------------------------------------------------Planhashvalue:3535171836------------------------------------------|Id|Operation|Name|------------------------------------------|0|SELECTSTATEMENT|||1|HASHGROUPBY|||2|HASHJOIN|||3|TABLEACCESSFULL|PRODUCTS||4|PARTITIONRANGEALL|||5|TABLEACCESSFULL|SALES|------------------------------------------Note------SQLplanbaseline"SQL_PLAN_0gwbcfvzskcu242949306"usedforthisstatement16rowsselected.
上面的Note部分指示优化器使用了原始的没有索引的执行计划
9.以管理员用户登录数据库,然后创建一个evolve任务它包含未被接受执行计划相关的所有SQL语句
[oracle@jytest1~]$sqlplussys/xxzx7817600@jypdbassysdbaSQL*Plus:Release12.2.0.1.0ProductiononThuFeb1423:48:512019Copyright(c)1982,2016,Oracle.Allrightsreserved.Connectedto:OracleDatabase12cEnterpriseEditionRelease12.2.0.1.0-64bitProductionSQL>VARIABLEcntNUMBERSQL>VARIABLEtk_nameVARCHAR2(50)SQL>VARIABLEexe_nameVARCHAR2(50)SQL>VARIABLEevol_outCLOBSQL>EXECUTE:tk_name:=DBMS_SPM.CREATE_EVOLVE_TASK(sql_handle=>'SQL_07f16c76ff893342',plan_name=>'SQL_PLAN_0gwbcfvzskcu20135fd6c');PL/SQLproceduresuccessfullycompleted.SQL>SELECT:tk_nameFROMDUAL;:TK_NAME--------------------------------------------------------------------------------------------------------------------------------TASK_11
10.执行evolve任务
SQL>EXECUTE:exe_name:=DBMS_SPM.EXECUTE_EVOLVE_TASK(task_name=>:tk_name);PL/SQLproceduresuccessfullycompleted.SQL>SELECT:exe_nameFROMDUAL;:EXE_NAME---------------------------------------------------------------------------EXEC_1
11.查看报告
EXECUTE:evol_out:=DBMS_SPM.REPORT_EVOLVE_TASK(task_name=>:tk_name,execution_name=>:exe_name);SELECT:evol_outFROMDUAL;GENERALINFORMATIONSECTION--------------------------------------------------------------------------TaskInformation:---------------------------------------------TaskName:TASK_11TaskOwner:SYSExecutionName:EXEC_1ExecutionType:SPMEVOLVEScope:COMPREHENSIVEStatus:COMPLETEDStarted:02/15/201917:49:32Finished:02/15/201917:49:35LastUpdated:02/15/201917:49:35GlobalTimeLimit:2147483646Per-PlanTimeLimit:UNUSEDNumberofErrors:0---------------------------------------------------------------------------SUMMARYSECTION---------------------------------------------------------------------------Numberofplansprocessed:1Numberoffindings:1Numberofrecommendations:1Numberoferrors:0---------------------------------------------------------------------------DETAILSSECTION---------------------------------------------------------------------------ObjectID:2TestPlanName:SQL_PLAN_0gwbcfvzskcu20135fd6cBasePlanName:SQL_PLAN_0gwbcfvzskcu242949306SQLHandle:SQL_07f16c76ff893342ParsingSchema:SHTestPlanCreator:SHSQLText:SELECT/*q1_group_by*/prod_name,sum(quantity_sold)FROMproductsp,salessWHEREp.prod_id=s.prod_idANDp.prod_category_id=203GROUPBYprod_nameExecutionStatistics:-----------------------------BasePlanTestPlan----------------------------------------------------ElapsedTime(s):.044336.012649CPUTime(s):.044003.012445BufferGets:36099OptimizerCost:924891DiskReads:34182DirectWrites:00RowsProcessed:42Executions:59FINDINGSSECTION---------------------------------------------------------------------------Findings(1):-----------------------------1.Theplanwasverifiedin2.18seconds.Itpassedthebenefitcriterionbecauseitsverifiedperformancewas2.01timesbetterthanthatofthebaselineplan.Recommendation:-----------------------------Consideracceptingtheplan.Executedbms_spm.accept_sql_plan_baseline(task_name=>'TASK_11',object_id=>2,task_owner=>'SYS');EXPLAINPLANSSECTION---------------------------------------------------------------------------BaselinePlan-----------------------------PlanId:1PlanHashValue:1117033222---------------------------------------------------------------------------|Id|Operation|Name|Rows|Bytes|Cost|Time|---------------------------------------------------------------------------|0|SELECTSTATEMENT||21|861|924|00:00:12||1|HASHGROUPBY||21|861|924|00:00:12||*2|HASHJOIN||267996|10987836|742|00:00:09||*3|TABLEACCESSFULL|PRODUCTS|21|714|2|00:00:01||4|PARTITIONRANGEALL||918843|6431901|662|00:00:08||5|TABLEACCESSFULL|SALES|918843|6431901|662|00:00:08|---------------------------------------------------------------------------PredicateInformation(identifiedbyoperationid):------------------------------------------*2-access("P"."PROD_ID"="S"."PROD_ID")*3-filter("P"."PROD_CATEGORY_ID"=203)TestPlan-----------------------------PlanId:2PlanHashValue:20315500---------------------------------------------------------------------------|Id|Operation|Name|Rows|Bytes|Cost|Time|---------------------------------------------------------------------------|0|SELECTSTATEMENT||21|861|891|00:00:11||1|SORTGROUPBYNOSORT||21|861|891|00:00:11||2|NESTEDLOOPS||267996|10987836|891|00:00:11||*3|INDEXRANGESCAN|IND_PROD_CAT_NAME|21|714|1|00:00:01||*4|INDEXRANGESCAN|IND_SALES_PROD_QTY|12762|89334|42|00:00:01|---------------------------------------------------------------------------PredicateInformation(identifiedbyoperationid):------------------------------------------*3-access("P"."PROD_CATEGORY_ID"=203)*4-access("P"."PROD_ID"="S"."PROD_ID")
报告显示使用两个索引的执行计划比原始执行计划性能更好
12.实现evolve任务所给出的建议
SQL>EXECUTE:cnt:=DBMS_SPM.IMPLEMENT_EVOLVE_TASK(task_name=>:tk_name,execution_name=>:exe_name);PL/SQLproceduresuccessfullycompleted.
13.查询数据字典来确保新的执行计划已经是接受状态
SQL>SELECTSQL_HANDLE,SQL_TEXT,PLAN_NAME,ORIGIN,ENABLED,ACCEPTED2FROMDBA_SQL_PLAN_BASELINES3WHERESQL_HANDLEIN('SQL_07f16c76ff893342')4ORDERBYSQL_HANDLE,ACCEPTED;SQL_HANDLESQL_TEXTPLAN_NAMEORIGINENAACC------------------------------------------------------------------------------------------------SQL_07f16c76ff893342SELECT/*q1_group_bSQL_PLAN_0gwbcfvzskcu242949306AUTO-CAPTUREYESYESy*/prod_name,sum(quantity_sold)FROMproductsp,salessWHEREp.prod_id=s.prod_idANDp.prod_category_id=203GROUPBYprod_nameSQL_HANDLESQL_TEXTPLAN_NAMEORIGINENAACC------------------------------------------------------------------------------------------------SQL_07f16c76ff893342SELECT/*q1_group_bSQL_PLAN_0gwbcfvzskcu2ae9b4305AUTO-CAPTUREYESYESy*/prod_name,sum(quantity_sold)FROMproductsp,salessWHEREp.prod_id=s.prod_idANDp.prod_category_id=203GROUPBYprod_name
14.执行清除操作
SQL>VARIABLEcntNUMBERSQL>EXEC:cnt:=DBMS_SPM.DROP_SQL_PLAN_BASELINE('SQL_07f16c76ff893342');PL/SQLproceduresuccessfullycompleted.SQL>DELETEFROMSQLLOG$;13rowsdeleted.SQL>commit;Commitcomplete.SQL>DROPINDEXIND_SALES_PROD_QTY_SOLD;Indexdropped.SQL>DROPINDEXIND_PROD_CAT_NAME;Indexdropped.
删除SQL Plan Baselines
可以从SQL Plan Baselines中删除一些或所有执行计划。
SQL>SELECTSQL_HANDLE,SQL_TEXT,PLAN_NAME,2ORIGIN,ENABLED,ACCEPTED3FROMDBA_SQL_PLAN_BASELINESWHERESQL_TEXTLIKE'%q3_group_by%';SQL_HANDLESQL_TEXTPLAN_NAMEORIGINENAACC------------------------------------------------------------------------------------------------SQL_50c02f29322b0d02SELECTSQL_HANDLE,SSQL_PLAN_51h2g54t2q38276fe3bd1AUTO-CAPTUREYESYESQL_TEXT,PLAN_NAME,ORIGIN,ENABLED,ACCEPTEDFROMDBA_SQL_PLAN_BASELINESWHERESQL_TEXTLIKE'%q3_group_by%'SQL_6d39c79190585ca9SELECT/*q3_group_bSQL_PLAN_6uff7k685hr5942949306AUTO-CAPTUREYESYESy*/prod_name,sum(quantity_sold)FROMproductsp,salessWHEREp.prod_id=s.prod_idANDp.prod_category_id=205GROUPBYprod_nameSQL_6d39c79190585ca9SELECT/*q3_group_bSQL_PLAN_6uff7k685hr59ae9b4305AUTO-CAPTUREYESNOy*/prod_name,sum(quantity_sold)FROMproductsp,salessWHEREp.prod_id=s.prod_idANDp.prod_category_id=205GROUPBYprod_nameSQL>DECLARE2v_dropped_plansnumber;3BEGIN4v_dropped_plans:=DBMS_SPM.DROP_SQL_PLAN_BASELINE(sql_handle=>'SQL_6d39c79190585ca9');5DBMS_OUTPUT.PUT_LINE('dropped'||v_dropped_plans||'plans');6END;7/PL/SQLproceduresuccessfullycompleted.SQL>SELECTSQL_HANDLE,SQL_TEXT,PLAN_NAME,2ORIGIN,ENABLED,ACCEPTED3FROMDBA_SQL_PLAN_BASELINESWHERESQL_HANDLE='SQL_6d39c79190585ca9';norowsselected
管理SQL Management Base
SQL Management Base是数据字典的一部分,它存储在SYSAUX表空间中。它存储语句日志,执行计划历史记录,SQL执行计划基线与SQL Profiles。使用dbms_spm.configure过程可以对SMB进行选项设置与维护SQL Plan Baselines。dba_sql_management_config视图可以用来查看SMB的当前配置信息。下面介绍parameter_name列可以设置的参数列表:
space_budget_percent:SQL Management Base可以使用的SYSAUX表空间的最大百分比。缺省值是10%。允许的范围是1%到50%。
plan_retention_weeks:在清除之前没有被使用的执行计划需要保留多少周,缺省值是53。
auto_capture_parsing_schema_name:它是(% LIKE a OR % LIKE b ...) AND (%NOT LIKE c AND % NOT LIKE d ...)形式的列表,它代表了解析方案名过滤。
auto_capture_module:它是(% LIKE a OR % LIKE b ...) AND (%NOT LIKE c AND % NOT LIKE d ...)形式的列表,它代表了模块过滤。
auto_capture_action:它是(% LIKE a OR % LIKE b ...) AND (%NOT LIKE c AND % NOT LIKE d ...)形式的列表,它代表了操作过滤。
auto_capture_sql_text:它是(% LIKE a OR % LIKE b ...) AND (%NOT LIKE c AND % NOT LIKE d ...)形式的列表,它代表了SQL文本过滤。
修改SMB空间使用限制
一个由SMB所调用的每周运行一次的后台进程将会检测空间使用情况。当超过定义限制时,后台进程将会写一个告警信息到alert日志文件中。数据库会每周生成一个告警信息直到SMB空间限制被增加为止,SYSAUX表空间被增加为止或者通过清除SQL Management对象(sql plan baselines或sql profiles)来减少SMB所使用的空间为止。
1.查看当前SMB所用空间的限制大小,从查询结果可以看到当前大小是SYSAUX表空间大小的10%
SQL>colparameter_namefora30SQL>col%_LIMITfora20SQL>SELECTPARAMETER_NAME,PARAMETER_VALUEAS"%_LIMIT",2(SELECTsum(bytes/1024/1024)FROMDBA_DATA_FILES3WHERETABLESPACE_NAME='SYSAUX')ASSYSAUX_SIZE_IN_MB,4PARAMETER_VALUE/100*5(SELECTsum(bytes/1024/1024)FROMDBA_DATA_FILES6WHERETABLESPACE_NAME='SYSAUX')AS"CURRENT_LIMIT_IN_MB"7FROMDBA_SQL_MANAGEMENT_CONFIG8WHEREPARAMETER_NAME='SPACE_BUDGET_PERCENT';PARAMETER_NAME%_LIMITSYSAUX_SIZE_IN_MBCURRENT_LIMIT_IN_MB--------------------------------------------------------------------------------------SPACE_BUDGET_PERCENT101260126
2.将SMB所用空间限制大小修改为SYSAUX表空间大小的30%
SQL>EXECUTEDBMS_SPM.CONFIGURE('space_budget_percent',30);PL/SQLproceduresuccessfullycompleted.
3.确认SMB所有空间限制大小是否成功被修改为SYSAUX表空间大小的30%
SQL>SELECTPARAMETER_NAME,PARAMETER_VALUEAS"%_LIMIT",2(SELECTsum(bytes/1024/1024)FROMDBA_DATA_FILES3WHERETABLESPACE_NAME='SYSAUX')ASSYSAUX_SIZE_IN_MB,4PARAMETER_VALUE/100*5(SELECTsum(bytes/1024/1024)FROMDBA_DATA_FILES6WHERETABLESPACE_NAME='SYSAUX')AS"CURRENT_LIMIT_IN_MB"7FROMDBA_SQL_MANAGEMENT_CONFIG8WHEREPARAMETER_NAME='SPACE_BUDGET_PERCENT';PARAMETER_NAME%_LIMITSYSAUX_SIZE_IN_MBCURRENT_LIMIT_IN_MB--------------------------------------------------------------------------------------SPACE_BUDGET_PERCENT301260378
修改SMB中的Plan Retention Policy
每周调度清除任务来管理由SQL Plan Management所使用的空间。这个任务是一个在维护窗口内自动执行的任务。数据库会自动清除超过Plan Retention期限而没有被使用的执行计划,它是执行计划存储在SMB中的last_executed字段来标识的。缺生活上的执行计划保留周期是53周。这个周期可以设置的范围是5到523周。
1.查看当前执行计划保留周期
SQL>SELECTPARAMETER_NAME,PARAMETER_VALUE2FROMDBA_SQL_MANAGEMENT_CONFIG3WHEREPARAMETER_NAME='PLAN_RETENTION_WEEKS';PARAMETER_NAMEPARAMETER_----------------------------------------PLAN_RETENTION_WEEKS53
2.修改执行计划保留周期为105周
SQL>EXECUTEDBMS_SPM.CONFIGURE('plan_retention_weeks',105);PL/SQLproceduresuccessfullycompleted.
3.确保执行计划保留周期是否成功被修改为105周
SQL>SELECTPARAMETER_NAME,PARAMETER_VALUE2FROMDBA_SQL_MANAGEMENT_CONFIG3WHEREPARAMETER_NAME='PLAN_RETENTION_WEEKS';PARAMETER_NAMEPARAMETER_----------------------------------------PLAN_RETENTION_WEEKS105
“SQL执行计划管理可以分为哪些基本任务”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。