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

Oracle 19C 关于优化器统计信息首选项(默认值)

原创 Asher.HU 2021-02-04
2265

12.2设置优化器统计信息首选项

本主题说明如何使用DBMS_STATS.SET_*_PREFS过程设置优化器统计信息的默认值

 

 

12.2.1关于优化器统计信息首选项

优化统计偏好设置的自动统计数据收集所使用的参数的默认值和DBMS_STATS收集程序的统计数据。

 

 

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 :       此首选项确定数据库是否在不执行全表扫描的情况下维护分区表的全局统计信息。可能的值为TRUEFALSE

    例如,默认设置为INCREMENTALFALSE您可以设置INCREMENTALTRUE时的最后几个分区更新了范围分区表。此外,在一个非分区表进行分区交换操作时,Oracle建议您设置INCREMENTALTRUEINCREMENTAL_LEVELTABLE使用这些设置,可以DBMS_STATS在此表上收集表级概要。

  • INCREMENTAL_LEVEL : 此首选项控制将INCREMENTAL首选项设置为时要收集的概要TRUE。它有两个值:TABLEPARTITION
  • APPROXIMATE_NDV_ALGORITHM : 此首选项控制在使用增量统计信息计算分区表的不同值的数量时使用哪种算法。
  • ROOT_TRIGGER_PDB 此首选项控制是接受还是拒绝从CDB中的应用程序根目录触发的统计信息收集。

    默认情况下,聚集在应用程序根目录元数据联表统计信息时,如果统计应用PDB是陈旧的,数据库的确触发统计数据收集应用PDB。设置为时TRUEROOT_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函数。

设置统计信息首选项时,优先顺序为:

  1. 表首选项(为特定表,模式中的所有表或数据库中的所有表设置)
  2. 全球偏好
  3. 默认首选项

下表总结了相关DBMS_STATS过程。

表12-1设置优化程序统计信息首选项的DBMS_STATS过程

程序范围

SET_TABLE_PREFS

仅指定表。

SET_SCHEMA_PREFS

指定架构中的所有现有表。

此过程将调用SET_TABLE_PREFS指定架构中的每个表。调用SET_SCHEMA_PREFS不会影响运行后创建的任何新表。新表使用GLOBAL_PREF所有参数值。

SET_DATABASE_PREFS

数据库中所有用户定义的模式。您可以通过将参数设置为来包含系统拥有的架构,例如SYS SYSTEMADD_SYStrue

此过程将调用SET_TABLE_PREFS指定架构中的每个表。调用SET_DATABASE_PREFS不会影响运行后创建的任何新对象。新对象使用GLOBAL_PREF所有参数值。

SET_GLOBAL_PREFS

没有现有表首选项的任何表。

除非设置了表首选项或在DBMS_STATS.GATHER_*_STATS语句中显式设置了参数,否则所有参数默认为全局设置所做的更改SET_GLOBAL_PREFS会影响运行后创建的任何新对象。新对象使用SET_GLOBAL_PREFS所有参数值。

使用SET_GLOBAL_PREFS,您可以设置参数的默认值AUTOSTATS_TARGET此附加参数控制在夜间维护窗口中运行的自动统计信息收集作业会影响哪些对象。对于可能的值AUTOSTATS_TARGETALLORACLEAUTO(默认值)。

您只能CONCURRENT在全局级别设置首选项。您不能INCREMENTAL_LEVEL使用设置偏好SET_GLOBAL_PREFS


也可以看看:

 

12.2.1.4统计信息优先级覆盖 

preference_overrides_parameter统计信息首选项确定在收集优化器统计信息时是否使用统计信息首选项覆盖参数的输入值这样,您可以控制数据库何时接受传递给统计信息收集过程的参数值。

preference_overrides_parameter设置为FALSE(默认),用于收集统计程序的输入值很荣幸。设置为时TRUE,将忽略输入值。

设置preference_overrides_parameter使用偏好SET_TABLE_PREFSSET_SCHEMA_PREFSSET_GLOBAL_PREFS在过程中DBMS_STATS无论是否preference_overrides_parameter设置,数据库都使用相同的优先级来设置统计信息:

  1. 表首选项(为特定表,模式中的所有表或数据库中的所有表设置)
  2. 全球偏好
  3. 默认首选项

示例12-1在表级别覆盖统计信息首选项

在此示例中,旧脚本estimate_percent明确设置,而不是使用Recommendation设置AUTO_SAMPLE_SIZE您的目标是防止用户使用这些脚本在sh.costs上设置首选项

表12-2在表级别覆盖统计信息首选项

行动描述
SQL> SELECT DBMS_STATS.GET_PREFS 
('estimate_percent', 'sh','costs') 
AS "STAT_PREFS" FROM DUAL;
 
STAT_PREFS
----------
DBMS_STATS.AUTO_SAMPLE_SIZE
复制

没有estimate_percentsh.costs或在全局级别设置首选项,因此首选项默认为AUTO_SAMPLE_SIZE

SQL> EXEC DBMS_STATS.SET_TABLE_PREFS 
('sh', 'costs', 
'preference_overrides_parameter', 'true');
 
PL/SQL procedure successfully completed.
复制

默认情况下,Oracle数据库接受传递给GATHER_*_STATS过程的首选项要覆盖这些参数,可以使用SET_TABLE_PREFSpreference_overrides_parameter首选项设置truecosts

SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS
('sh', 'costs', estimate_percent=>100);

PL/SQL procedure successfully completed.
复制

您尝试设置estimate_percent100收集统计时sh.costs但是,由于preference_overrides_parametertrue用于该表的,因此Oracle Database不接受该estimate_percent=>100设置。相反,数据库使用AUTO_SAMPLE_SIZE缺省值收集统计信息


示例12-2在全局级别覆盖统计信息首选项

在此示例中,您设置estimate_percent5全局级别,这意味着此首选项适用于数据库中设置表首选项的每个表然后,您在sh.sales没有设置表级首选项的表上设置替代,以防止用户覆盖其脚本中的全局设置。

表12-3全局级别的覆盖统计信息首选项

行动描述
SQL> SELECT DBMS_STATS.GET_PREFS 
('estimate_percent', 'sh','sales') 
AS "STAT_PREFS" FROM DUAL;
 
STAT_PREFS
----------
DBMS_STATS.AUTO_SAMPLE_SIZE
复制

没有estimate_percentsh.sales或在全局级别设置首选项,因此首选项默认为AUTO_SAMPLE_SIZE

SQL> EXEC DBMS_STATS.SET_GLOBAL_PREFS 
('estimate_percent', '5');

PL/SQL procedure successfully completed.
复制

您可以使用该SET_GLOBAL_PREFS程序的设置estimate_percent优先5于在不具有表首集的数据库中的每个表。

SQL> SELECT DBMS_STATS.GET_PREFS 
('estimate_percent', 'sh','sales') 
AS "STAT_PREFS" FROM DUAL;
 
STAT_PREFS
----------
5
复制

因为sh.sales没有首选项设置,所以全局设置适用于此表。现在查询首选项将sh.sales显示estimate_percent设置为5,这是全局设置。

SQL> EXEC DBMS_STATS.SET_TABLE_PREFS 
('sh', 'sales', 
'preference_overrides_parameter', 'true');
 
PL/SQL procedure successfully completed.
复制

可以将SET_TABLE_PREFSpreference_overrides_parameter首选项设置truesh.sales

SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS
('sh', 'sales', estimate_percent=>10);

PL/SQL procedure successfully completed.
复制

您尝试设置estimate_percent10收集统计时sh.sales但是,由于preference_overrides_parametertrue用于sales表的,并且因为定义了全局首选项,所以Oracle数据库实际上使用的全局设置来收集统计信息5

也可以看看:

Oracle Database PL / SQL软件包和类型参考,以了解DBMS_STATS设置优化程序统计信息过程

 

12.2.1.5设置统计信息首选项:示例

本实施例说明的关系SET_TABLE_PREFSSET_SCHEMA_STATSSET_DATABASE_PREFS

表12-4更改统计信息收集过程的首选项

行动描述
SQL> SELECT DBMS_STATS.GET_PREFS 
('incremental', 'sh','costs') 
AS "STAT_PREFS" FROM DUAL;
 
STAT_PREFS
----------
TRUE
复制

您查询INCREMENTAL首选项costs并确定将其设置为true

SQL> EXEC DBMS_STATS.SET_TABLE_PREFS 
('sh', 'costs', 'incremental', 'false');
 
PL/SQL procedure successfully completed.
复制

可以将SET_TABLE_PREFSINCREMENTAL首选项设置falsecosts

SQL> SELECT DBMS_STATS.GET_PREFS 
('incremental', 'sh', 'costs') 
AS "STAT_PREFS" FROM DUAL;

STAT_PREFS 
----------
FALSE
复制

您查询INCREMENTAL首选项costs并确认将其设置为false

SQL> EXEC DBMS_STATS.SET_SCHEMA_PREFS 
('sh', 'incremental', 'true');

PL/SQL procedure successfully completed.
复制

您可以模式中的每个表(包括)SET_SCHEMA_PREFSINCREMENTAL首选项设置true shcosts

SQL> SELECT DBMS_STATS.GET_PREFS 
('incremental', 'sh', 'costs') 
AS "STAT_PREFS" FROM DUAL;
 
STAT_PREFS
----------
TRUE
复制

您查询INCREMENTAL首选项costs并确认将其设置为true

SQL> EXEC DBMS_STATS.SET_DATABASE_PREFS 
('incremental', 'false');

PL/SQL procedure successfully completed.
复制

您可以SET_DATABASE_PREFSINCREMENTAL所有用户定义模式中所有表首选项设置false

SQL> SELECT DBMS_STATS.GET_PREFS 
('incremental', 'sh', 'costs') 
AS "STAT_PREFS" FROM DUAL;

STAT_PREFS
----------
FALS
复制

您查询INCREMENTAL首选项costs并确认将其设置为false

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

评论