為正確地確定每種訪問計劃的成本,DB2 優化器需要準確的基數估計值?;鶖倒烙嬍沁@樣一種過程:在應用了謂詞或執行了聚集之后,優化器使用統計信息確定部分查詢結果的大小。對于訪問計劃的每個操作符,優化器將估計該操作符的基數輸出。一個或更多謂詞的應用可以減少輸出流基數。
在計算謂詞對于基數估計值的組合過濾效果時,通常會假設這些謂詞彼此之間是獨立的。然而,這些謂詞可以在統計方面彼此關聯。單獨地處理它們通常會導致優化器低估基數值。而基數值的低估又會導致優化器選擇一個次優的訪問計劃。
對于至少應用了至少兩個本地等式謂詞的 SQL 語句,優化器將考慮使用多列統計信息來檢測統計關聯,并更加準確地估計多個謂詞組合的過濾效果。同樣對于連接兩個或更多表的 SQL 語句,以及在一對表間至少使用了兩個等式連接謂詞的連接,優化器也會使用多列統計信息。
一個本地等式謂詞是一個應用于單個表的等式謂詞,其描述如下所示:
COLUMN = literal |
其中 literal 可以是以下任一內容:
- 一個常量值;
- 一個參數標記或一個主變量;
- 一個專用寄存器(例如,CURRENT DATE)
一個等式連接謂詞的描述如下所示,它用于表 1 和表 2 間的連接:
T1.COLUMN = T2.COLUMN |
DB2 V8.2 使用下面的多列統計信息:
- 索引 keycard 統計信息:FIRST2KEYCARD、FIRST3KEYCARD、FIRST4KEYCARD 和 FULLKEYCARD
- 列組統計信息:列組基數值
這些統計信息描述了包含兩個或更多列的列集中不同分組的數量。
在 DB2 V8.2 出現之前,只能使用索引 keycard 統計信息,并且要受下列條件約束:
- 索引必須是完全限定的。如果鍵中的所有列都可以被等式謂詞 引用(連接謂詞或本地謂詞,但不是兩者的混合),那么這個索引就是完全限定的。
- 對于連接謂詞,索引也必須是惟一的。
在 DB2 V8.2 中,通過考慮到所有索引 keycard 統計信息而不要求索引完全限定,DB2 SQL 優化器進一步擴展了多列統計信息的使用。它還考慮到了用戶收集的任何列組統計信息。本文討論了優化器如何利用這些統計信息,以及用戶如何識別要收集的列組統計信息。
多個本地等式謂詞的統計相關性
DB2 SQL 優化器試圖檢測多個本地等式謂詞間的統計相關性。
示例 1:假設有一個表 SHOW_LISTINGS,它包含如下列:
表 1. SHOW_LISTINGS 表的描述
列名 | 描述 |
SHOW_ID | 表外鍵,包含關于各演出清單的信息 |
CHANNEL_ID | 表外鍵,包含關于播放演出的每個頻道的信息 |
STATION_ID | 表外鍵,包含和頻道相關的每個電視臺的信息 |
CITY_ID | 表外鍵,包含關于上演該演出的每個城市的信息 |
DAY | 演出播放的日期 |
TIME | 演出播放的當天的時間 |
<other columns> | 描述了演出清單的其他屬性 |
由于演出只在某個電視臺的某個頻道播出,在一天的特定時間內,這些列(SHOW_ID,CHANNEL_ID,STATION_ID 和 TIME)彼此之間不是互相獨立的。DAY 列獨立于 TIME 列,但是它不獨立于所有演出清單的 SHOW_ID。
設想一條應用了以下謂詞的 SQL 語句:
P1: SHOW_ID = ? P2: CHANNEL_ID = ? P3: STATION_ID = ? P4: TIME = ? |
如果存在這樣一個索引,其中的鍵包含謂詞 P1-P4 引用的所有列,或者鍵中的前四列包含所引用的列,優化器將使用 FIRST4KEYCARD 索引統計信息(如果收集了索引統計信息的話),來檢測謂詞 P1-P4 之間的統計相關性。在應用了這四個謂詞之后,優化器將計算一個更準確的基數估計值。例如,下面的任何一個索引可以用來檢測這四個謂詞間的統計相關性:
IX1 ON SHOW_LISTINGS(SHOW_ID, CHANNEL_ID, STATION_ID, TIME) IX2 ON SHOW_LISTINGS(SHOW_ID, CHANNEL_ID, STATION_ID, TIME, CITY_ID) IX3 ON SHOW_LISTINGS(SHOW_ID, CHANNEL_ID, STATION_ID, TIME, DAY, CITY_ID) |
優化器使用 IX1 的 FULLKEYCARD 和 FIRST4KEYCARD 統計信息來檢測所有四個謂詞的相關性。類似地,它也可以使用 IX2 和 IX3 的 FIRST4KEYCARD。
不能使用如下所示的索引:
IX4 ON SHOW_LISTINGS(CITY_ID, SHOW_ID, CHANNEL_ID, STATION_ID, TIME) |
由于每個 keycard 統計信息都將包含 CITY_ID 列,因此該列上未定義本地等式謂詞。
……