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 | 您查询 |




