该数据库在不同时间和各种来源收集优化程序统计信息。
- 优化程序统计信息 : 的来源优化程序使用几种不同的统计信息来源。
- SQL计划指令 : 一个SQL计划指令,在附加信息和指令优化器可以用它来生成更优化的方案。
- 当数据库样本数据 :从Oracle Database 12c开始时,优化器会自动决定动态统计信息是否有用以及对所有SQL语句使用哪种样本大小。
- 数据库如何对数据采样 : 在优化开始时,当确定表是否为动态统计信息的候选者时,优化器将检查表上是否存在持久性SQL计划指令。
10.4.1优化器统计信息的来源
优化器使用几种不同的来源进行优化器统计。
来源如下:
DBMS_STATS自动或手动执行 :该PL / SQL软件包是收集优化器统计信息的主要方法。- SQL编译 :在SQL编译期间,数据库可以扩展以前由DBMS_STATS收集的统计数据。在此阶段,数据库将运行其他查询,以获得有关表中有多少行满足
WHERESQL语句中的子句谓词的更准确的信息。 - SQL执行 : 在执行期间,数据库可以进一步增强以前收集的统计信息。在此阶段,Oracle数据库收集在执行SQL语句期间每个行源产生的行数。在执行结束时,优化器确定估计的行数是否不够准确,以至于不能保证在下一条语句执行时进行重新分析。如果将游标标记为要重新分析,则优化器将使用前一次执行的实际行数,而不是估算值。
- SQL配置文件 : 一个SQL配置文件是对查询的辅助统计数据的集合。该配置文件将这些补充统计信息存储在数据字典中。优化器在优化过程中使用SQL配置文件来确定最佳方案。
数据库将优化器统计信息存储在数据字典中,并根据需要更新或替换它们。您可以在数据字典视图中查询统计信息。
10.4.2 SQL计划指令
一个SQL计划指令,在附加信息和指令优化器可以用它来生成更优化的方案。
该指令是优化程序的“自我提示”,它错误地估计了某些类型谓词的基数,并且还提醒DBMS_STATS您收集将来纠正错误估计所需的统计信息。例如,当联接两个在其联接列中具有数据偏斜的表时,SQL计划指令可以指示优化器使用动态统计信息以获得更准确的联接基数估计。
- 数据库创建SQL计划指令时 : ,数据库将根据在自动重新优化过程中获得的信息自动创建SQL计划指令。如果在SQL执行期间发生基数估计错误,则数据库将创建SQL计划指令。
- 数据库如何使用SQL计划指令 : 编译SQL语句时,如果优化器看到指令,则它会通过收集其他信息来遵守指令。
- SQL计划指令维护 : 数据库自动创建SQL计划指令。您无法手动创建它们。
- 优化程序如何使用SQL计划指令:示例
此示例显示数据库如何为SQL语句自动创建和使用SQL计划指令。 - 优化程序如何使用扩展和SQL计划指令:示例
本示例显示了数据库如何使用SQL计划指令,直到优化程序验证扩展是否存在并且统计信息适用。
10.4.2.1数据库创建SQL计划指令时
数据库根据在自动重新优化过程中获得的信息自动创建SQL计划指令。如果在SQL执行期间发生基数估计错误,则数据库将创建SQL计划指令。
对于每个新指令,该DBA_SQL_PLAN_DIRECTIVES.STATE列均显示值USABLE。该值表明数据库可以使用指令来更正错误估计。
优化器在查询表达式上定义了一个SQL计划指令,例如,在一起使用的两列上的过滤谓词。指令未绑定到特定的SQL语句或SQL ID。因此,优化器可以将指令用于不相同的语句。例如,伪指令可以帮助优化器处理使用类似模式的查询,例如除了选择列表项之外,所有查询都相同的查询。
执行计划的“注释”部分指示用于一条语句的SQL计划指令的数量。通过查询DBA_SQL_PLAN_DIRECTIVES和DBA_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变为SUPERSEDED。该DBA_SQL_PLAN_DIRECTIVES.NOTES列中提供了有关指令状态的更多信息。
也可以看看:
- “ 管理扩展统计信息 ”
- “ 关于列组的统计信息 ”
- 《 Oracle数据库PL / SQL软件包和类型参考》,以了解有关
AUTO_STAT_EXTENSIONS首选项的更多信息DBMS_STATS.SET_TABLE_STATS
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计划指令:
- 查询
sh.customers表。SELECT /*+gather_plan_statistics*/ * FROM customers WHERE cust_state_province='CA' AND country_id='US';该
gather_plan_statistics提示显示从计划中的每个操作返回行的实际数量。因此,您可以将优化器估计值与返回的实际行数进行比较。 - 在计划中查询上一个查询。
以下示例显示了执行计划(包括示例输出):
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)与估算值()相差很大。该语句是自动重新优化的候选。 - 检查查询是否
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计划指令保存。 - 显示
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,如果您重新执行该语句,则数据库将再次对其进行硬解析,然后根据先前的执行统计信息生成一个计划。 customers再次查询表。例如,输入以下语句:
SELECT /*+gather_plan_statistics*/ * FROM customers WHERE cust_state_province='CA' AND country_id='US';- 在光标中查询计划。
以下示例显示了执行计划(包括示例输出):
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计划指令尚未使用。 - 查询游标以进行
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查询的新计划,以及一个新的子游标。 - 确认存在一个SQL计划指令,并且该指令可用于其他语句。
例如,运行以下查询,该查询与原始
customers查询相似但不相同(状态为,MA而不是CA):SELECT /*+gather_plan_statistics*/ CUST_EMAIL FROM CUSTOMERS WHERE CUST_STATE_PROVINCE='MA' AND COUNTRY_ID='US'; - 在光标中查询计划。
以下语句查询游标(包括示例输出):
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指令,还使用了动态统计信息。
也可以看看:
- “ 自动重新优化 ”
- “ 管理SQL计划指令 ”
- Oracle数据库参考学习
DBA_SQL_PLAN_DIRECTIVES,V$SQL和其他数据库视图 - Oracle数据库参考以了解
DBMS_SPD
10.4.2.5优化程序如何使用扩展和SQL计划指令:示例
该示例显示了数据库如何使用SQL计划指令,直到优化程序验证扩展是否存在并且统计信息适用。
此时,伪指令将其状态更改为SUPERSEDED。随后的编译使用统计信息而不是指令。
假设条件
本示例假定您已经按照“ 优化程序如何使用SQL Plan指令:示例 ”中的步骤进行操作。
要查看优化器如何使用扩展和SQL计划指令:
- 收集
sh.customers表的统计信息。例如,执行以下PL / SQL程序:
BEGIN DBMS_STATS.GATHER_TABLE_STATS('SH','CUSTOMERS'); END; / - 检查表中是否存在扩展名
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_province和country_id列上存在列组扩展名。 - 查询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。随后的编译使用统计信息而不是指令。 - 查询
sh.customers表。SELECT /*+gather_plan_statistics*/ * FROM customers WHERE cust_state_province='CA' AND country_id='US'; - 在光标中查询计划。
例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节显示优化器使用了指令,而不是扩展的统计信息。在编译期间,数据库验证了扩展的统计信息。 - 查询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计划伪指令。 sh.customers使用稍有不同的语句形式再次查询表。例如,运行以下查询:
SELECT /*+gather_plan_statistics*/ /* force reparse */ * FROM customers WHERE cust_state_province='CA' AND country_id='US';如果光标位于共享的SQL区域中,则数据库通常会共享该光标。要强制重新解析,此步骤通过添加注释来稍微更改SQL文本。
- 在光标中查询计划。
例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周内未使用,则数据库将自动清除该指令。
也可以看看:
- “ 管理SQL计划指令 ”
- Oracle数据库参考学习
DBA_SQL_PLAN_DIRECTIVES,V$SQL和其他数据库视图 - Oracle数据库参考以了解
DBMS_SPD
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子句的查询使用动态统计信息。
也可以看看:
- “ 配置动态统计信息的选项 ”
- “ 关于列组的统计信息 ”
- Oracle数据库参考,了解
OPTIMIZER_DYNAMIC_SAMPLING初始化参数
10.4.4数据库如何采样数据
在优化开始时,当确定表是否为动态统计信息的候选者时,优化器将检查表上是否存在持久性SQL计划指令。
对于每个指令,优化器将注册一个统计表达式,该统计表达式将在确定涉及表的谓词的基数时由优化器计算。
在图10-2中,数据库发出一个递归SQL语句来扫描表块的一个随机样本。该数据库应用相关的单表谓词和联接以估计谓词基数。
该数据库将动态统计信息的结果保留为可共享的统计信息。数据库可以在一个查询的SQL编译期间与重新编译同一查询时共享结果。数据库还可以将结果重用于具有相同模式的查询。
也可以看看:
- “ 配置动态统计信息的选项 ”以学习如何设置动态统计信息的级别
- 《 Oracle数据库参考》中有关
OPTIMIZER_DYNAMIC_SAMPLING初始化参数的 详细信息




