暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 19C 数据库收集优化程序统计信息时

原创 Asher.HU 2021-02-04
944

该数据库在不同时间和各种来源收集优化程序统计信息。

 

 

10.4.1优化器统计信息的来源

优化器使用几种不同的来源进行优化器统计。

来源如下:

  • DBMS_STATS 自动或手动执行 :该PL / SQL软件包是收集优化器统计信息的主要方法。
  • SQL编译 :SQL编译期间,数据库可以扩展以前由DBMS_STATS收集的统计数据。在此阶段,数据库将运行其他查询,以获得有关表中有多少行满足WHERE SQL语句中的子句谓词的更准确的信息。
  • SQL执行 : 在执行期间,数据库可以进一步增强以前收集的统计信息。在此阶段,Oracle数据库收集在执行SQL语句期间每个行源产生的行数。在执行结束时,优化器确定估计的行数是否不够准确,以至于不能保证在下一条语句执行时进行重新分析。如果将游标标记为要重新分析,则优化器将使用前一次执行的实际行数,而不是估算值。
  • SQL配置文件 : 一个SQL配置文件是对查询的辅助统计数据的集合。该配置文件将这些补充统计信息存储在数据字典中。优化器在优化过程中使用SQL配置文件来确定最佳方案。

数据库将优化器统计信息存储在数据字典中,并根据需要更新或替换它们。您可以在数据字典视图中查询统计信息。


10.4.2 SQL计划指令

一个SQL计划指令,在附加信息和指令优化器可以用它来生成更优化的方案。

该指令是优化程序的“自我提示”,它错误地估计了某些类型谓词的基数,并且还提醒DBMS_STATS您收集将来纠正错误估计所需的统计信息。例如,当联接两个在其联接列中具有数据偏斜的表时,SQL计划指令可以指示优化器使用动态统计信息以获得更准确的联接基数估计。

 

10.4.2.1数据库创建SQL计划指令时

数据库根据在自动重新优化过程中获得的信息自动创建SQL计划指令。如果在SQL执行期间发生基数估计错误,则数据库将创建SQL计划指令。

对于每个新指令,该DBA_SQL_PLAN_DIRECTIVES.STATE列均显示值USABLE该值表明数据库可以使用指令来更正错误估计。

优化器在查询表达式上定义了一个SQL计划指令,例如,在一起使用的两列上的过滤谓词。指令未绑定到特定的SQL语句或SQL ID。因此,优化器可以将指令用于不相同的语句。例如,伪指令可以帮助优化器处理使用类似模式的查询,例如除了选择列表项之外,所有查询都相同的查询。

执行计划的注释”部分指示用于一条语句的SQL计划指令的数量。通过查询DBA_SQL_PLAN_DIRECTIVESDBA_SQL_PLAN_DIR_OBJECTS视图,获取有关指令的更多信息

 

10.4.2.2数据库如何使用SQL计划指令

编译SQL语句时,如果优化器看到指令,则它会通过收集其他信息来遵守指令。

优化器通过以下方式使用指令:

  • 动态统计

    当优化器没有与指令对应的足够统计信息时,它就会使用动态统计信息。例如,其谓词包含一对特定的列的查询的基数估计可能是严重错误的。SQL plan指令指示每当解析包含这些列的查询时,优化器就需要使用动态采样来避免严重的基数估计错误。

    动态统计信息有一些性能开销。每次优化器硬解析适用于动态统计指令的查询时,数据库都必须执行额外的采样。

    Oracle Database 12c第2版(12.2)开始,数据库将来自自适应动态采样的统计信息写入SQL计划指令存储,从而使它们可用于其他查询。(可以理解为,一次动态采样,信息多次利用,不是每次执行都要动态采样)

  • Column groups

    优化器检查与指令对应的查询。如果缺少列组,并且受影响的表DBMS_STATS首选项AUTO_STAT_EXTENSIONS设置为ON(默认设置为OFF),那么优化器将在下次DBMS_STATS收集表统计信息时自动创建此列组否则,优化器不会自动创建Column groups

    如果存在Column groups,则下次执行该语句时,优化器将在可能的情况下使用列组统计信息代替SQL plan伪指令(等式谓词,GROUP BY等等)。在后续执行中,优化器可能会创建其他SQL计划指令以解决计划中的其他问题,例如联接或GROUP BY基数估计错误。

    注意:

    当前,优化器仅监视列组。优化器不会在表达式上创建扩展。

解决存在指令问题的问题时,由于存在更好的指令,或者由于存在直方图或扩展名,该DBA_SQL_PLAN_DIRECTIVES.STATE值从USABLE变为SUPERSEDEDDBA_SQL_PLAN_DIRECTIVES.NOTES列中提供了有关指令状态的更多信息

也可以看看:


10.4.2.3 SQL计划指令维护

数据库自动创建SQL计划指令。您无法手动创建它们。

数据库最初在共享池中创建指令。数据库定期将指令写入SYSAUX表空间。在指定的周数(SPD_RETENTION_WEEKS)(默认值为53)之后,数据库将自动清除所有未使用的SQL计划指令

您可以通过使用DBMS_SPD来管理指令例如,您可以:

  • 启用和禁用SQL计划指令(ALTER_SQL_PLAN_DIRECTIVE
  • 更改SQL计划指令的保留期(SET_PREFS
  • 将指令导出到登台表(PACK_STGTAB_DIRECTIVE
  • 删除指令(DROP_SQL_PLAN_DIRECTIVE
  • 强制数据库将指令写入磁盘(FLUSH_SQL_PLAN_DIRECTIVE

也可以看看:

Oracle Database PL / SQL软件包和类型参考以了解该DBMS_SPD软件包

 

10.4.2.4优化器如何使用SQL计划指令:示例

本示例说明数据库如何为SQL语句自动创建和使用SQL计划指令。

假设条件

您计划对sh 对象进行查询,并且您对该架构以及数据字典和V$视图具有特权

要查看数据库如何使用SQL计划指令:

  1. 查询sh.customers表。
    SELECT /*+gather_plan_statistics*/ * 
    FROM   customers 
    WHERE  cust_state_province='CA' 
    AND    country_id='US';
    

    gather_plan_statistics提示显示从计划中的每个操作返回行的实际数量。因此,您可以将优化器估计值与返回的实际行数进行比较。

  2. 在计划中查询上一个查询。

    以下示例显示了执行计划(包括示例输出):

    SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'ALLSTATS LAST'));
     
    PLAN_TABLE_OUTPUT
    -------------------------------------
    SQL_ID  b74nw722wjvy3, child number 0
    -------------------------------------
    select /*+gather_plan_statistics*/ * from customers where
    CUST_STATE_PROVINCE='CA' and country_id='US'
     
    Plan hash value: 1683234692
    --------------------------------------------------------------------------------------------
    | Id| Operation         | Name      | Starts |E-Rows| A-Rows |   A-Time   |Buffers | Reads |
    --------------------------------------------------------------------------------------------
    | 0 | SELECT STATEMENT  |           |      1 |      |     29 |00:00:00.01 |     17 |    14 |
    |*1 |  TABLE ACCESS FULL| CUSTOMERS |      1 |    8 |     29 |00:00:00.01 |     17 |    14 |
    --------------------------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       1 - filter(("CUST_STATE_PROVINCE"='CA' AND "COUNTRY_ID"='US'))
    

    A-Rows计划中每个操作返回的实际行数(E-Rows与估算值(相差很大该语句是自动重新优化的候选

  3. 检查查询是否customers可以重新优化。

    以下语句查询V$SQL.IS_REOPTIMIZABLE值(包括示例输出):

    SELECT SQL_ID, CHILD_NUMBER, SQL_TEXT, IS_REOPTIMIZABLE
    FROM   V$SQL
    WHERE  SQL_TEXT LIKE 'SELECT /*+gather_plan_statistics*/%';
     
    SQL_ID        CHILD_NUMBER SQL_TEXT    I
    ------------- ------------ ----------- -
    b74nw722wjvy3            0 select /*+g Y
                               ather_plan_
                               statistics*
                               / * from cu
                               stomers whe
                               re CUST_STA
                               TE_PROVINCE
                               ='CA' and c
                               ountry_id='
                               US'
    

    IS_REOPTIMIZABLE列标记为Y,因此数据库将customers下一次执行时查询进行硬解析优化器使用此初始执行的执行统计信息来确定计划。该数据库将从重新优化中学到的信息作为SQL计划指令保存。

  4. 显示sh架构的指令

    以下示例用于DBMS_SPD将SQL计划指令写入磁盘,然后仅显示sh架构的指令

    EXEC DBMS_SPD.FLUSH_SQL_PLAN_DIRECTIVE;
     
    SELECT TO_CHAR(d.DIRECTIVE_ID) dir_id, o.OWNER AS "OWN", o.OBJECT_NAME AS "OBJECT", 
           o.SUBOBJECT_NAME col_name, o.OBJECT_TYPE, d.TYPE, d.STATE, d.REASON
    FROM   DBA_SQL_PLAN_DIRECTIVES d, DBA_SQL_PLAN_DIR_OBJECTS o
    WHERE  d.DIRECTIVE_ID=o.DIRECTIVE_ID
    AND    o.OWNER IN ('SH')
    ORDER BY 1,2,3,4,5;
    
    DIR_ID              OWN OBJECT    COL_NAME    OBJECT TYPE             STATE  REASON
    ------------------- --- --------- ----------- ------ ---------------- ------ ------------
    1484026771529551585 SH  CUSTOMERS COUNTRY_ID  COLUMN DYNAMIC_SAMPLING USABLE SINGLE TABLE
                                                                                 CARDINALITY
                                                                                 MISESTIMATE
    1484026771529551585 SH  CUSTOMERS CUST_STATE_ COLUMN DYNAMIC_SAMPLING USABLE SINGLE TABLE
                                      PROVINCE                                   CARDINALITY
                                                                                 MISESTIMATE       
    1484026771529551585 SH  CUSTOMERS             TABLE  DYNAMIC_SAMPLING USABLE SINGLE TABLE
                                                                                 CARDINALITY
                                                                                 MISESTIMATE
    

    最初,数据库将SQL计划指令存储在内存中,然后每15分钟将它们写入磁盘。因此,前面的示例调用DBMS_SPD.FLUSH_SQL_PLAN_DIRECTIVE强制数据库将指令写入SYSAUX表空间。

    使用视图DBA_SQL_PLAN_DIRECTIVES监视指令DBA_SQL_PLAN_DIR_OBJECTS视图中将出现三项,一个用于customers表本身,一个用于每个相关列。由于customers查询的IS_REOPTIMIZABLE值为Y,如果您重新执行该语句,则数据库将再次对其进行硬解析,然后根据先前的执行统计信息生成一个计划。

  5. customers再次查询表。

    例如,输入以下语句:

    SELECT /*+gather_plan_statistics*/ * 
    FROM   customers 
    WHERE  cust_state_province='CA' 
    AND    country_id='US';
    
  6. 在光标中查询计划。

    以下示例显示了执行计划(包括示例输出):

    SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'ALLSTATS LAST'));
    
    PLAN_TABLE_OUTPUT
    -------------------------------------
    SQL_ID  b74nw722wjvy3, child number 1
    -------------------------------------
    select /*+gather_plan_statistics*/ * from customers where
    CUST_STATE_PROVINCE='CA' and country_id='US'
     
    Plan hash value: 1683234692
    ---------------------------------------------------------------------------
    |Id | Operation         |Name     |Start|E-Rows|A-Rows|   A-Time  |Buffers|
    ---------------------------------------------------------------------------
    |  0| SELECT STATEMENT  |         |    1|      |    29|00:00:00.01|     17|
    |* 1|  TABLE ACCESS FULL|CUSTOMERS|    1|    29|    29|00:00:00.01|     17|
    ---------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       1 - filter(("CUST_STATE_PROVINCE"='CA' AND "COUNTRY_ID"='US'))
     
    Note
    -----
       - cardinality feedback used for this statement
    

    Note部分指示数据库对此语句使用了重新优化现在估计的行数(E-Rows)是正确的。SQL计划指令尚未使用。

  7. 查询游标以进行customers查询。

    例如,运行以下查询(包括示例输出):

    SELECT SQL_ID, CHILD_NUMBER, SQL_TEXT, IS_REOPTIMIZABLE
    FROM   V$SQL
    WHERE  SQL_TEXT LIKE 'SELECT /*+gather_plan_statistics*/%';
     
    SQL_ID        CHILD_NUMBER SQL_TEXT    I
    ------------- ------------ ----------- -
    b74nw722wjvy3            0 select /*+g Y
                               ather_plan_
                               statistics*
                               / * from cu
                               stomers whe
                               re CUST_STA
                               TE_PROVINCE
                               ='CA' and c
                               ountry_id='
                               US'
     
    b74nw722wjvy3            1 select /*+g N
                               ather_plan_
                               statistics*
                               / * from cu
                               stomers whe
                               re CUST_STA
                               TE_PROVINCE
                               ='CA' and c
                               ountry_id='
                               US'
    

    存在一个用于customers查询的新计划,以及一个新的子游标。

  8. 确认存在一个SQL计划指令,并且该指令可用于其他语句。

    例如,运行以下查询,该查询与原始customers查询相似但不相同(状态为,MA而不是CA):

    SELECT /*+gather_plan_statistics*/ CUST_EMAIL
    FROM   CUSTOMERS
    WHERE  CUST_STATE_PROVINCE='MA'
    AND    COUNTRY_ID='US';
    
  9. 在光标中查询计划。

    以下语句查询游标(包括示例输出):

    SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'ALLSTATS LAST'));
    
    PLAN_TABLE_OUTPUT
    -------------------------------------
    SQL_ID  3tk6hj3nkcs2u, child number 0
    -------------------------------------
    Select /*+gather_plan_statistics*/ cust_email From   customers Where
    cust_state_province='MA' And    country_id='US'
     
    Plan hash value: 1683234692
    
    ---------------------------------------------------------------------------
    |Id | Operation         | Name      |Starts|E-Rows|A-Rows| A-Time |Buffers|
    ---------------------------------------------------------------------------
    | 0 | SELECT STATEMENT  |           |    1 |      |  2 |00:00:00.01|   16 |
    |*1 |  TABLE ACCESS FULL| CUSTOMERS |    1 |    2 |  2 |00:00:00.01|   16 |
    ---------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       1 - filter(("CUST_STATE_PROVINCE"='MA' AND "COUNTRY_ID"='US'))
     
    Note
    -----
       - dynamic sampling used for this statement (level=2)      <---使用了动态统计信息
       - 1 Sql Plan Directive used for this statement            <---使用了SQL指令
    

    Note计划部分显示,优化器对此语句使用了SQL指令,还使用了动态统计信息。

也可以看看:

 

10.4.2.5优化程序如何使用扩展和SQL计划指令:示例

该示例显示了数据库如何使用SQL计划指令,直到优化程序验证扩展是否存在并且统计信息适用。

此时,伪指令将其状态更改为SUPERSEDED随后的编译使用统计信息而不是指令。

假设条件

本示例假定您已经按照 优化程序如何使用SQL Plan指令:示例 ”中的步骤进行操作

要查看优化器如何使用扩展和SQL计划指令:

  1. 收集sh.customers表的统计信息

    例如,执行以下PL / SQL程序:

    BEGIN
      DBMS_STATS.GATHER_TABLE_STATS('SH','CUSTOMERS');
    END;
    /
    
  2. 检查表中是否存在扩展名customers

    例如,执行以下查询(包括示例输出):

    SELECT TABLE_NAME, EXTENSION_NAME, EXTENSION 
    FROM   DBA_STAT_EXTENSIONS
    WHERE  OWNER='SH' 
    AND    TABLE_NAME='CUSTOMERS';
     
    TABLE_NAM EXTENSION_NAME                 EXTENSION
    --------- ------------------------------ -----------------------
    CUSTOMERS SYS_STU#S#WF25Z#QAHIHE#MOFFMM_ ("CUST_STATE_PROVINCE",
                                             "COUNTRY_ID")
    

    前面的输出指示cust_state_provincecountry_id上存在列组扩展名

  3. 查询SQL计划指令的状态。

    例10-6在数据字典中查询有关指令的信息。

    示例10-6 sh模式的显示指令

    EXEC DBMS_SPD.FLUSH_SQL_PLAN_DIRECTIVE;
     
    SELECT TO_CHAR(d.DIRECTIVE_ID) dir_id, o.OWNER, o.OBJECT_NAME, 
           o.SUBOBJECT_NAME col_name, o.OBJECT_TYPE, d.TYPE, d.STATE, d.REASON
    FROM   DBA_SQL_PLAN_DIRECTIVES d, DBA_SQL_PLAN_DIR_OBJECTS o
    WHERE  d.DIRECTIVE_ID=o.DIRECTIVE_ID
    AND    o.OWNER IN ('SH')
    ORDER BY 1,2,3,4,5;
     
    DIR_ID              OWN OBJECT_NA COL_NAME   OBJECT  TYPE             STATE  REASON
    ------------------- --- --------- ---------- ------- ---------------- ------ ------------
    1484026771529551585  SH CUSTOMERS COUNTRY_ID  COLUMN DYNAMIC_SAMPLING USABLE SINGLE TABLE 
                                                                                 CARDINALITY 
                                                                                 MISESTIMATE
    1484026771529551585  SH CUSTOMERS CUST_STATE_ COLUMN DYNAMIC_SAMPLING USABLE SINGLE TABLE 
                                      PROVINCE                                   CARDINALITY
                                                                                 MISESTIMATE
    1484026771529551585  SH CUSTOMERS              TABLE DYNAMIC_SAMPLING USABLE SINGLE TABLE 
                                                                                 CARDINALITY
                                                                                 MISESTIMATE

    尽管存在列组统计信息,但该指令的状态为,USABLE因为数据库尚未重新编译该语句。在下一次编译期间,优化器将验证统计信息是否适用。如果适用,则伪指令的状态更改为SUPERSEDED随后的编译使用统计信息而不是指令。

  4. 查询sh.customers表。
    SELECT /*+gather_plan_statistics*/ * 
    FROM   customers 
    WHERE  cust_state_province='CA' 
    AND    country_id='US';
    
  5. 在光标中查询计划。

    例10-7显示了执行计划(包括示例输出)。

    示例10-7执行计划

    SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'ALLSTATS LAST'));
     
    PLAN_TABLE_OUTPUT
    -------------------------------------
    SQL_ID  b74nw722wjvy3, child number 0
    -------------------------------------
    select /*+gather_plan_statistics*/ * from customers where
    CUST_STATE_PROVINCE='CA' and country_id='US'
     
    Plan hash value: 1683234692
     
    -----------------------------------------------------------------------------------------
    | Id  | Operation         | Name      | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
    -----------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |           |      1 |        |     29 |00:00:00.01 |      16 |
    |*  1 |  TABLE ACCESS FULL| CUSTOMERS |      1 |     29 |     29 |00:00:00.01 |      16 |
    -----------------------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       1 - filter(("CUST_STATE_PROVINCE"='CA' AND "COUNTRY_ID"='US'))
     
    Note
    -----
       - dynamic sampling used for this statement (level=2)
       - 1 Sql Plan Directive used for this statement            <---使用了指令

    Note节显示优化器使用了指令,而不是扩展的统计信息。在编译期间,数据库验证了扩展的统计信息。

  6. 查询SQL计划指令的状态。

    例10-8在数据字典中查询有关指令的信息。

    示例10-8 sh模式的显示指令

    EXEC DBMS_SPD.FLUSH_SQL_PLAN_DIRECTIVE;
     
    SELECT TO_CHAR(d.DIRECTIVE_ID) dir_id, o.OWNER, o.OBJECT_NAME, 
           o.SUBOBJECT_NAME col_name, o.OBJECT_TYPE, d.TYPE, d.STATE, d.REASON
    FROM   DBA_SQL_PLAN_DIRECTIVES d, DBA_SQL_PLAN_DIR_OBJECTS o
    WHERE  d.DIRECTIVE_ID=o.DIRECTIVE_ID
    AND    o.OWNER IN ('SH')
    ORDER BY 1,2,3,4,5;
     
    DIR_ID              OWN OBJECT_NA  COL_NAME    OBJECT TYPE     STATE      REASON
    ------------------- --- ---------  ----------  ------ -------- ---------  ------------
    1484026771529551585  SH CUSTOMERS  COUNTRY_ID  COLUMN DYNAMIC_ SUPERSEDED SINGLE TABLE  
                                                          SAMPLING            CARDINALITY 
                                                                              MISESTIMATE
    1484026771529551585  SH CUSTOMERS  CUST_STATE_ COLUMN DYNAMIC_ SUPERSEDED SINGLE TABLE 
                                       PROVINCE           SAMPLING            CARDINALITY 
                                                                              MISESTIMATE
    1484026771529551585  SH CUSTOMERS               TABLE DYNAMIC_ SUPERSEDED SINGLE TABLE
                                                          SAMPLING            CARDINALITY
                                                                              MISESTIMATE

    伪指令的状态已更改为SUPERSEDED指示相应的列或组具有扩展名或直方图,或者存在另一个可用于该伪指令的SQL计划伪指令。

  7. sh.customers使用稍有不同的语句形式再次查询表。

    例如,运行以下查询:

    SELECT /*+gather_plan_statistics*/ /* force reparse */ * 
    FROM   customers 
    WHERE  cust_state_province='CA' 
    AND    country_id='US';
    

    如果光标位于共享的SQL区域中,则数据库通常会共享该光标。要强制重新解析,此步骤通过添加注释来稍微更改SQL文本。

  8. 在光标中查询计划。

    例10-9显示了执行计划(包括示例输出)。

    示例10-9执行计划

    SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'ALLSTATS LAST'));
     
    PLAN_TABLE_OUTPUT
    -------------------------------------
    SQL_ID  b74nw722wjvy3, child number 0
    -------------------------------------
    select /*+gather_plan_statistics*/ * from customers where
    CUST_STATE_PROVINCE='CA' and country_id='US'
     
    Plan hash value: 1683234692
     
    -----------------------------------------------------------------------------------------
    | Id  | Operation         | Name      | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
    -----------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |           |      1 |        |     29 |00:00:00.01 |      17 |
    |*  1 |  TABLE ACCESS FULL| CUSTOMERS |      1 |     29 |     29 |00:00:00.01 |      17 |
    -----------------------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       1 - filter(("CUST_STATE_PROVINCE"='CA' AND "COUNTRY_ID"='US'))
     
    19 rows selected.

    缺少a Note表示优化器使用扩展的统计信息而不是SQL plan指令。如果该指令在53周内未使用,则数据库将自动清除该指令。

也可以看看:



10.4.3数据库采样数据时

Oracle Database 12c开始优化器自动确定动态统计信息是否有用以及对所有SQL语句使用哪种样本大小

注意:

在早期版本中,动态统计信息称为动态采样

决定使用动态统计信息的主要因素是可用的统计信息是否足以生成最佳计划。如果统计信息不足,那么优化器将使用动态统计信息。

如果OPTIMIZER_DYNAMIC_SAMPLING初始化参数未设置为,则启用自动动态统计信息0默认情况下,动态统计信息级别设置为2

通常,优化器使用默认统计信息不是动态统计信息来计算对表,索引和列进行优化时所需的统计信息。优化程序基于以下几个因素来决定是否使用动态统计信息:

  • SQL语句使用并行执行。
  • 存在SQL计划指令。

下图说明了收集动态统计信息的过程。

图10-2动态统计

如图10-2所示,在以下情况下,优化器会自动收集动态统计信息

  • 缺少统计信息 :当查询中的表没有统计信息时,优化器将在优化之前收集这些表的基本统计信息。可能会丢失统计信息,因为应用程序创建了新对象而没有后续调用DBMS_STATS来收集统计信息,或者因为统计信息在收集统计信息之前已锁定在对象上。

    在这种情况下,统计信息不如使用DBMS_STATS软件包收集的统计信息那么高质量或完整进行此折衷是为了限制对语句的编译时间的影响。

  • 统计不足 : 每当优化器估计谓词(过滤器或联接)或GROUP BY子句的选择性而没有考虑列之间的相关性,列数据分布中的偏斜,表达式的统计信息等时,统计信息可能就不足。

      扩展的统计信息可帮助优化程序为复杂的谓词表达式获得准确的质量基数估计。优化器可以使用动态统计信息来弥补扩展统计信息的不足,或者在无法使用扩展统计信息时(例如,用于非等式谓词)。

注意:数据库不对包含该AS OF子句的查询使用动态统计信息。

也可以看看:

 

10.4.4数据库如何采样数据

在优化开始时,当确定表是否为动态统计信息的候选者时,优化器将检查表上是否存在持久性SQL计划指令。

对于每个指令,优化器将注册一个统计表达式,该统计表达式将在确定涉及表的谓词的基数时由优化器计算。

图10-2中,数据库发出一个递归SQL语句来扫描表块的一个随机样本。该数据库应用相关的单表谓词和联接以估计谓词基数。

数据库将动态统计信息的结果保留为可共享的统计信息数据库可以在一个查询SQL编译期间与重新编译同一查询时共享结果数据库还可以将结果重用于具有相同模式的查询。

也可以看看:

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论