SQL 優化 概念篇 之 選擇性和基數

wangxiangtao發表於2010-08-18

        最近在研究 Christian  Antognini   關於 Troubleshooting Oracle  Performance 這本書,  當翻閱到後面時, 感覺到對前面的部分概念又模糊了。談到優化,如果你概念都摸稜兩可的話,就是一件很悲哀的事情了,或許你認為在真實環境中實戰幾次就可以理解概念了。我個人認為, 實戰是加深概念理解的最直接的方法,作為一個經驗尚淺的DBA,我決定在概念理解上多下工夫,因此有必要對概念作一個小小的記錄 (古人云:最淡的墨水勝過最強的記憶!!)

(1)  選擇性 (selectivity )  :   一個操作過濾的記錄的比例, 是一個介於 0 和  1 之間的數值。

 (2)  基數 (cardinality) :     一個操作所返回的記錄的條數。

 以num_rows 表示被處理的記錄數, 這 cardinality  與  selectivity 之間存在以下關係

                                           cardinality =    selectivity   ×   num_rows

    對於一般的操作, 其選擇性是通過 查詢語句返回的記錄數 除以 表中儲存的記錄數  得到, 但是在實際生產環境中,一般的操作是完全不能滿足我們的需求的, 如果我們在語句中 使用了 group  by  和  聚合函式(eg: sum  max  min  avg), 我們返回的記錄數肯定就不是我們過濾的記錄數了, for  example :

      以下是我的一個測試表,表中的記錄數為6  如下:

SQL> select count(*) from  book_test;
 
  COUNT(*)
----------
         6

通過 sum  聚合函式對測試表進行操作:

SQL> select  sum(price) from  book_test;
 
SUM(PRICE)
----------
       316

以上操作 我們返回行為1   其實我們的選擇性應該為 6/6 = 1     而不是我們的一般演算法 1/6

    談了這麼多,可能你認為,選擇性是幹什麼的? 有用嗎?  其實一個操作對應的選擇效能夠幫助你確定那條訪問路徑是最優的訪問路徑。

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

相關文章