SQL调优指南笔记18:Analyzing Statistics Using Optimizer Statistics Advisor

Posted dingdingfish

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL调优指南笔记18:Analyzing Statistics Using Optimizer Statistics Advisor相关的知识,希望对你有一定的参考价值。

本文为SQL Tuning Guide第18章“Analyzing Statistics Using Optimizer Statistics Advisor”的笔记。

Optimizer Statistics Advisor 分析如何收集优化器统计信息,然后提出建议。

18.1 About Optimizer Statistics Advisor

Optimizer Statistics Advisor 是一种内置诊断软件,可分析统计数据和与统计数据相关的任务的质量。

顾问任务在维护窗口中自动运行,但您也可以按需运行。 然后您可以查看顾问报告。 如果顾问提出建议,那么在某些情况下,您可以运行系统生成的脚本来实施它们。

下图提供了 Optimizer Statistics Advisor 的概念性概述。

18.1.1 Purpose of Optimizer Statistics Advisor

Optimizer Statistics Advisor 检查优化器统计信息的收集方式。

该顾问会自动诊断现有收集统计数据实践中的问题。 顾问程序不会收集新的或替代的优化器统计数据集。 顾问的输出是一份调查结果和建议报告,可帮助您遵循收集统计数据的最佳实践。

优化器统计信息在确定查询的执行计划方面发挥着重要作用。 因此,优化器收集和维护准确和最新的统计数据至关重要。 为此,优化器提供了 DBMS_STATS 包,该包从一个版本演变到另一个版本。 通常,用户会根据特定的工作负载制定自己的收集统计数据的策略,然后使用本地脚本来实施这些策略。

18.1.1.1 Problems with a Traditional Script-Based Approach

脚本化方法的优点是脚本通常经过测试和审查。但是,次优遗留脚本的所有者可能不会更改它们,因为担心会导致计划更改。

传统方法存在以下问题:

  • 旧版脚本可能无法跟上新的最佳实践,新的最佳实践可能会因版本而异。
    通常,后续版本会增强直方图、采样、工作负载监控、并发性和其他与优化器相关的功能。例如,从 Oracle Database 12c 开始,Oracle 建议设置 AUTO_SAMPLE_SIZE 而不是百分比。但是,遗留脚本通常会指定采样百分比,这可能会导致执行计划不理想。
  • 资源浪费在不必要的统计数据收集上。
    一个脚本可能每天在同一个表上多次收集统计信息。
  • 自动统计收集作业不保证准确和最新的统计。
    例如,有时自动统计收集作业没有运行,因为初始化参数组合禁用它,或者作业终止。此外,有时由于资源限制,或者因为太多的对象需要统计收集,自动作业维护窗口不足。在收集所有统计信息之前停止运行的作业会导致某些对象没有统计信息或过时的统计信息,这反过来又会导致计划不理想。
  • 统计数据有时可能会丢失、过时或不正确。
    例如,表和它的索引之间的统计信息可能不一致,或者具有主键-外键关系的表之间的统计信息可能不一致。或者,统计数据收集作业可能已被意外禁用,或者您可能不知道脚本已失败。
  • 缺乏对问题的了解可能会耗费大量时间和资源。
    例如,服务请求可能会寻求问题的解决方案,而没有意识到问题是由次优统计引起的。诊断可能需要大量时间通过电子邮件发送问题查询的脚本、启用跟踪和调查跟踪。
  • 推荐的修复可能不可行。
    性能工程师可能会建议更改维护统计信息的应用程序代码。在某些组织中,这一要求可能很难或不可能满足。

18.1.1.2 Advantages of Optimizer Statistics Advisor

与传统方法相比,基于顾问的方法提供了更好的可扩展性和可维护性。

如果新版本中的最佳实践发生变化,那么 Optimizer Statistics Advisor 会将这些实践编码到其规则中。 通过这种方式,顾问始终提供最新的建议。

该顾问分析您当前收集统计信息的方式(使用手动脚本、显式设置参数等)、现有统计信息收集作业的有效性以及所收集统计信息的质量。 Optimizer Statistics Advisor 不会收集新的或替代的优化器统计数据集,因此不会影响工作负载。 相反,Optimizer Statistics Advisor 分析存储在数据字典中的信息,然后将结果和建议存储在数据库中。

Optimizer Statistics Advisor 与传统方法相比具有以下优势:

  • 提供易于理解的报告
    顾问应用规则来生成结果、建议和操作。
  • 提供脚本以实现必要的修复,而无需更改应用程序代码
    当您实施建议的操作时,每次执行改进的语句都会受益。例如,如果您设置全局首选项,以便样本大小为 AUTO_SAMPLE_SIZE 而不是次优百分比,则每个基于改进的统计数据的计划都可以从此更改中受益。
  • 在维护窗口中每天运行一次名为 AUTO_STATS_ADVISOR_TASK 的预定义任务
    要运行自动化作业,必须将 STATISTICS_LEVEL 初始化参数设置为 TYPICAL 或 ALL。
  • 在 DBMS_STATS 包中提供 API,使您能够手动创建和运行任务,在数据字典视图中存储发现和建议,为任务生成报告,并在必要时实施更正
  • 与现有工具集成
    该顾问与 SQL Tuning Advisor 和 AWR 集成,后者汇总了 Optimizer Statistics Advisor 结果。

18.1.2 Optimizer Statistics Advisor Concepts

优化器统计顾问使用与自动数据库诊断监视器 (ADDM)、SQL 性能分析器和其他顾问相同的顾问框架。

18.1.2.1 Components of Optimizer Statistics Advisor

Optimizer Statistics Advisor 框架将其元数据存储在数据字典和动态性能视图中。

以下维恩图显示了 Optimizer Statistics Advisor 的规则、结果、建议和操作之间的关系。 例如,所有发现都源自规则,但并非所有规则都生成发现。

18.1.2.1.1 Rules for Optimizer Statistics Advisor

Optimizer Statistics Advisor 规则是 Oracle 提供的标准,Optimizer Statistics Advisor 通过该标准执行其检查。

这些规则体现了基于当前功能集的 Oracle 最佳实践。如果最佳实践因版本而异,那么 Optimizer Statistics Advisor 规则也会发生变化。

顾问将规则分为以下几类:

  • System
    此类检查统计信息收集的首选项、自动统计信息收集作业的状态、SQL 计划指令的使用等。此类中的规则在 V$STATS_ADVISOR_RULES.RULE_TYPE 中具有值 SYSTEM。

  • Operation
    此类检查统计信息收集是否使用默认值,是否使用 SET_*_STATS 过程创建测试统计信息,等等。此类中的规则在 V$STATS_ADVISOR_RULES.RULE_TYPE 中具有值 OPERATION。

  • Object
    此类检查统计信息的质量、统计信息的陈旧性、不必要的统计信息收集等。此类中的规则在 V$STATS_ADVISOR_RULES.RULE_TYPE 中具有值 OBJECT。

规则检查以下问题:

  • 如何收集统计数据
    例如,一条规则可能会为初始化参数指定推荐设置。 另一个规则可能指定应在模式级别收集统计信息。

  • 何时收集统计信息
    例如,顾问可能建议应该启用自动统计收集作业的维护窗口,或者应该延长窗口。

  • 如何提高统计收集的效率
    例如,一条规则可能指定在 DBMS_STATS 中应使用默认参数,或者不应手动设置统计信息。

在 V$STATS_ADVISOR_RULES 中,每个规则都有一个唯一的字符串 ID,可用于 DBMS_STATS 过程和报告。 您可以使用规则过滤器来指定 Optimizer Statistics Advisor 应检查的规则。 但是,您不能编写新规则。

以下查询带有示例输出,列出了 V$STATS_ADVISOR_RULES 中的规则子集。 规则可能会因版本而异。

SET LINESIZE 208
SET PAGESIZE 100
COL ID FORMAT 99
COL NAME FORMAT a33
COL DESCRIPTION FORMAT a62

SELECT RULE_ID AS ID, NAME, RULE_TYPE, DESCRIPTION 
FROM   V$STATS_ADVISOR_RULES 
WHERE  RULE_ID BETWEEN 1 AND 12
ORDER BY RULE_ID;

 ID NAME                              RULE_TYPE DESCRIPTION                                                   
--- --------------------------------- --------- --------------------------------------------------------------
  1 UseAutoJob                        SYSTEM    Use Auto Job for Statistics Collection                        
  2 CompleteAutoJob                   SYSTEM    Auto Statistics Gather Job should complete successfully       
  3 MaintainStatsHistory              SYSTEM    Maintain Statistics History                                   
  4 UseConcurrent                     SYSTEM    Use Concurrent preference for Statistics Collection           
  5 UseDefaultPreference              SYSTEM    Use Default Preference for Stats Collection                   
  6 TurnOnSQLPlanDirective            SYSTEM    SQL Plan Directives should not be disabled                    
  7 AvoidSetProcedures                OPERATION Avoid Set Statistics Procedures                               
  8 UseDefaultParams                  OPERATION Use Default Parameters in Statistics Collection Procedures    
  9 UseGatherSchemaStats              OPERATION Use gather_schema_stats procedure                             
 10 AvoidInefficientStatsOprSeq       OPERATION Avoid inefficient statistics operation sequences              
 11 AvoidUnnecessaryStatsCollection   OBJECT    Avoid unnecessary statistics collection                       
 12 AvoidStaleStats                   OBJECT    Avoid objects with stale or no statistics                     

12 rows selected. 
18.1.2.1.2 Findings for Optimizer Statistics Advisor

当 Optimizer Statistics Advisor 检查存储在数据库中的证据并得出未遵循规则的结论时,会得出一个结果。

为了生成结果,Optimizer Statistics Advisor 执行一个任务,该任务可以自动或手动调用。此任务分析存储在数据字典中的统计历史、统计操作日志以及 SYSAUX 中存在的当前统计足迹。例如,顾问程序查询 DBA_TAB_STATISTICS 和 DBA_IND_STATISTICS 以确定统计信息是否过时,或者行数之间是否存在差异。

通常,优化器统计顾问会在未遵循或违反特定规则时生成结果,尽管某些结果(例如对象过时)仅提供信息。例如,发现可能显示 DBMS_STATS.GATHER_TABLE_STATS 使用了 ESTIMATE_PERCENT=>0.01,这违反了 ESTIMATE_PERCENT=>AUTO_SAMPLE_SIZE 规则。

一个发现正好对应一个规则。但是,一条规则可以产生许多结果。

18.1.2.1.3 Recommendations for Optimizer Statistics Advisor

根据每个发现,优化器统计顾问会就如何获得更好的统计数据提出建议。

例如,advisor 可能会发现在收集统计信息时违反了不使用抽样的规则,并建议改为指定 AUTO_SAMPLE_SIZE。 顾问将建议存储在 DBA_ADVISOR_RECOMMENDATIONS 中。

单个发现可能存在多个建议。 在这种情况下,您必须进行调查以确定要遵循的建议。 每项建议都包含一个或多个基本原理,这些基本原理解释了 Optimizer Statistics Advisor 提出其建议的原因。 在某些情况下,调查结果可能不会产生建议。

18.1.2.1.4 Actions for Optimizer Statistics Advisor

Optimizer Statistics Advisor 操作是实现建议的 SQL 或 PL/SQL 脚本。 在可行的情况下,建议有相应的行动。 顾问将操作存储在 DBA_ADVISOR_ACTIONS 中。

例如,Optimizer Statistics Advisor 执行一个任务,该任务执行以下步骤:

  • 检查规则
    顾问检查是否符合应避免过时统计信息的规则。

  • 生成结果
    顾问发现许多对象没有统计信息。

  • 生成推荐
    顾问建议在没有统计信息的情况下收集对象的统计信息。

  • 产生动作
    顾问程序生成一个执行 DBMS_STATS.GATHER_DATABASE_STATS 的 PL/SQL 脚本,提供需要收集统计信息的对象列表。

18.1.2.2 Operational Modes for Optimizer Statistics Advisor

Optimizer Statistics Advisor 支持自动和手动模式。

  • 自动
    预定义任务 AUTO_STATS_ADVISOR_TASK 每天在维护窗口中自动运行一次。 该任务作为自动优化器统计信息收集客户端的一部分运行。 自动化任务会生成调查结果和建议,但不会自动执行操作。
    对于任何其他任务,您可以配置自动化任务并生成报告。 如果报告推荐了操作,那么您可以手动实施这些操作。

  • 手动
    您可以使用 DBMS_STATS.CREATE_ADVISOR_TASK 函数创建自己的任务,然后使用 EXECUTE_ADVISOR_TASK 过程随时运行它。
    与自动化任务不同,手动任务可以自动执行操作。 或者,您可以配置任务以生成 PL/SQL 脚本,然后您可以手动运行该脚本。

18.1.3 Command-Line Interface to Optimizer Statistics Advisor

使用 DBMS_STATS PL/SQL 包执行优化器统计顾问任务。

表 18-1 用于创建和删除任务的 DBMS_STATS API

PL/SQL 过程或函数描述
CREATE_ADVISOR_TASK为 Optimizer Statistics Advisor 创建一个顾问任务。 如果已指定任务名称,则顾问使用指定的任务名称; 否则,顾问会自动生成一个新的任务名称。
DROP_ADVISOR_TASK删除 Optimizer Statistics Advisor 任务及其所有结果数据。

表 18-2 用于任务执行的 DBMS_STATS API

PL/SQL 过程或函数描述
EXECUTE_ADVISOR_TASK执行之前创建的 Optimizer Statistics Advisor 任务。
INTERRUPT_ADVISOR_TASK中断当前正在执行的优化器统计顾问任务。 该任务会像在正常退出中一样结束其操作,使您能够访问中间结果。 您可以稍后恢复任务。
CANCEL_ADVISOR_TASK取消优化器统计顾问任务执行,并删除当前执行的所有中间结果。
RESET_ADVISOR_TASK将 Optimizer Statistics Advisor 任务执行重置为其初始状态。 对当前未执行的任务调用此过程。
RESUME_ADVISOR_TASK恢复最近中断的 Optimizer Statistics Advisor 任务执行。

表 18-3 顾问报告的 DBMS_STATS API

PL/SQL 过程或函数描述
REPORT_STATS_ADVISOR_TASK报告优化器统计顾问任务的结果。
GET_ADVISOR_RECS生成给定项目的推荐报告。

表 18-4 用于任务和过滤器配置的 DBMS_STATS API

PL/SQL 过程或函数描述
CONFIGURE_ADVISOR_TASK为顾问任务的执行、报告、脚本生成和实施配置优化器统计顾问列表。
GET_ADVISOR_OPR_FILTER为统计操作创建操作过滤器。
CONFIGURE_ADVISOR_RULE_FILTER为 Optimizer Statistics Advisor 任务配置规则过滤器。
CONFIGURE_ADVISOR_OPR_FILTER为 Optimizer Statistics Advisor 任务配置操作过滤器。
CONFIGURE_ADVISOR_OBJ_FILTER为 Optimizer Statistics Advisor 任务配置对象过滤器。
SET_ADVISOR_TASK_PARAMETER更新 Optimizer Statistics Advisor 任务参数的值。 有效参数为 TIME_LIMIT 和 OP_START_TIME。

表 18-5 用于实施推荐操作的 DBMS_STATS API

PL/SQL 过程或函数描述
SCRIPT_ADVISOR_TASK获取针对顾问发现的问题实施建议操作的脚本。 您可以检查此脚本,然后选择要执行的操作。
IMPLEMENT_ADVISOR_TASK根据指定 Optimizer Statistics Advisor 执行的结果实施顾问建议的操作。

18.2 Basic Tasks for Optimizer Statistics Advisor

本节介绍使用 Optimizer Statistics Advisor 的基本工作流程。 所有过程和函数都在 DBMS_STATS 包中。

下图显示了工作流中的自动和手动路径。 如果 AUTO_STATS_ADVISOR_TASK 在维护时段内自动运行,则您的工作流程从查询报告开始。 在手动工作流中,您必须使用 PL/SQL 来创建和执行任务。

通常,您按照下表中显示的顺序执行优化器统计顾问步骤。

  1. 使用 DBMS_STATS.CREATE_ADVISOR_TASK(仅限手动工作流)创建优化器顾问任务。
  2. 或者,通过查询 DBA_ADVISOR_EXECUTIONS 列出顾问任务的执行。
  3. 或者,使用 DBMS_STATS.CONFIGURE_ADVISOR_*_FILTER 过程为任务配置过滤器。
  4. 使用 DBMS_STATS.EXECUTE_ADVISOR_TASK 执行顾问任务(仅限手动工作流)。
  5. 生成顾问报告。
  6. 通过以下任一方式实施建议:
    • 使用 DBMS_STATS.IMPLEMENT_ADVISOR_TASK 自动实施所有建议。
    • 生成一个使用 DBMS_STATS.SCRIPT_ADVISOR_TASK 实现建议的 PL/SQL 脚本,编辑此脚本,然后手动运行它。
set serveroutput on

DECLARE
  v_tname   VARCHAR2(128) := 'my_task';
  v_ename   VARCHAR2(128) := NULL;
  v_report  CLOB := null;
  v_script  CLOB := null;
  v_implementation_result CLOB;
BEGIN
  dbms_stats.drop_advisor_task(v_tname);

  -- create a task
  v_tname := DBMS_STATS.CREATE_ADVISOR_TASK(v_tname);

  -- execute the task
  v_ename := DBMS_STATS.EXECUTE_ADVISOR_TASK(v_tname);

  -- view the task report
  v_report := DBMS_STATS.REPORT_ADVISOR_TASK(v_tname);
  DBMS_OUTPUT.PUT_LINE(v_report);

  -- implement all recommendations
  v_implementation_result := DBMS_STATS.IMPLEMENT_ADVISOR_TASK(v_tname);
END;

输出如下:

GENERAL INFORMATION
-------------------------------------------------------------------------------

 Task Name       : MY_TASK           
 Execution Name  : EXEC_95           
 Created         : 06-12-22 09:24:27 
 Last Modified   : 06-12-22 09:24:39 
-------------------------------------------------------------------------------
SUMMARY
-------------------------------------------------------------------------------
 For execution EXEC_95 of task MY_TASK, the Statistics Advisor has 4            
 finding(s). The findings are related to the following rules:                   
 AVOIDSETPROCEDURES, USEDEFAULTPARAMS, USEGATHERSCHEMASTATS, AVOIDANALYZETABLE. 
 Please refer to the finding section for detailed information.                  
-------------------------------------------------------------------------------
FINDINGS
-------------------------------------------------------------------------------
 Rule Name:         AvoidSetProcedures                                          
 Rule Description:  Avoid Set Statistics Procedures                             
 Finding:  There are 2 SET_[COLUMN|INDEX|TABLE|SYSTEM]_STATS procedures being   
           used for statistics gathering.                                       
 Operation:                                                                          
 set_index_stats(ownname=>'SH', indname=>'SALARY_IX', numrows=>2000);                
 set_table_stats(ownname=>'SH', tabname=>'CONTRACTORS', numrows=>2000, numblks=>10); 

 Recommendation:  Do not use SET_[COLUMN|INDEX|TABLE|SYSTEM]_STATS procedures.  
                  Gather statistics instead of setting them.                    
 Rationale:  SET_[COLUMN|INDEX|TABLE|SYSTEM]_STATS will cause bad plans due to  
             wrong or inconsistent statistics.                                  
----------------------------------------------------
 Rule Name:         UseDefaultParams                                            
 Rule Description:  Use Default Parameters in Statistics Collection Procedures  
 Finding:  There are 25 statistics operation(s) using nondefault parameters.    
 Operation:                                                                                                                                                       
 gather_table_stats(ownname=>'sh', tabname=>'customers', method_opt=>'FOR ALL COLUMNS SIZE SKEWONLY FOR COLUMNS (LOWER(cust_state_province)) SIZE SKEWONLY');     
 gather_table_stats(ownname=>'sh', tabname=>'customers', method_opt=>'FOR ALL COLUMNS SIZE SKEWONLY FOR COLUMNS (LOWER(cust_state_province)) SIZE SKEWONLY');     
 gather_table_stats(ownname=>'sh', tabname=>'customers', method_opt=>'FOR ALL COLUMNS SIZE SKEWONLY FOR COLUMNS SIZE SKEWONLY (cust_state_province,country_id)'); 
 gather_schema_stats(ownname=>'SYS', no_invalidate=>FALSE, gather_temp=>FALSE, gather_fixed=>FALSE);                                                              
 gather_schema_stats(ownname=>'SYS', no_invalidate=>FALSE, gather_temp=>FALSE, gather_fixed=>FALSE);                                                              
 unlock_table_stats(ownname=>'OE', tabname=>'ORDERS', stattype=>'ALL');                                                                                           
 lock_table_stats(ownname=>'OE', tabname=>'ORDERS', stattype=>'ALL');                                                                                             
 delete_table_stats(ownname=>'OE', tabname=>'ORDERS', cascade_parts=>TRUE, cascade_columns=>TRUE, cascade_indexes=>TRUE, stattype=>'ALL');                        
 gather_database_stats_model();                                                                                                                                   
 gather_database_stats_model();                                                                                                                                   

 Recommendation:  Use default parameters for statistics operations.             
 Example:                                                                       
 -- Gathering statistics for 'SH' schema using all default parameter values:    
 BEGIN dbms_stats.gather_schema_stats('SH'); END;                               
 -- Also the non default parameters can be overriden by setting                 
 'PREFERENCE_OVERRIDES_PARAMETER' preference.                                   
 -- Overriding non default parameters and preferences for all tables in the     
 system and to use dbms_stats for gathering statistics:                         
 begin dbms_stats.set_global_prefs('PREFERENCE_OVERRIDES_PARAMETER', 'TRUE');   
 end;                                                                           
 -- Overriding non default parameters and preferences for 'SH.SALES':           
 begin dbms_stats.set_table_prefs('SH','SALES',                                 
 'PREFERENCE_OVERRIDES_PARAMETER', 'TRUE'); end;                                
 Rationale:  Using default parameter values for statistics gathering operations 
             is more efficient.                                                 
----------------------------------------------------
 Rule Name:         UseGatherSchemaStats                                        
 Rule Description:  Use gather_schema_stats procedure                           
 Finding:  There are 9 uses of GATHER_TABLE_STATS.                              
 Operation:                                                                                                                                                         
 gather_table_stats(ownname=>'SH', tabname=>'CONTRACTORS');                                                                                                         
 gather_table_stats(ownname=>'sh', tabname=>'customers');                                                                                                           
 gather_table_stats(ownname=>'SH', tabname=>'customers_test');                                                                                                      
 gather_table_stats(ownname=>'sh', tabname=>'SALES');                                                                                                               
 gather_table_stats(ownname=>'sh', tabname=>'costs', estimate_percent=>100);                                                                                        
 gather_table_stats(ownname=>'SH', tabname=>'PRODUCTS', method_opt=>'FOR COLUMNS PROD_SUBCATEGORY_ID SIZE 10');                                                     
 gather_table_stats(ownname=>'SH', tabname=>'COUNTRIES', estimate_percent=>100, method_opt=>'FOR COLUMNS COUNTRY_SUBREGION_ID SIZE 7');                             
 gather_table_stats(ownname=>'SH', tabname=>'SALES2');                                                                                                              
 gather_table_stats(ownname=>'SH', tabname=>'SALES_TRANSACTIONS_EXT', block_sample=>TRUE, method_opt=>'FOR ALL COLUMNS SIZE 1', granularity=>'ALL', cascade=>TRUE); 

 Recommendation:  Use GATHER_SCHEMA_STATS instead of GATHER_TABLE_STATS.        
 Example:                                                                       
 -- Gather statistics for 'SH' schema:                                          
 BEGIN dbms_stats.gather_schema_stats('SH'); END;                               
 Rationale:  GATHER_SCHEMA_STATS has more options available, including checking 
             for staleness and gathering statistics concurrently. Also it is    
             more maintainable for new tables added to the schema. If you only  
             want to gather statistics for certain tables in the schema,        
             specify them in the obj_filter_list parameter of                   
             GATHER_SCHEMA_STATS.                                               
----------------------------------------------------
 Rule Name:         AvoidAnalyzeTable                                           
 Rule Description:  Avoid using analyze table commands for statistics           
                    collection                                                  
 Finding:  There are 5 object(s) using "ANALYZE TABLE <table_name> [COMPUTE |   
           ESTIMATE] STATISTICS" to gather statistics.                          
 Schema:                        
 OE                             
 Objects:                       
 CATEGORIES_TAB                 
 PRODUCT_REF_LIST_NESTEDTAB     
 PURCHASEORDER                  
 SUBCATEGORY_REF_LIST_NESTEDTAB 
 Schema:                        
 PM                             
 Objects:                       
 TEXTDOCS_NESTEDTAB             

 Recommendation:  Use GATHER_SCHEMA_STATS instead of ANALYZE TABLE statements   
                  to gather statistics.                                         
 Example:                                                                       
 -- Gathering statistics for tables with stale or no statistics in schema, SH:  
 exec dbms_stats.gather_schema_stats('SH', options => 'GATHER AUTO')            
 -- Also analyze can be redirected to use dbms_stats by setting                 
 'PREFERENCE_OVERRIDES_PARAMETER' preference.                                   
 -- Overriding non default parameters and preferences for all tables in the     
 system and to use dbms_stats for gathering statistics:                         
 begin dbms_stats.set_global_prefs('PREFERENCE_OVERRIDES_PARAMETER', 'TRUE');   
 end;                                                                           
 -- Overriding non default parameters and preferences for 'SH.SALES':           
 begin dbms_stats.set_table_prefs('SH','SALES',                                 
 'PREFERENCE_OVERRIDES_PARAMETER', 'TRUE'); end;                                
 Rationale:  "ANALYZE TABLE <table_name> [COMPUTE | ESTIMATE] STATISTICS" is    
             obsolete and no longer supported.                                  
----------------------------------------------------
-------------------------------------------------------------------------------


PL/SQL procedure successfully completed.

18.2.1 Creating an Optimizer Statistics Advisor Task

DBMS_STATS.CREATE_ADVISOR_TASK 函数为 Optimizer Statistics Advisor 创建一个任务。 如果您不指定任务名称,那么 Optimizer Statistics Advisor 会自动生成一个。

先决条件: 要执行此子程序,您必须具有 ADVISOR 权限。

注意:该子程序使用调用者的权限执行。

DECLARE
  v_tname VARCHAR2(32767);
  v_ret   VARCHAR2(32767);
BEGIN
  v_tname := 'opt_adv_task1';
  v_ret := DBMS_STATS.CREATE_ADVISOR_TASK(v_tname);
END;
/

查询创建的任务:

col task_name for a20
col advisor_name for a30
SELECT TASK_NAME, ADVISOR_NAME, CREATED, STATUS FROM USER_ADVISOR_TASKS;
-- where task_name = 'OPT_ADV_TASK1';
TASK_NAME            ADVISOR_NAME                   CREATED   STATUS     
-------------------- ------------------------------ --------- -----------
OPT_ADV_TASK1        Statistics Advisor             12-JUN-22 INITIAL     

18.2.2 Listing Optimizer Statistics Advisor Tasks

DBA_ADVISOR_EXECUTIONS 视图列出了优化器统计顾问任务的执行。

COL EXECUTION_NAME FORMAT a14

SELECT EXECUTION_NAME, EXECUTION_END, STATUS
FROM   DBA_ADVISOR_EXECUTIONS
WHERE  TASK_NAME = 'AUTO_STATS_ADVISOR_TASK'
ORDER BY 2;

EXECUTION_NAME EXECUTION STATUS     
-------------- --------- -----------
EXEC_1         27-JUL-21 COMPLETED  
EXEC_21        04-JUN-22 COMPLETED  
EXEC_42        05-JUN-22 COMPLETED  
EXEC_53        07-JUN-22 COMPLETED  
EXEC_73        09-JUN-22 COMPLETED  
EXEC_84        11-JUN-22 COMPLETED  

6 rows selected. 

18.2.3 Creating Filters for an Optimizer Advisor Task

过滤器使您能够在 Optimizer Statistics Advisor 任务中包含或排除对象、规则和操作。

18.2.3.1 About Filters for Optimizer Statistics Advisor

过滤器是使用 DBMS_STATS 将优化器统计顾问任务限制为用户指定的一组规则、模式或操作。

过滤器对于包括或排除一组特定的结果很有用。 例如,您可以将顾问任务配置为仅包含 sh 模式的建议。 此外,您可以排除所有违反陈旧统计信息规则的行为。 过滤器的主要优点是能够忽略您不感兴趣的建议,并减少顾问任务的开销。

创建过滤器的最简单方法是单独或组合使用以下 DBMS_STATS 过程:

  • CONFIGURE_ADVISOR_OBJ_FILTER
    使用此过程包括或排除指定的数据库模式或对象。 对象过滤器接受所有者名称和对象名称,支持通配符 (%)。

  • CONFIGURE_ADVISOR_RULE_FILTER
    使用此过程包括或排除指定的规则。 通过查询 V$STATS_ADVISOR_RULES 获取规则名称。

  • CONFIGURE_ADVISOR_OPR_FILTER
    使用此过程包括或排除指定的 DBMS_STATS 操作。 通过查询 DBA_OPTSTAT_OPERATIONS 获取操作的 ID 和名称。

对于上述函数,您可以指定应用过滤器的操作类型:EXECUTE、REPORT、SCRIPT 和 IMPLEMENT。 您还可以组合类型,如 EXECUTE + REPORT。 Null 表示过滤器适用于所有类型的顾问操作。

18.2.3.2 Creating an Object Filter for an Optimizer Advisor Task

DBMS_STATS.CONFIGURE_ADVISOR_OBJ_FILTER 函数为指定的优化器统计顾问任务创建规则过滤器。 该函数返回一个包含过滤器更新值的 CLOB。

您可以使用以下任一基本策略:

  • 包括所有对象的结果(默认情况下,考虑所有对象),然后排除指定对象的结果。
  • 排除所有对象的结果,然后仅包括指定对象的结果。

使用 DBMS_STATS.CONFIGURE_ADVISOR_OBJ_FILTER 函数,您必须满足以下先决条件:

  • 要执行此子程序,您必须具有 ADVISOR 权限。
  • 您必须是任务的所有者。

注意:该子程序使用调用者的权限执行。

删除已有任务:

DECLARE
  v_tname VARCHAR2(32767);
BEGIN
  v_tname := 'opt_adv_task1';
  DBMS_STATS.DROP_ADVISOR_TASK(v_tname);
END;
/

创建一个名为 sh_obj_filter 的过程,将指定任务限制为 sh 模式中的对象。

CREATE OR REPLACE PROCEDURE sh_obj_filter<

以上是关于SQL调优指南笔记18:Analyzing Statistics Using Optimizer Statistics Advisor的主要内容,如果未能解决你的问题,请参考以下文章

SQL调优指南笔记9:Joins

SQL调优指南笔记9:Joins

SQL调优指南笔记1:Introduction to SQL Tuning

SQL调优指南笔记6:Explaining and Displaying Execution Plans

SQL调优指南笔记11:Histograms

SQL调优指南笔记11:Histograms