限制q-error,防止產生次優計劃

茶柒要學習發表於2021-11-15

原文:《Preventing bad plans by bounding the impact of cardinality estimation errors》

摘要

  • 文章定義了一個衡量基數估計好壞的criterion:Q-error.
    • 對於我們給定的一個bound(邊界),如果q-error小於bound,查詢優化器將產生一個最佳計劃。
    • 如果q-error以q為一個bound,那麼我們就可以認為產生的執行計劃最多比最佳計劃差\(q^4\)倍。
  • 基於上述發現,文章展示瞭如何在q-error下找到最佳的近似值。
  • 這些技術可以用來構建基數估計synopsis(概要)

簡介

  • 成本計算包括兩方面:

    • 基數估計:對查詢中間結果大小的估計,是成本計算的重點,往往會造成比較大的估計偏差而造成成本計算的錯誤。
    • 代數運算子的成本估計:多查詢中進行的代數運算進行成本估計,往往估計的比較準確,與真實結果不到\(3\%\)的錯誤率。
  • 針對成本計算的現狀提出了幾個問題

    • Q1:基數估計總是出錯,我們怎麼衡量基數估計出現的錯誤大小?這個問題是最基本的問題
    • Q2A:如何最大限度的減少錯誤的傳播
    • Q2B:是否存在一個對錯誤的邊界,當錯誤在這個邊界內,得到的執行計劃仍然是最優計劃,如果這個邊界存在,它們具體是什麼樣的?
    • Q2C:如果最優計劃\(P\)已知,而由查詢優化器生成的計劃為\(\hat{P}\),如果基數估計產生錯誤的bound我們已經知道,那麼這個bound是否也可以約束\(\hat{P}\)\(P\)之間的開銷差距。也就是說,我們是否能通過基數估計產生的錯誤的邊界而得到生成的執行計劃與最優計劃之間的差距?
    • Q3:我們如何最大限度的減少基數估計的錯誤?
  • 上述問題在本文中會得到逐一的解答。

q-error的定義

  • 首先對選擇性估計問題進行了一個明確的定義

    • 有一個關係\(R\),\(A\)\(R\)的一個屬性。\({x_1,x_2,\cdots,x_m}=\Pi_A(R)\)\(A\)的所有無重複取值。此時頻率密度可以由一個對偶\(<x_i,f_i>\)集合表示,其中\(f_i=\{\sigma_{A=x_i}(R),i\in [1,m]\}\)。選擇性估計的任務就是通過函式\(\hat{f}\)近似這組鍵值對,並將\(f\)對映到(0,1)。
  • 給出了q-error定義:

    • 在數學中,常用範數來進行誤差分析,如果實際值用\(b\)向量表示,估算值用\(\hat{b}\)向量表示,用 p-範數計算的誤差為:

    \[||b-\hat{b}||=\sqrt[p]{(b_i-\hat{b_i})^p} \]

    比較常用的是2-範數和\(\infty-\)範數,2-範數的結果是向量的長度,即向量各元素平方和再開方,\(\infty-\)範數是所有向量元素絕對值中的最大值。通過\(\infty-\)範數可以推匯出估計值\(\hat{b}\)的上下界分別為\(b_i\)加減\(\infty-\)範數的值。但是絕對誤差上界在查詢優化中通常不是那麼有用,文中定義了另一個誤差函式q-error。

    • 首先給出q範數的定義:

      \[||z||_Q=\begin{cases}\infty \quad z\leq 0\\\frac{1}{z} \quad 0<z\leq 1\\z\quad 1\leq z\\\end{cases} \]

    • 對於一個向量\(z\):

    \[||z||_Q=\max_{i=1}^m||z_i||_Q=\max_{i=1}^m(\max{(z_i,\frac{1}{z_i})}) \]

    • 對於估計值\(\hat{b}\)和真實值\(b\),我們將q-error定義為:

      \[||\frac{\hat{b}}{b}||_Q \]

      通過Q範數的定義形式,我們可以進一步推導得:

      \[q=||\frac{\hat{b}}{b}||_Q=\max_{i=1}^m(\max{(\frac{\hat{b_i}}{b_i},\frac{b_i}{\hat{b_i}})}) \]

    • 類似於\(\infty\)正規化,我們也能夠確定一個基於Q範數估計值的邊界:

    \[(\frac{1}{q})f_i\leq \hat{f_i}\leq qf_i \]

    到此我們瞭解了什麼是 q-error 以及它的形式化定義,那為什麼論文采用 q-error 來表示估算誤差呢?在論文的第三部分我們會看到,我們可以通過最小化 q-error 來最小化估算誤差的傳播,q-error 也能幫我們解決 “是否存在一個誤差上界,只要優化器的估算誤差在這個上界以內就可以保證選到最佳執行計劃?” 這個問題。

最小化q-error能最小化誤差傳播

《On the Propagation of Errors in the Size of Join Results》表明 selectivity 估算誤差會在 join 節點上指數級的放大,如果用 q-error 來表示估算誤差,join 結點對 selectivity 估算誤差的放大效果是怎麼樣的呢?

  • 為了尋找 n 個表\(\{R_1,R_2,\cdots,R_N\}\)join 的最佳執行計劃,我們需要先對每個表做 selectivity 估算,論文中假設了一個沒有 join 條件(笛卡爾積)的簡單場景,所有的過濾條件都推到了各個表上,這些表的 join 表示為\(\sigma_{p_1}(R_1)\Join \cdots\Join \sigma_{p_n}(R_n)\),令\(x\)表示這 n 個表的一個子集,這個子集裡面 join 結果集的大小可以表示為:

\[s_x=(\prod_{R_i\in{x}}f_i)(\prod_{R_i\in{x},R_j\in{x}}(f_{i,j}))(\prod_{R_i\in{x}}|R_i|) \]

  • 其中:
    • \(f_i\)表示\(\sigma_{p_i}(R_i)\)的真是selectivity
    • \(f_{i,j}\)表示表示第 i 和 j 個表 join 的真實 selectivity,如果沒有 join 條件(笛卡爾積)則\(f_{i,j}=1\)
    • \(|R_i|\)表示第 i 個表的真實結果集大小
  • 可以通過先計算 k 個表 join 的結果集公式,再計算新增一個表(k+1 個表)的 join 結果集公式來得到上面 n 個表 join 的結果集大小計算公式。

我們用\(\hat{f_i}\)表示\(\sigma_{p_i}(R_i)\)的selectivity估算值,在假設量表join的selectivity估算值沒有誤差,以及各個表結果集大小的估算沒有誤差的情況下,可以通過上述計算公式得到這些表join結果集大小的估算值為:

\[\hat{s_x}=(\prod_{R_i\in{x}}\hat{f_i})(\prod_{R_i\in{x},R_j\in{x}}(f_{i,j}))(\prod_{R_i\in{x}}|R_i|) \]

利用\(\prod_{R_i\in{x}}\frac{f_i}{f_i}=1\)的事實,我們可以給\(\hat{s_x}\)做一個等價變換:

\[\hat{s_x}=(\prod_{R_i\in{x}}\frac{f_i}{f_i})(\prod_{R_i\in{x}}\hat{f_i})(\prod_{R_i\in{x},R_j\in{x}}(f_{i,j}))(\prod_{R_i\in{x}}|R_i|) \]

\[\hat{s_x}=(\prod_{R_i\in{x}}\frac{\hat{f_i}}{f_i})s_x \]

\[\hat{s_x}\leq{(\prod_{R_i\in{x}}{\max(\frac{\hat{f_i}}{f_i},\frac{f_i}{\hat{f_i}})})s_x} \]

而單個值的\(f_i\)和它的估計值\(\hat{f_i}\)的q-error可以表示成\(\max{(\frac{\hat{f_i}}{f_i},\frac{f_i}{\hat{f_i}})}\)。上面join集結果告訴我們:如果要最小化估算誤差在 join 結點上的傳播,我們需要最小化每個表上 selectivity 估算的 q-error。

  • 得到的結論似乎在預期之中,因為直覺告訴我們,不管估算誤差用什麼數學公式計算,只要我們能夠最小化基表的估算誤差,就一定對最小化 join selectivity 估算誤差有幫助,上面的證明過程把這一直覺嚴謹的推演證明出來了,並且告訴了我們縮小估算誤差的方式是縮小 q-error 而不是縮小絕對誤差(∞-範數)。

  • 不過值得注意的是,要最小化 join 誤差,我們還需要最小化兩表 join selectivity 和各個表結果集大小的估算誤差,分別是\(f_{i,j}\)\(|R_i|\)

可以計算q-error界限,估計誤差在此界限內的計劃均為最優計劃

確定一個選擇性估計的偏離範圍,使誤差在此範圍內不會影響最優執行計劃的生成,換句話說q-error 的上界值應該是多少,使得只要優化器的估算誤差在這個上界以內就可以保證選到最佳的執行計劃?

論文分別就星型連線、鏈式連線以及普通的樹形連線給出了相應的 q-error 上界計算公式。下面不等式的右邊就是每個表 selectivity 估算誤差的上界

  • 星型查詢:

\[||\frac{f_k}{f_k'}||_Q\leq\min_{i\neq{j}}\sqrt{||\frac{f_if_{0,i}|R_i|}{f_jf_{0,j}|R_j|}||_Q} \]

  • 鏈式查詢:

\[||\frac{f_k'}{f_k}||_Q\leq\min_{i\neq{j-1}}\sqrt{||\frac{f_if_{i,i+1}|R_i|}{f_jf_{j,j-1}|R_j|}||_Q} \]

  • 樹型查詢:

\[||\frac{f_k'}{f_k}||_Q\leq\min_{i\neq{j},R{i'}-R_i,R{j'}-R_j}\sqrt{||\frac{f_if_{i,i'}|R_i|}{f_jf_{j,j'}|R_i|}||_Q} \]

q-error 上界能進一步推匯出代價估算的誤差上界

估算代價可以分為兩步:selectivity 估算和代價估算。前者計算出某個運算元會產生多少條資料,後者根據運算元的物理實現,綜合 CPU、記憶體、網路、磁碟以及剛才 “產生多少條資料” 等因素給出一個綜合的代價值。論文的 “3.3 Cost Bounds Implied by Q” 部分通過推理,得到了一個結論:\(C(\hat{P})\leq q^4C(P)\),selectivity 估算誤差上界可以推匯出 cost 估算誤差的上界。

如何設計 selectivity 估算函式使其低於誤差上界

論文 “4. BEST APPROXIMATION UNDER LQ” 部分詳細介紹了直方圖桶內等值查詢和範圍查詢的 selectivity 估算方法,如這章節開頭所說 “This section makes heavy use of math“,因為數學公式比較多,看起來會吃力一些。

假設我們要估算一個過濾條件 where col = x 的 selectivity,經過數學建模和一系列的推導,論文提出使用線性函式\(\beta + \alpha x\)來擬合直方圖桶內等值查詢 selectivity 估算的方法,範圍查詢可以由等值查詢推導而來。論文在 "4.2 Approximation Algorithm" 中給出了\(\alpha\)\(\beta\)的計算方法,下圖中 \(x_i\) 是取樣值,\(b_i\) 是實際的 selectivity:
![[Pasted image 20211115190054.png]]

如何構造直方圖

論文在 ”5.3 Piecewise Approximation“ 中簡單描述瞭如何構造直方圖。構造直方圖比較難的地方是確定直方圖每個桶的上下邊界,比如等深直方圖通過固定桶的數量和限制落在這個桶中的資料量一樣多來計算每個桶的上下邊界。在上面小結的計算過程中我們觀察到,一個桶中的資料量越多,線性擬合的估算誤差 q-error 就越大,這就給我們構造直方圖每個桶的上下邊界提供了指導思想。只要我們固定估算誤差 q-error,就能夠計算出落在每個桶中的資料有哪些(可以二分查詢),進而得到每個桶的上下邊界,構造出完整的直方圖。論文中這裡沒有再詳細描述,它給的參考文獻可以讀一讀:《[Smooth Interpolating Histograms with Error Guarantees](download (psu.edu))》。

最後

這篇論文後面還有不少實驗資料來驗證線性擬合和其他估算方式的 q-error 對比,可以看到線性擬合的 q-error 確實能夠限制在比較小的範圍內。

總體上這篇論文對誤差估算的建模分析是值得我們學習的,q-error 更是給我們如何衡量估算誤差,如何降低估算誤差指明瞭方向,這個的意義挺大的。

——覺得有幫助給筆者點個關注點個贊呀_

——參考https://zhuanlan.zhihu.com/p/165959743

相關文章