Fundamental Techniques for Order Optimization論文解讀

1. 摘要

優(yōu)化器為了產(chǎn)生高效的計(jì)劃,許多優(yōu)化器會(huì)利用數(shù)據(jù)的物理排序,這些排序有可能來(lái)自索引或者sort算子。排序是一種代價(jià)很高的操作。對(duì)排序進(jìn)行優(yōu)化或者避免全部排序是很重要的事情。
為了滿足這個(gè)目標(biāo),這個(gè)文章描述了一些優(yōu)化技術(shù)

  • Joins中的sorts下推
  • 最小化排序列數(shù)量
  • 通過(guò)斷言,索引等進(jìn)行Sort消除

實(shí)現(xiàn)上面這些技術(shù)需要一些基礎(chǔ)操作,這些基礎(chǔ)操作包括從斷言,唯一鍵,函數(shù)依賴來(lái)獲取數(shù)據(jù)屬性。

序言

一個(gè)優(yōu)化器的好壞可以決定一個(gè)查詢是幾分鐘或者是幾小時(shí)執(zhí)行完。
對(duì)于單個(gè)復(fù)雜的查詢有可能會(huì)產(chǎn)生多個(gè) interesting ordersinteresting orders就是要求某些數(shù)據(jù)是有序的,這個(gè)有序?qū)τ?br> Join, Order By, Group By, or Distinct是有利的。
高效的優(yōu)化器需要做以下事情:

  • 需要探查索引來(lái)提供數(shù)據(jù)有序性滿足interesting orders
  • 如果沒(méi)有排序和索引的話,需要提供排序的最佳位置
  • 最小化的排序列數(shù)量
  • 兩個(gè)以及更多的interesting orders是否可以合并,或者只使用一個(gè)即可滿足要求

上面這個(gè)過(guò)程就是排序優(yōu)化。

初步看,也許基于hash的集合操作使排序優(yōu)化的作用不是很明顯。因?yàn)榛趆ash的操作是不需要輸入數(shù)據(jù)一定是有序的,其實(shí)hash操作也是昂貴的。索引對(duì)于一些操作是可以提供interesting orders的。最后對(duì)于有序的操作和基于hash的操作都會(huì)注冊(cè)到代價(jià)優(yōu)化器進(jìn)行選擇。

這篇論文有兩個(gè)核心貢獻(xiàn)

  • 通過(guò)使用斷言和函數(shù)依賴(FD)把 interesting orders簡(jiǎn)化成符合規(guī)范的簡(jiǎn)單形式。
  • 提前排序,允許將Order by這樣的排序下推到j(luò)oin或者view中。

2. 相關(guān)工作

最經(jīng)典的是System R 優(yōu)化器,也是一個(gè)對(duì)于排序優(yōu)化的研究。《Access path selection in a relational
database system》這篇論文創(chuàng)造了interesting orders這個(gè)詞。在System R 中,interesting orders用來(lái)阻止包含有序數(shù)據(jù)局部代價(jià)大的關(guān)系代數(shù)被剪枝掉,這些關(guān)系代數(shù)有可能全局最優(yōu)。

《Query processing in dec rdb:Major issues and future challenges》主要論述了出現(xiàn)在 ORDER BY, GROUP BY, DISTINCT 從句中的interesting orders進(jìn)行合并,沒(méi)有注重排序優(yōu)化。
最近的paper是《Pratical predicate placement》包含了斷言遷移,推斷一個(gè)昂貴的斷言是否需要下推到j(luò)oin中。《Performing group-by before join》和《Including group-by in query optimization》包含了group by 下推,相似的推斷一個(gè)group by 是否要下推到j(luò)oin中。之后通過(guò)代價(jià)評(píng)估優(yōu)化器進(jìn)行選擇最佳的計(jì)劃。

概述

DB2優(yōu)化器來(lái)源于Starburst優(yōu)化器,《Grammar-like functional rules for
representing query optimization alternatives.》和《Extensible query processing in starburst》兩篇論文描述了Starburst的優(yōu)化器。
本文專注于傳統(tǒng)的基于代價(jià)的優(yōu)化器階段,在這個(gè)階段,輸入的查詢被轉(zhuǎn)換為QGM(query graph
model),QGM是高層的,圖結(jié)構(gòu)的查詢關(guān)系代數(shù)抽象。構(gòu)建完QGM之后會(huì)通過(guò)啟發(fā)式的規(guī)則來(lái)轉(zhuǎn)換成更有效的等價(jià)關(guān)系代數(shù),這些啟發(fā)式的規(guī)則包括

  • 斷言下推(predicate pushdown)
  • 視圖合并 (view merging)
  • 子查詢轉(zhuǎn)換成join (subquery-to-join)
    最后這個(gè)計(jì)劃會(huì)進(jìn)行基于代價(jià)的優(yōu)化,QGM會(huì)轉(zhuǎn)換成QEP(query execution plan)


    Simple QGM and QEP Example

QEP,可以看作是數(shù)據(jù)流轉(zhuǎn)的圖結(jié)構(gòu),每個(gè)節(jié)點(diǎn)代表了關(guān)系代數(shù)操作,每個(gè)節(jié)點(diǎn)消費(fèi)一個(gè)或者多個(gè)輸入,之后產(chǎn)出一個(gè)輸出。
在基于代價(jià)優(yōu)化階段,DB2自底向上,逐個(gè)操作符的構(gòu)建QEP,對(duì)于每一步,不同實(shí)現(xiàn)的等價(jià)節(jié)點(diǎn)會(huì)生成,代價(jià)最大的節(jié)點(diǎn)會(huì)被剪枝。這個(gè)過(guò)程也會(huì)嘗試構(gòu)建滿足 interesting order屬性的節(jié)點(diǎn)。
interesting order屬性在先前的自頂向下的QGM計(jì)劃階段,Joins, Order By, Group By, Distinct關(guān)系代數(shù)會(huì)產(chǎn)生interesting order。
會(huì)盡可能的將interesting order下推和組合進(jìn)order scan中,這樣一個(gè)sort就可以滿足多個(gè)interesting order,同時(shí)也讓優(yōu)化器可以將sort在join的任意層進(jìn)行下推。

4 排序優(yōu)化的基礎(chǔ)技術(shù)操作

4.1 排序消除

排序消除是排序優(yōu)化中最基礎(chǔ)的操作,排序消除將所需的排序簡(jiǎn)化成標(biāo)準(zhǔn)形式。消除過(guò)程中會(huì)用到等價(jià)類,把所需的排序列用等價(jià)類進(jìn)行替換,之后再去除多余的列。
假設(shè)interesting order為I(x, y),輸入的排序?yàn)镺P = (y),推斷出 I 無(wú)法通過(guò) OP 滿足,所以會(huì)在QEP中添加sort(x)操作符。假設(shè)如果關(guān)系代數(shù)中有一個(gè) filter 條件,比如 x = 10,所以I(x, y)中x是多余的,I(x, y)可以寫成I(y),可以輕松地判斷出 OP 可以滿足I。
排序消除也需要考慮等價(jià)類,例如interesting order 為 I(x, z), OP =(y, z),如果等價(jià)類中有 x = y。那么也可以推斷出OP 可以滿足I。
排序消除也需要考慮索引key,例如interesting order 為 I(x, y), OP =(x, z),如果x是一個(gè)索引key,那么interesting order 可以改寫為 I(x), OP 也可以改寫為 OP =(x),y和z是多余的,因?yàn)橹粦{x就可唯一確定排序順序。
索引Keys是FDS(functional dependencies)的一種特例,所以除了keys,F(xiàn)DS經(jīng)常被用來(lái)排序消除。FDS在論文《The role of functional dependencies in query decomposition.》中有詳細(xì)介紹。
排序消除的算法在圖2中用偽代碼展示了下

圖2 Reduce Order Algorithm

排序消除有可能把所有的排序都簡(jiǎn)化掉,比如I(x),filter條件x = 10會(huì)產(chǎn)生FDS {} -> {x},所以I(x)會(huì)簡(jiǎn)化成 I()。

4.2 排序測(cè)試

在生成QEP的時(shí)候,優(yōu)化器要判斷關(guān)系代數(shù)的OP(order property),是否滿足I(interesting order ),如果不滿足的話需要在QEP中添加sort算子。算法如圖3所示

圖3: Test Order Algorithm

4.3 覆蓋排序

DB2優(yōu)化器會(huì)嘗試著合并interesting order,這樣一個(gè)sort算子就可以滿足多個(gè)interesting order。當(dāng)兩個(gè)interesting order I1和I2合并后,就產(chǎn)生了覆蓋排序。滿足覆蓋排序的屬性也會(huì)滿足I1和I2。例如對(duì)于I1 = (x)和I2 = (x, y)的覆蓋排序是 C = (x, y)。
也不總是能產(chǎn)生覆蓋排序的,比如I1 = (y, x)和I2 = (x, y,z)。當(dāng)嘗試生成覆蓋排序時(shí),應(yīng)該先進(jìn)行排序消除,比如如果有斷言x = 10,那么I1 = (y, x)和I2 = (x, y,z)就可以消除為I1 = (y,)和I2 = (y,z),那么I1和I2就可以合并成C = y,z),生成覆蓋排序的算法如下圖

圖4: 覆蓋排序算法

4.4 均勻排序(Homogenize Order)

會(huì)嘗試將interesting order下推到QGM中的scan,進(jìn)行前置sort。當(dāng)下推interesting order I時(shí),會(huì)嘗試替換一些排序列,這就叫均勻排序。例如如下查詢:
select * from a, b where a.x = b.x order by ax, b.y
order by 算子給出了interesting order I =(a.x, b.y),會(huì)嘗試下推I到表a和表b,對(duì)于表b,可以用等價(jià)類 a.x = b.x將interesting order I =(a.x, b.y)均質(zhì)化為(b.x, b.y)。
interesting order I =(a.x, b.y)不能推到表a,因?yàn)閎.y只有join完才知道。但是如果a.x是一個(gè)索引key,那么通過(guò)函數(shù)依賴可知
{a.x} -> {b.y},那么interesting order I =(a.x, b.y)可以簡(jiǎn)化為I =(a.x),這就可以下推到表a了,進(jìn)行提前sort。
均質(zhì)排序的算法見(jiàn)圖5

圖5: 均質(zhì)排序處理算法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容