为基于函数index所产生的虚拟列搜集统计信息!

在创建函数index之后系统会自动产生虚拟列,而这一列也是隐藏的,在创建index时系统自动使用了compute statistics选项为创建的index搜集了statistics,然而并不会为生成的虚拟列搜集statistics,这时如果需要为虚拟列搜集statistics就需要重新分析表或者单独为虚拟列搜集statistics。

[@more@]

SQL> create table tt(id int , name char(1));

表已创建。

SQL> insert into tt values(1 , 'a');

已创建 1 行。

SQL> insert into tt values(2 , 'A');

已创建 1 行。

SQL> insert into tt values(3 , 'B');

已创建 1 行。

SQL> insert into tt values(4 , 'b');

已创建 1 行。

SQL> commit;

提交完成。

SQL> exec dbms_stats.gather_table_stats('XYS','TT');

PL/SQL 过程已成功完成。

SQL> select column_name
2 from user_tab_col_statistics
3 where table_name='TT';

COLUMN_NAME
------------------------------
ID
NAME

SQL> create index idx_tt on tt(upper(name));

索引已创建。

SQL> select table_name,column_name,hidden_column,virtual_column
2 from user_tab_cols
3 WHERE table_name='TT';

TABLE_NAME COLUMN_NAME HID VIR
------------------------------ ------------------------------ --- ---
TT SYS_NC00003$ YES YES
TT NAME NO NO
TT ID NO NO

--显然SYS_NC00003$是生成的虚拟列

SQL> exec dbms_stats.gather_index_stats('XYS','IDX_TT');

PL/SQL 过程已成功完成。

SQL> select column_name
2 from user_tab_col_statistics
3 where table_name='TT';

COLUMN_NAME
------------------------------
ID
NAME

--搜集index的statistics之后,虚拟列的statistics并没有被搜集

SQL> exec dbms_stats.gather_table_stats('XYS','TT');

PL/SQL 过程已成功完成。

SQL> select column_name
2 from user_tab_col_statistics
3 where table_name='TT';

COLUMN_NAME
------------------------------
ID
NAME
SYS_NC00003$

--重新分析表之后发现虚拟列的statistics被搜集了

--插入验证数据

SQL> insert into tt values(5 , 'c');

已创建 1 行。

SQL> commit;

提交完成。

SQL> select column_name,num_distinct
2 from user_tab_col_statistics
3 where table_name='TT';

COLUMN_NAME NUM_DISTINCT
------------------------------ ------------
ID 4
NAME 4
SYS_NC00003$ 2

--单独为虚拟列搜集statistics,因为我们清晰的看到尽管现在是5条数据,但是执行下面过程之后仅仅

是虚拟列SYS_NC00003$所对应 的NUM_DISTINCT由2变成了3,而id和name的NUM_DISTINCT都是4而不是5,

原因是使用了参数METHOD_OPT=>'for all hidden columns size AUTO',METHOD_OPT的default值是'for

all columns,因此通过使用参数METHOD_OPT=>'for all hidden columns size AUTO'可以单独为函数索引

所生成的虚拟列搜集statistics

SQL> exec dbms_stats.gather_table_stats(ownname=>'XYS',tabname=>'TT',METHOD_OPT=
>'for all hidden columns size AUTO');

PL/SQL 过程已成功完成。

SQL> select column_name,num_distinct
2 from user_tab_col_statistics
3 where table_name='TT';

COLUMN_NAME NUM_DISTINCT
------------------------------ ------------
ID 4
NAME 4
SYS_NC00003$ 3

SQL> select * from tt;

ID N
---------- -
1 a
2 A
3 B
4 b
5 c

SQL>

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/19602/viewspace-1002643/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/19602/viewspace-1002643/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值