1. 程式人生 > >進一步理解 DB2 中的列組統計資訊

進一步理解 DB2 中的列組統計資訊

利用 IBM® DB2® for Linux®, UNIX®, and Windows® (DB2) 中的多列統計資訊,優化器可以在多個謂詞相關聯時確定一個更好的查詢訪問計劃並提高查詢效能。在本文中,學習如何使用多列統計資訊以利用 DB2 9.5 優化器的增強功能,從而將多列統計資訊的用途擴充套件到更多謂詞中。

簡介

理解 DB2 中的列組統計資訊”(developerWorks,2006 年 12 月)一文描述了收集列組統計資訊的重要性,並介紹了 DB2 SQL 優化器(後文簡稱為優化器)如何使用這些多列統計資訊來檢測兩個或多個本地或連線等式謂詞之間的統計關聯。在 DB2 9.5 中,優化器進一步將多列統計資訊的使用擴充套件到了更廣泛的謂詞範圍中。

優化器憑藉精確的基數估計值來準確計算出每一個待定查詢訪問計劃的成本。基數估計是這樣一種過程:在應用了謂詞或執行了聚集之後,優化器使用統計資訊確定部分查詢結果的大小。對於訪問計劃的每個操作符,優化器將估計該操作符的基數輸出。應用一個或更多謂詞可以減少輸出流基數。

在計算謂詞對於基數估計值的組合過濾效果時,通常會假設這些謂詞彼此之間是獨立的。但在統計方面,這些謂詞可以彼此關聯。單獨地處理多個謂詞通常會導致優化器低估基數值。而基數值的低估又會導致優化器選擇一個次優的訪問計劃。

優化器會考慮使用多列統計資訊來檢測統計關聯,並更加準確地估計多個謂詞組合的過濾效果。本文描述了優化器如何利用多列統計資訊來檢測統計關聯,並更加準確地估算多個等式謂詞對於應用了至少兩個本地 IN、OR 和等式謂詞的 SQL 語句的組合過濾效果,和它們對於應用了某種等級的 OR 謂詞的 SQL 語句的過濾效果。“

理解 DB2 中的列組統計資訊” 一文描述了優化器如何利用多列統計資訊來檢測兩個或多個本地等式謂詞間的關聯,以及在一對錶中至少使用了兩個等式連線謂詞的兩個或多個表的連線關聯。RUNSTATS 命令選項在本文中的使用方式與在上篇 文章 中所描述的使用方式相同,所以本文中不再加以描述。





回頁首


如果 SQL 語句的 WHERE 子句使用了多個謂詞:

    	        C1=? AND C2 IN ( ?, ?, ? )

並且收集了 (C1, C2) 的多列統計資訊的話,那麼優化器就會試著檢測這些謂詞間的統計關聯以提高基數估計值。如下謂詞除外:

  • 帶有 IN 或 OR 操作符的連線謂詞
  • 帶有不等式、LIKE 或 IS NULL 操作符的本地謂詞
  • 帶有子查詢的謂詞

C1=? 謂詞就是本地等式謂詞的一個例子,一個本地等式謂詞是一個應用於單個表的等式謂詞,其描述如下:

	        COLUMN = literal

其中 literal 可以是以下任一內容:

  • 一個常量值
  • 一個引數標記或一個主變數
  • 一個專用暫存器(例如,CURRENT DATE)

C2 IN ( ?, ?, ? ) 謂詞則是本地 IN 謂詞的一個例子,一個本地 IN 謂詞是一個應用於同一個表格 —— 與本地謂詞所應用的表格相同 —— 的等式謂詞,其描述如下:

     
COLUMN IN ( <VALUE LIST> )


其中 <VALUE LIST> 是一個以逗號隔開的一個或多個上述(在本地等式謂詞中)literal 的列表。

一個相當於 IN 謂詞的 OR 謂詞可以代替 IN 謂詞在 SQL 語句中指定,而且優化器將會在說明統計關聯時按相同的方式處理之,也就是說:

    
COL IN ( literal_1, literal_2, ..., literal_n )


相當於

    
COL=literal_1 OR COL=literal_2 OR ... OR COL=literal_n


下面的例子演示了優化器為其檢測本地 IN、OR 和等式謂詞間的關聯:

a) COL_1 IN ( <VALUE LIST> ) AND COL_2=literal AND COL_3=literal
b) (COL_1=literal_1 OR COL_1=literal_2 OR ... OR COL_1=liternal_n) AND COL_2=literal AND ... AND COL_m=literal
c) COL_1 IN ( <VALUE LIST> ) AND COL_2 IN ( <VALUE LIST> ) AND ... AND COL_m IN ( <VALUE LIST> )
d) (COL_1=literal_1 OR COL_1=literal_2) AND (COL_2=literal_1 OR COL_2=literal_2) AND ... AND (COL_m=literal_1 OR COL_M=literal_2)
e) COL_1 IN ( <VALUE LIST> ) AND ... And COL_m IN ( <VALUE LIST> ) AND COL_1_2=literal AND ... AND COL_1_k=literal
f) (COL_1=literal_1 OR COL_1=literal_2) AND COL_2=literal AND COL_3=literal
g) (C)L_1=literal_1 OR COL_1=literal_2) AND (COL_2=literal_1 OR COL_2=literal_2) AND COL_3=literal

下面這些謂詞是優化器不會考慮為其檢測統計關聯的謂詞的例子:

a) (COL_1=literal AND COL_2=literal) OR (COL_1=literal AND COL_2=literal AND COL_3=literal)
b)((COL_1=literal AND COL_2=literal) OR (COL_1=literal AND COL_2=literal)) AND COL_3=literal
c)( COL_1 IN ( <VALUE LIST> ) OR (COL_2 IN ( <VALUE LIST> ) ) AND COL_3=literal

注意:請將本文所有示例中的 SKAPOOR 替換為您自己的模式。

這些示例是在如下所示的環境中測試的,使用的是 SAMPLE 資料庫,SAMPLE 資料庫可以通過執行 db2sampl 來建立:



本文轉自IBM Developerworks中國