您可以使用 DBMS_STATS.SEED_COL_USAGE 和 REPORT_COL_USAGE 根据指定的工作量来确定表需要哪些列组。
当您不知道要创建哪个扩展统计信息时,此技术很有用。此技术不适用于表达式统计信息。
假设条件
本教程假定以下内容:
- 对于使用引用列和的谓词
sh.customers_test的customers表查询(从表创建),基数估计不正确。country_idcust_state_province - 您希望数据库在5分钟(300秒)内监视您的工作负载。
- 您希望数据库确定自动需要哪些列组。
要检测列组:
- 启动SQL * Plus或SQL Developer,然后以user身份登录数据库
sh。 - 创建
customers_test表并为其收集统计信息:DROP TABLE customers_test; CREATE TABLE customers_test AS SELECT * FROM customer; EXEC DBMS_STATS.GATHER_TABLE_STATS(user, 'customers_test'); - 启用工作负载监视。
在另一个SQL * Plus会话中,连接为
SYS并运行以下PL / SQL程序以启用监视300秒:BEGIN DBMS_STATS.SEED_COL_USAGE(null,null,300); END; / - 以用户
sh身份,运行工作负载中两个查询的解释计划。以下示例显示了
customers_test表中两个查询的解释计划:EXPLAIN PLAN FOR SELECT * FROM customers_test WHERE cust_city = 'Los Angeles' AND cust_state_province = 'CA' AND country_id = 52790; SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY('plan_table', null,'basic rows')); EXPLAIN PLAN FOR SELECT country_id, cust_state_province, count(cust_city) FROM customers_test GROUP BY country_id, cust_state_province; SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY('plan_table', null,'basic rows'));输出示例如下:
PLAN_TABLE_OUTPUT --------------------------------------------------------------------------- Plan hash value: 4115398853 ---------------------------------------------------- | Id | Operation | Name | Rows | ---------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 1 | TABLE ACCESS FULL| CUSTOMERS_TEST | 1 | ---------------------------------------------------- 8 rows selected. PLAN_TABLE_OUTPUT --------------------------------------------------------------------------- Plan hash value: 3050654408 ----------------------------------------------------- | Id | Operation | Name | Rows | ----------------------------------------------------- | 0 | SELECT STATEMENT | | 1949 | | 1 | HASH GROUP BY | | 1949 | | 2 | TABLE ACCESS FULL| CUSTOMERS_TEST | 55500 | ----------------------------------------------------- 9 rows selected.第一个计划显示返回932行的查询的基数为1行。第二个计划显示返回145行的查询的1949行基数。
- (可选)查看为表记录的列使用情况信息。
调用该
DBMS_STATS.REPORT_COL_USAGE函数以生成报告:SET LONG 100000 SET LINES 120 SET PAGES 0 SELECT DBMS_STATS.REPORT_COL_USAGE(user, 'customers_test') FROM DUAL;该报告显示如下:
LEGEND: ....... EQ : Used in single table EQuality predicate RANGE : Used in single table RANGE predicate LIKE : Used in single table LIKE predicate NULL : Used in single table is (not) NULL predicate EQ_JOIN : Used in EQuality JOIN predicate NONEQ_JOIN : Used in NON EQuality JOIN predicate FILTER : Used in single table FILTER predicate JOIN : Used in JOIN predicate GROUP_BY : Used in GROUP BY expression ........................................................................... ########################################################################### COLUMN USAGE REPORT FOR SH.CUSTOMERS_TEST ......................................... 1. COUNTRY_ID : EQ 2. CUST_CITY : EQ 3. CUST_STATE_PROVINCE : EQ 4. (CUST_CITY, CUST_STATE_PROVINCE, COUNTRY_ID) : FILTER 5. (CUST_STATE_PROVINCE, COUNTRY_ID) : GROUP_BY ###########################################################################在上一个报告中,前三个列在第一个受监视的查询的相等谓词中使用:
... WHERE cust_city = 'Los Angeles' AND cust_state_province = 'CA' AND country_id = 52790;所有这三列都出现在同一
WHERE子句中,因此该报告将它们显示为组过滤器。在第二个查询中,该GROUP BY子句中出现了两列,因此报表将其标记为GROUP_BY。FILTER和GROUP_BY报表中的列集是列组的候选项。
也可以看看:
- “ 管理SQL调优集 ”
- Oracle Database PL / SQL软件包和类型参考以了解该
DBMS_STATS软件包
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




