12.2设置优化器统计信息首选项
本主题说明如何使用DBMS_STATS.SET_*_PREFS
过程设置优化器统计信息的默认值。
- 关于优化统计数字 : 的优化统计偏好设置通过自动统计数据收集所使用的参数的默认值和
DBMS_STATS
收集程序的统计数据。 - 设置使用云控制全局优化统计数字 : 的全球优先适用于任何物体,它的数据库不具有一个现有的表偏好。您可以使用Cloud Control在全局级别设置优化器统计信息首选项。
- 使用Cloud Control设置对象级优化器统计信息首选项 : 您可以使用Cloud Control在数据库,架构和表级别设置优化器统计信息首选项。
- 从命令行设置优化器统计信息首选项 : 如果您不使用Cloud Control设置优化器统计信息首选项,则可以从命令行调用
DBMS_STATS
过程。
12.2.1关于优化器统计信息首选项
该优化统计偏好设置的自动统计数据收集所使用的参数的默认值和DBMS_STATS
收集程序的统计数据。
- 优化程序统计信息首 : 选项的目的使用首选项,您可以在某些对象需要与默认设置不同的设置时自动维护优化程序统计信息。
- 统计信息首选项示例 : 使用过程的
pname
参数设置首选项。SET_*_PREFS
- DBMS_STATS设置统计信息首选项 : 的
DBMS_STATS.SET_*_PREFS
过程该过程更改过程使用的参数的缺省值DBMS_STATS.GATHER_*_STATS
。要查询当前首选项,请使用DBMS_STATS.GET_PREFS
函数。 - 统计信息首选项覆盖统计信息首选项确定在收集优化器统计信息时是否
用preference_overrides_parameter
统计信息首选项覆盖参数的输入值。这样,您可以控制数据库何时接受传递给统计信息收集过程的参数值。 - 设置统计数字:实施例 : 本实施例说明的关系
SET_TABLE_PREFS
,SET_SCHEMA_STATS
和SET_DATABASE_PREFS
。
12.2.1.1优化器统计信息首选项的目的
使用首选项,可以在某些对象需要与默认设置不同的设置时自动维护优化器统计信息。
首选项使您可以更精细地控制Oracle数据库如何收集统计信息。您可以在以下级别上设置优化器统计信息首选项:
- 表
- 架构图
- 数据库(所有表)
- 全局(无首选项的表以及将来创建的任何表)
DBMS_STATS
设置首选项的过程具有形式名称SET_*_PREFS
。
12.2.1.2统计首选项示例
使用过程的pname
参数设置首选项。 SET_*_PREFS
您可以设置的首选项包括但不限于以下内容:
ESTIMATE_PERCENT :
此首选项确定要估计的行的百分比。CONCURRENT :
此首选项确定数据库是同时收集多个对象的统计信息,还是一次收集一个对象的统计信息。STALE_PERCENT :
此首选项确定在数据库认为统计数据过时且需要重新收集之前,表中必须更改的行的百分比。AUTO_STAT_EXTENSIONS:
当设置为的非默认值时ON
,此首选项将启用SQL计划指令以根据工作负载中谓词中列的使用来触发列组统计信息的创建。INCREMENTAL :
此首选项确定数据库是否在不执行全表扫描的情况下维护分区表的全局统计信息。可能的值为TRUE
和FALSE
。例如,默认设置为
INCREMENTAL
是FALSE
。您可以设置INCREMENTAL
到TRUE
时的最后几个分区更新了范围分区表。此外,在一个非分区表进行分区交换操作时,Oracle建议您设置INCREMENTAL
要TRUE
和INCREMENTAL_LEVEL
到TABLE
。使用这些设置,可以DBMS_STATS
在此表上收集表级概要。INCREMENTAL_LEVEL :
此首选项控制将INCREMENTAL
首选项设置为时要收集的概要TRUE
。它有两个值:TABLE
或PARTITION
。APPROXIMATE_NDV_ALGORITHM :
此首选项控制在使用增量统计信息计算分区表的不同值的数量时使用哪种算法。ROOT_TRIGGER_PDB :
此首选项控制是接受还是拒绝从CDB中的应用程序根目录触发的统计信息收集。默认情况下,聚集在应用程序根目录元数据联表统计信息时,如果统计应用PDB是陈旧的,数据库的确不触发统计数据收集应用PDB。设置为时
TRUE
,ROOT_TRIGGER_PDB
将触发在应用程序PDB上收集统计信息,然后在应用程序根目录中导出全局统计信息。
也可以看看:
Oracle Database PL / SQL软件包和类型参考,以了解有关DBMS_STATS
设置优化器统计信息首选项的过程
12.2.1.3 DBMS_STATS设置统计信息首选项的过程
该DBMS_STATS.SET_*_PREFS
过程更改了该过程使用的参数的默认值DBMS_STATS.GATHER_*_STATS
。要查询当前首选项,请使用DBMS_STATS.GET_PREFS
函数。
设置统计信息首选项时,优先顺序为:
- 表首选项(为特定表,模式中的所有表或数据库中的所有表设置)
- 全球偏好
- 默认首选项
下表总结了相关DBMS_STATS
过程。
表12-1设置优化程序统计信息首选项的DBMS_STATS过程
程序 | 范围 |
---|---|
| 仅指定表。 |
| 指定架构中的所有现有表。 此过程将调用 |
| 数据库中所有用户定义的模式。您可以通过将参数设置为来包含系统拥有的架构,例如 此过程将调用 |
| 没有现有表首选项的任何表。 除非设置了表首选项或在 使用 您只能 |
也可以看看:
- “ 关于并发统计信息收集 ”
- Oracle Database PL / SQL软件包和类型参考,以了解有关
DBMS_STATS
设置优化器统计信息首选项的过程
12.2.1.4统计信息优先级覆盖
preference_overrides_parameter
统计信息首选项确定在收集优化器统计信息时是否使用统计信息首选项覆盖参数的输入值。这样,您可以控制数据库何时接受传递给统计信息收集过程的参数值。
当preference_overrides_parameter
设置为FALSE
(默认),用于收集统计程序的输入值很荣幸。设置为时TRUE
,将忽略输入值。
设置preference_overrides_parameter
使用偏好SET_TABLE_PREFS
,SET_SCHEMA_PREFS
或SET_GLOBAL_PREFS
在过程中DBMS_STATS
。无论是否preference_overrides_parameter
设置,数据库都使用相同的优先级来设置统计信息:
- 表首选项(为特定表,模式中的所有表或数据库中的所有表设置)
- 全球偏好
- 默认首选项
示例12-1在表级别覆盖统计信息首选项
在此示例中,旧脚本estimate_percent
明确设置,而不是使用Recommendation设置AUTO_SAMPLE_SIZE
。您的目标是防止用户使用这些脚本在sh.costs
表上设置首选项。
表12-2在表级别覆盖统计信息首选项
行动 | 描述 |
---|---|
| 没有 |
| 默认情况下,Oracle数据库接受传递给 |
| 您尝试设置 |
示例12-2在全局级别覆盖统计信息首选项
在此示例中,您设置estimate_percent
为5
全局级别,这意味着此首选项适用于数据库中未设置表首选项的每个表。然后,您在sh.sales
没有设置表级首选项的表上设置替代,以防止用户覆盖其脚本中的全局设置。
表12-3全局级别的覆盖统计信息首选项
行动 | 描述 |
---|---|
| 没有 |
| 您可以使用该 |
| 因为 |
| 您仅可以将表 |
| 您尝试设置 |
也可以看看:
Oracle Database PL / SQL软件包和类型参考,以了解DBMS_STATS
设置优化程序统计信息的过程
12.2.1.5设置统计信息首选项:示例
本实施例说明的关系SET_TABLE_PREFS
,SET_SCHEMA_STATS
和SET_DATABASE_PREFS
。
表12-4更改统计信息收集过程的首选项
行动 | 描述 |
---|---|
SQL> SELECT DBMS_STATS.GET_PREFS ('incremental', 'sh','costs') AS "STAT_PREFS" FROM DUAL; STAT_PREFS ---------- TRUE | 您查询 |
SQL> EXEC DBMS_STATS.SET_TABLE_PREFS ('sh', 'costs', 'incremental', 'false'); PL/SQL procedure successfully completed. | 您仅可以将表 |
SQL> SELECT DBMS_STATS.GET_PREFS ('incremental', 'sh', 'costs') AS "STAT_PREFS" FROM DUAL; STAT_PREFS ---------- FALSE | 您查询 |
SQL> EXEC DBMS_STATS.SET_SCHEMA_PREFS ('sh', 'incremental', 'true'); PL/SQL procedure successfully completed. | 您可以将模式中的每个表(包括) |
SQL> SELECT DBMS_STATS.GET_PREFS ('incremental', 'sh', 'costs') AS "STAT_PREFS" FROM DUAL; STAT_PREFS ---------- TRUE | 您查询 |
SQL> EXEC DBMS_STATS.SET_DATABASE_PREFS ('incremental', 'false'); PL/SQL procedure successfully completed. | 您可以 |
SQL> SELECT DBMS_STATS.GET_PREFS ('incremental', 'sh', 'costs') AS "STAT_PREFS" FROM DUAL; STAT_PREFS ---------- FALS | 您查询 |