代码改变世界

11G新特性 -- Expression Statistics

  abce  阅读(346)  评论(0编辑  收藏  举报

当在查询中使用了function,返回值会受到影响。

比如:

select count(*) from customers where lower(cust_state_province)='ca';

优化器只知道原先列上的统计信息,而不知道被lower函数转后以后的统计信息,列的选择性会受到影响,但是优化器去无法得知。 对于sql语句谓词中的列使用了函数以后,优化器会简单的认为该列的选择性为1%。这样就会导致执行计划发生改变。

在oracle 10g中,只会针对几种列的表达式进行Expression Statistics收集。如表达式要能保持数据的分布特征和列的分布特征相同,比如to_number()。

在oracle 11g中,数据库使用Expression Statistics,包括用户定义的函数、基于索引的函数。该新特性依赖虚拟列来创建表达式统计信息。

 

创建Expression Statistics

SQL> select dbms_stats.create_extended_stats(null,'customers','(lower(cust_state_province))') from dual;

DBMS_STATS.CREATE_EXTENDED_STATS(NULL,'CUSTOMERS','(LOWER(CUST_STATE_PROVINCE))'
--------------------------------------------------------------------------------
SYS_STUBPHJSBRKOIK9O2YV3W8HOUE

或者
SQL> exec dbms_stats.gather_table_stats(null,'customers',method_opt => 'for all columns size skewonly for columns (lower(cust_state_province)) skewonly');

 

查看

SQL> select extension_name,extension from dba_stat_extensions where table_name='CUSTOMERS';

EXTENSION_NAME                 EXTENSION
------------------------------ --------------------------------------------------------------------------------
SYS_STUBPHJSBRKOIK9O2YV3W8HOUE (LOWER("CUST_STATE_PROVINCE"))

 

删除

SQL> exec dbms_stats.drop_extended_stats('sh','customers','(lower(cust_state_province))');

 

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示