DB2 優(yōu)化器中針對JOIN 結(jié)果集估計(jì)經(jīng)典版!
以下的文章主要描述的是DB2 優(yōu)化器中針對 JOIN 語句的實(shí)際操作結(jié)果集估計(jì),在實(shí)際操作中DB2 優(yōu)化器在為 SQL 語句生成執(zhí)行計(jì)劃時,其實(shí)際操作過程中都會對每個步驟產(chǎn)生的結(jié)果集大小進(jìn)行估計(jì),這就是優(yōu)化器的基估計(jì)。
在所有 SQL 語句基估計(jì)過程中,以 JOIN 語句的計(jì)算過程最復(fù)雜,而 JOIN 語句恰恰是進(jìn)行性能優(yōu)化的重點(diǎn)。本文主要關(guān)注 DB2 優(yōu)化器在進(jìn)行基估計(jì)時采用的計(jì)算方法、輸入等。
簡介
優(yōu)化器是 DB2 的心臟和靈魂(可以把它類比成寶馬 730 或波音 747 的發(fā)動機(jī)引擎一樣)。它分析 SQL 語句并確定可以滿足每條語句的最有效的存取路徑。 DB2 SQL 優(yōu)化器可以估計(jì)每個備選訪問計(jì)劃的執(zhí)行成本,并根據(jù)其估計(jì)結(jié)果選擇一個最佳訪問計(jì)劃。
在優(yōu)化器在優(yōu)化一個 SQL 語句的過程中使用到兩個非常重要的概念:selectivity 和 cardinality 。 selectivity 是指一個 SQL 操作的得出結(jié)果集占原來結(jié)果集的百分比,而 cardinality 就是指一個 SQL 操作的得出結(jié)果集的行數(shù)。
為正確地確定每種訪問計(jì)劃的成本,DB2 優(yōu)化器都會對每個步驟產(chǎn)生的結(jié)果集大小即返回的行數(shù)進(jìn)行估計(jì),這就是優(yōu)化器的基估計(jì)。 DB2 優(yōu)化器需要準(zhǔn)確的基數(shù)估計(jì)值。基數(shù)估計(jì)是這樣一種過程:在應(yīng)用了謂詞或執(zhí)行了聚集之后,優(yōu)化器使用統(tǒng)計(jì)信息確定部分查詢結(jié)果的大小。對于訪問計(jì)劃的每個操作符,優(yōu)化器將估計(jì)該操作符的基數(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 的順序就是一個很重要的問題,因?yàn)槲覀兛偸窍M軌蛟谧铋_始就把結(jié)果集控制的盡量小。
以上的相關(guān)內(nèi)容就是對DB2 優(yōu)化器中針對 JOIN 語句的結(jié)果集估計(jì)的介紹,望你能有所收獲。
【編輯推薦】