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


