管理统计
本节包括以下主题:
■Pending Statistics 待定统计
■Managing Extended Statistics 管理扩展统计
■Restoring Previous Versions of Statistics 还原以前版本的统计信息
■Exporting and Importing Statistics 导出和导入统计信息
■Restoring Statistics Versus Importing or Exporting Statistics 恢复统计信息与导入或导出统计信息
■Locking Statistics for a Table or Schema 锁定表或模式的统计信息
■Setting Statistics 设置统计
■Handling Missing Statistics 处理缺失的统计信息
5.1 待定统计
从Oracle Database 11g第2版(11.2)开始,您在收集统计信息时有以下选项:
■在收集操作结束时自动发布统计信息(默认行为)
■保存保存为待处理的新统计信息
将新统计信息保存为待处理状态允许您验证新统计信息并仅在满意时发布它们。
要检查统计信息是否会在收集后立即自动发布,请使用DBMS_STATS包,如下所示:
SELECT DBMS_STATS.GET_PREFS('PUBLISH') PUBLISH FROM DUAL;
前面的查询返回TRUE或FALSE。 TRUE表示统计信息将在收集时发布,而FALSE表示统计信息将保持挂起状态。
您可以在架构或表级别更改PUBLISH设置。 例如,要更改SH模式中customers表的PUBLISH设置,请执行以下语句:
EXEC DBMS_STATS.SET_TABLE_PREFS('SH', 'CUSTOMERS', 'PUBLISH', 'false');
随后,当您收集customers表的统计信息时,收集作业完成时将不会自动发布统计信息。 而是,数据库将新收集的统计信息存储在USER_TAB_PENDING_STATS表中。
默认情况下,优化程序使用存储在数据字典视图中的已发布统计信息。 如果希望优化器使用新收集的挂起统计信息,则将初始化参数OPTIMIZER_USE_PENDING_STATISTICS设置为TRUE(默认值为FALSE),并针对表或模式运行工作负载:
ALTER SESSION SET OPTIMIZER_USE_PENDING_STATISTICS = TRUE;
在编译SQL语句时,优化器将使用挂起的统计信息而不是已发布的统计信息。 如果挂起的统计信息有效,则可以通过执行以下语句将它们公开:
EXEC DBMS_STATS.PUBLISH_PENDING_STATS(null, null);
您还可以发布特定数据库对象的挂起统计信息。 例如,通过使用以下语句:
EXEC DBMS_STATS.PUBLISH_PENDING_STATS('SH','CUSTOMERS');
如果您不想发布挂起的统计信息,请通过执行以下语句将其删除:
EXEC DBMS_STATS.DELETE_PENDING_STATS('SH','CUSTOMERS');
您可以使用DBMS_STATS.EXPORT_PENDING_STATS函数导出挂起的统计信息。 将挂起的统计信息导出到测试系统使您可以针对新统计信息运行完整工作负载。
5.2 管理扩展统计
DBMS_STATS使您可以收集扩展统计信息,这些统计信息可以在表的不同列上存在多个谓词时或在谓词使用表达式时提高基数估计值。扩展名是列组或表达式。
Oracle数据库支持以下类型的扩展统计信息:
■列组统计信息
当同一个表中的多个列一起出现在SQL语句中时,这种类型的扩展统计信息可以提高基数估计值。请参阅“管理列组统计信息”。
■表达统计
当谓词使用表达式(例如,内置函数或用户定义函数)