cbo心得(選擇率,基數,直方圖)(四)

jlttt發表於2008-08-10
cbo心得(選擇率,基數,直方圖)(四)[@more@]存在表和索引上的統計資訊,存在直方圖

為了更明顯的說明直方圖的作用,我修改一下上面的建立的表,進一步的增加列ID的傾斜性。


SQL> drop table sunwg purge;

表已刪除。

SQL> create table sunwg (id number);

表已建立。

SQL> create index ind_sunwg on sunwg(id);

索引已建立。

SQL> insert into sunwg select 1 from dba_objects where rownum < 4000;

已建立3999行。

SQL> insert into sunwg select rownum from dba_objects where rownum < 2002;

已建立4001行。

SQL> commit;

在表SUNWGID = 1的記錄一共有4000條,佔了全部記錄的66%

分析表和索引,並且統計直方圖資訊。

SQL> analyze table sunwg compute statistics for table for all indexes for column

s id size 10;

表已分析。

還是執行前面的那兩個SQL看看有了直方圖資訊之後的效果。

SQL> select * from sunwg where id = 50;

執行計劃

----------------------------------------------------------

Plan hash value: 3109917279

---------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

---------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 | 3 | 1 (0)| 00:00:01 |

|* 1 | INDEX RANGE SCAN| IND_SUNWG | 1 | 3 | 1 (0)| 00:00:01 |

---------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

1 - access("ID"=50)

因為ID = 50的記錄在表SUNWG中僅有一條,所以才用索引範圍掃描的效率會更好一些。CBO選擇了高效的執行方式。

SQL> select * from sunwg where id = 1;

執行計劃

----------------------------------------------------------

Plan hash value: 650063079

---------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time

---------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 3600 | 10800 | 5 (0)|

|* 1 | INDEX FAST FULL SCAN| IND_SUNWG | 3600 | 10800 | 5 (0)| 00:00:01

---------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

1 - filter("ID"=1)

ID = 1的時候,CBO選擇了執行快速索引全掃描。ORACLE意識到了ID = 1的時候結果集的變化,所以CBO沒有采用索引範圍掃描,而是選擇了更加高效的快速索引全掃描。

結合前面的例子,我們可以知道對於那些嚴重傾斜的列來說,直方圖資訊是多麼的重要。所以我們在收集統計資訊的時候,一定不要忽略了直方圖這個重要的因素。下面是存在直方圖資訊時,其他謂詞的情況:

Where 條件

Oracle估計記錄數

表中實際記錄數

Oracle估算公式(猜想)

ID = 1

3600

4000

ID > 1

2400

2000

ID >= 1

6000

6000

ID = 110

1

0

1<= X<= 6000 * DENSITY

ID + 1 > 1

300

6000

6000* 5%

ID + 1 >= 1

300

6000

6000* 5%

ID + 1 > 1 AND ID + 1 > 1

300

6000

6000* 5%

ID > 1 AND ID < 50

147

48

ID >= 1 AND ID <= 50

3747

4049

這次ORACLE估算公式一欄很多都是空著的。因為在存在直方圖資訊的時候,計算Rows的演算法特別的複雜。我下面會詳細的介紹一下這部分內容。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9533994/viewspace-1008780/,如需轉載,請註明出處,否則將追究法律責任。

相關文章