当子句具有使用表达式的谓词时,称为表达式统计信息的扩展统计信息的类型将改进优化程序的估计
WHERE。对于应用于子句列的形式的表达式,除非存在基于函数的索引,否则优化器不知道此函数如何影响谓词基数。但是,您可以收集有关表达式本身的表达式统计信息。(function(col)=constant)WHERE(function(col)
下图显示了优化器使用统计信息来为使用函数的查询生成计划。顶部显示优化器检查该列的统计信息。底部显示了优化程序检查与查询中使用的表达式相对应的统计信息。表达式统计产生更准确的估计。
图14-2表达式统计
如图14-2所示,当表达式统计信息不可用时,优化器可能会产生次优计划。
本节包含以下主题:
也可以看看:
Oracle Database SQL语言参考以了解SQL函数
父主题: 管理表达式统计
14.2.1.1表达式统计有用时:示例
该sh.customers表的以下查询显示3341个客户位于加利福尼亚州:
sys@PROD> SELECT COUNT(*) FROM sh.customers WHERE cust_state_province='CA';
COUNT(*)
----------
3341
考虑LOWER()应用了功能的同一查询的计划:
sys@PROD> EXPLAIN PLAN FOR
2 SELECT * FROM sh.customers WHERE LOWER(cust_state_province)='ca';
Explained.
sys@PROD> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------
Plan hash value: 2008213504
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 555 | 108K| 406 (1)| 00:00:05 |
|* 1 | TABLE ACCESS FULL| CUSTOMERS | 555 | 108K| 406 (1)| 00:00:05 |
-------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(LOWER("CUST_STATE_PROVINCE")='ca')
因为不存在的表达式统计信息LOWER(cust_state_province)='ca',所以优化器估计值明显不正确。您可以使用DBMS_STATS过程来更正这些估计。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




