0427建立Extended Statistics函数索引问题

[20160427]建立Extended Statistics 和函数索引问题.txt

--11G支持相关数据的统计分析,比如如果两个字段存在相关性通过分析,能够得到更加良好的统计信息,以及生成好的执行计划.
--但是如果结合函数索引呢?通过一个简单的例子来说明:

1.环境:

SCOTT@book> @ &r/ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

SCOTT@book> create table t (a number, b date);
Table created.

2.建立Extended Statistics:

SCOTT@book> select dbms_stats.create_extended_stats(user,'T','(a,trunc(b))') from dual;
select dbms_stats.create_extended_stats(user,'T','(a,trunc(b))') from dual
       *
ERROR at line 1:
ORA-20001: Invalid Extension: Column group can contain only columns seperated by comma

--可以看出建立 Column group仅仅包含字段,使用,隔开.

SCOTT@book> select dbms_stats.create_extended_stats(user,'T','(a,b)') from dual;
DBMS_STATS.CREATE_EXTENDED_STATS(USER,'T','(A,B)')
--------------------------------------------------
SYS_STUNA$6DVXJXTP05EH56DTIR0X

SCOTT@book> exec dbms_stats.drop_extended_stats(user,'T','(a,b)') ;
PL/SQL procedure successfully completed.

--建立函数索引看看.
SCOTT@book> create index if_t_ab on t(a,trunc(b));
Index created.

SCOTT@book> select dbms_stats.create_extended_stats(user,'T','(a,trunc(b))') from dual;
DBMS_STATS.CREATE_EXTENDED_STATS(USER,'T','(A,TRUNC(B))')
----------------------------------------------------------
SYS_STUE4B2X1G802ME0XHTBYWFY_Q

--可以发现建立函数索引后才可以建立相关Extended Statistics.

SCOTT@book> exec dbms_stats.drop_extended_stats(user,'T','(a,trunc(b))');
BEGIN dbms_stats.drop_extended_stats(user,'T','(a,trunc(b))'); END;

*
ERROR at line 1:
ORA-20000: extension "(a,trunc(b))" does not exist
ORA-06512: at "SYS.DBMS_STATS", line 8755
ORA-06512: at "SYS.DBMS_STATS", line 33459
ORA-06512: at line 1

--可以发现这样建立了无法删除.删除函数索引看看.

SCOTT@book> drop index if_t_ab ;
Index dropped.

SCOTT@book> exec dbms_stats.drop_extended_stats(user,'T','(a,trunc(b))');
PL/SQL procedure successfully completed.

--换一句话讲你要建立某个函数+字段的相关扩张统计,必须绕一个弯,先建立索引,才可以建立.
--删除函数索引后扩展统计并不消失.

3.进一步重复测试:
SCOTT@book> insert into  t values (1,sysdate);
1 row created.

SCOTT@book> commit ;
Commit complete.

SCOTT@book> select owner,table_name,column_name,data_type,data_default from DBA_TAB_COLS where owner=user and table_name='T';
OWNER  TABLE_NAME COLUMN_NAME          DATA_TYPE  DATA_DEFAULT
------ ---------- -------------------- ---------- ---------------
SCOTT  T          B                    DATE
SCOTT  T          A                    NUMBER

SCOTT@book> create index if_t_ab on t(a,trunc(b));
Index created.

SCOTT@book> select owner,table_name,column_name,data_type,data_default,hidden_column,virtual_column from DBA_TAB_COLS where owner=user and table_name='T';
OWNER  TABLE_NAME COLUMN_NAME          DATA_TYPE  DATA_DEFAULT                   HID VIR
------ ---------- -------------------- ---------- ------------------------------ --- ---
SCOTT  T          SYS_NC00003$         DATE       TRUNC("B")                     YES YES
SCOTT  T          B                    DATE                                      NO  NO
SCOTT  T          A                    NUMBER                                    NO  NO

--可以发现在建立函数索引时自动建立函数索引中里面函数作为hidden_column,virtual_column .

SCOTT@book> select dbms_stats.create_extended_stats(user,'T','(a,trunc(b))') from dual;
DBMS_STATS.CREATE_EXTENDED_STATS(USER,'T','(A,TRUNC(B))')
---------------------------------------------------------
SYS_STUE4B2X1G802ME0XHTBYWFY_Q

SCOTT@book> column data_default format a40
SCOTT@book> select owner,table_name,column_name,data_type,data_default,hidden_column,virtual_column from DBA_TAB_COLS where owner=user and table_name='T';
OWNER  TABLE_NAME COLUMN_NAME                    DATA_TYPE  DATA_DEFAULT                             HID VIR
------ ---------- ------------------------------ ---------- ---------------------------------------- --- ---
SCOTT  T          SYS_STUE4B2X1G802ME0XHTBYWFY_Q NUMBER     SYS_OP_COMBINED_HASH("A",TRUNC("B"))     YES YES
SCOTT  T          SYS_NC00003$                   DATE       TRUNC("B")                               YES YES
SCOTT  T          B                              DATE                                                NO  NO
SCOTT  T          A                              NUMBER                                              NO  NO

SCOTT@book> drop index if_t_ab ;
Index dropped.

SCOTT@book> select owner,table_name,column_name,data_type,data_default,hidden_column,virtual_column from DBA_TAB_COLS where owner=user and table_name='T';
OWNER  TABLE_NAME COLUMN_NAME                    DATA_TYPE  DATA_DEFAULT                             HID VIR
------ ---------- ------------------------------ ---------- ---------------------------------------- --- ---
SCOTT  T          SYS_STUE4B2X1G802ME0XHTBYWFY_Q NUMBER     SYS_OP_COMBINED_HASH("A",TRUNC("B"))     YES YES
SCOTT  T          B                              DATE                                                NO  NO
SCOTT  T          A                              NUMBER                                              NO  NO

--可以发现删除索引后,某个函数+字段的相关扩张统计还在.其他版本没有环境无法测试.留给大家测试.

时间: 2024-07-31 11:08:09

0427建立Extended Statistics函数索引问题的相关文章

0429建立Extended Statistics函数索引问题

[20160429]建立Extended Statistics 和函数索引问题.txt --11G支持相关数据的统计分析,比如如果两个字段存在相关性通过分析,能够得到更加良好的统计信息,以及生成好的执行计划. --但是如果结合函数索引呢?通过一个简单的例子来说明: --前次做的测试: http://blog.itpub.net/267265/viewspace-2089119/ 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                  

[20171202]关于函数索引的状态.txt

[20171202]关于函数索引的状态.txt --//我曾经在一篇贴子提到索引可以disable吗?链接: --//http://blog.itpub.net/267265/viewspace-2123537/ --//实际上仅仅函数索引能disable,为什么呢?实际上自己以前并不搞清楚实际上这个跟oracle使用函数的特殊性有关. --//如果一个表删除某个字段,对应的索引也会删除.如果定义的函数删除了,对应的函数索引呢?通过例子来说明问题: 1.环境: SCOTT@test01p> @

[20140111]trunc与函数索引.txt

经常看sql语句,经常会遇到使用函数trunc(create_date)的情况,这种情况经常出现. 很多情况下,是开发人员的无知,实际上修改为create_date between trunc(sysdate) and trunc(sysdate+1)-1/86400就ok了. 就可以避免函数索引的建立,但是我这里提到的情况是这种函数索引是否对普通的查询是否有效. 拿scott.emp表来说. create index if_emp_hiredate on emp(trunc(hiredate)

Oracle之函数索引

Oracle之函数索引 在Oracle中,有一类特殊的索引,称为函数索引(Function-Based Indexes,FBI),它基于对表中列进行计算后的结果创建索引.函数索引在不修改应用程序的逻辑基础上提高了查询性能.如果没有函数索引,那么任何在列上执行了函数的查询都不能使用这个列的索引.当在查询中包含该函数时,数据库才会使用该函数索引.函数索引可以是一个B-Tree索引或位图索引. 用于生成索引的函数可以是算术表达式,也可以是一个包含SQL函数.用户定义PL/SQL函数.包函数,或C调用的

[20120130]函数索引与取max值的问题1.txt

[20120130]函数索引与取max值的问题1.txt 1.建立测试例子:SQL> select * from v$version ;BANNER----------------------------------------------------------------Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64biPL/SQL Release 10.2.0.3.0 - ProductionCORE    10

@dbsnake-用合适的函数索引来避免看似无法避免的全表扫描

昨天听了@dbsnake的SQL方法论,感觉比第一次要更有感觉,希望对实际工作能有帮助. 昨天讲到一处利用reverse函数建立索引,避免全表扫描的case,颇有感触,拿出来试一下. SQL> create table rev (id number, name varchar2(5)); Table created. SQL> select * from rev;         ID NAME ---------- -----          1 abc          2 bc    

PHP函数索引(3)

函数|索引 mcrypt_ecb: 使用 ECB 将资料加/解密. mcrypt_get_block_size: 取得编码方式的区块大小. mcrypt_get_cipher_name: 取得编码方式的名称. mcrypt_get_key_size: 取得编码钥匙大小. mcrypt_ofb: 使用 OFB 将资料加/解密. md5: 计算字符串的 MD5 哈稀. mhash: 计算哈稀值. mhash_count: 取得哈稀 ID 的最大值. mhash_get_block_size: 取得哈

在Informix中创建并使用函数索引

随着数据量以惊人速度不断增长,数据库管理系统将继续关注性能问题.本文主要介绍一种名为函数索引(functional index)的性能调优技术.根据数据库使用情况的统计信息创建并使用函数索引,可以显著提升SELECT 查询的性能.通过本文了解如何在IBM Informix Dynamic Server 中创建和使用函数索引并最大限度提升查询性能. 简介 在选择数据库管理系统(DBMS)时,性能是一个关键的考虑因素.在执行SELECT.INSERT.UPDATE 和 DELETE 操作时,很多因素

警惕!自定义函数索引的那些陷阱及避坑术

作者介绍 丁俊,DBAplus社群联合发起人,新炬网络专家团成员,性能优化专家,Oracle ACEA,ITPUB开发版资深版主.十年电信行业从业经验,从事过系统开发与维护.业务架构和数据分析.系统优化等工作.电子工业出版社终身荣誉作者,<剑破冰山-Oracle开发艺术>副主编.   当我们对列使用了函数运算之后,如果此列没有函数索引,那么普通索引是无效的.比如where substr(name,1,3)='abc';如果建立了create INDEX idx_t ON t(NAME);