DB2 優(yōu)化器中針對JOIN 結(jié)果集估計經(jīng)典版!
以下的文章主要描述的是DB2 優(yōu)化器中針對 JOIN 語句的實際操作結(jié)果集估計,在實際操作中DB2 優(yōu)化器在為 SQL 語句生成執(zhí)行計劃時,其實際操作過程中都會對每個步驟產(chǎn)生的結(jié)果集大小進(jìn)行估計,這就是優(yōu)化器的基估計。
在所有 SQL 語句基估計過程中,以 JOIN 語句的計算過程最復(fù)雜,而 JOIN 語句恰恰是進(jìn)行性能優(yōu)化的重點。本文主要關(guān)注 DB2 優(yōu)化器在進(jìn)行基估計時采用的計算方法、輸入等。
簡介
優(yōu)化器是 DB2 的心臟和靈魂(可以把它類比成寶馬 730 或波音 747 的發(fā)動機(jī)引擎一樣)。它分析 SQL 語句并確定可以滿足每條語句的最有效的存取路徑。 DB2 SQL 優(yōu)化器可以估計每個備選訪問計劃的執(zhí)行成本,并根據(jù)其估計結(jié)果選擇一個最佳訪問計劃。
在優(yōu)化器在優(yōu)化一個 SQL 語句的過程中使用到兩個非常重要的概念:selectivity 和 cardinality 。 selectivity 是指一個 SQL 操作的得出結(jié)果集占原來結(jié)果集的百分比,而 cardinality 就是指一個 SQL 操作的得出結(jié)果集的行數(shù)。
為正確地確定每種訪問計劃的成本,DB2 優(yōu)化器都會對每個步驟產(chǎn)生的結(jié)果集大小即返回的行數(shù)進(jìn)行估計,這就是優(yōu)化器的基估計。 DB2 優(yōu)化器需要準(zhǔn)確的基數(shù)估計值?;鶖?shù)估計是這樣一種過程:在應(yīng)用了謂詞或執(zhí)行了聚集之后,優(yōu)化器使用統(tǒng)計信息確定部分查詢結(jié)果的大小。對于訪問計劃的每個操作符,優(yōu)化器將估計該操作符的基數(shù)輸出。一個或更多謂詞的應(yīng)用可以減少輸出流基數(shù)。
JOIN 謂詞
當(dāng)我們在 SQL 里面需要對多個表進(jìn)行 join 的時候,DB2 會首先選擇其中的 2 個表進(jìn)行 join,并獲取到一個中間的結(jié)果集,然后 DB2 可能會用這個中間的結(jié)果集和第三個表做 join,再次獲得中間的結(jié)果集(當(dāng)然也可能是把另外 2 個表做 join,然后把兩個中間的結(jié)果集進(jìn)行 join 操作),不管是怎么操作,DB2 一次能夠 join 的表的個數(shù)肯定是兩個。因此當(dāng)優(yōu)化器在考慮 Join 如何處理的時候,join 的順序就是一個很重要的問題,因為我們總是希望能夠在最開始就把結(jié)果集控制的盡量小。
以上的相關(guān)內(nèi)容就是對DB2 優(yōu)化器中針對 JOIN 語句的結(jié)果集估計的介紹,望你能有所收獲。
【編輯推薦】