為基於函式index所產生的虛擬列蒐集統計資訊!

warehouse發表於2008-04-16

在建立函式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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章