FactorJoin: 一種新的連線查詢基數估計框架
編者按
本文系東北大學鞏李成所著。
鞏李成:東北大學電腦科學與工程學院在讀碩士生,課題方向為資料庫查詢最佳化,致力於應用 AI 技術改進傳統基數估計器,令資料庫選擇最優查詢計劃。
今天分享的文章是《FactorJoin: 一種新的連線查詢基數估計框架》,主要提出了一種將傳統的連線直方圖估計方法與學習型方法相結合的多表連線基數估計框架。希望閱讀完本文後你可以有所收穫。
原文:《FactorJoin: A New Cardinality Estimation Framework for Join Queries 》,發表於SIGMOD 2023 。
基數估計是查詢最佳化中最為重要和最 具挑戰性的問題。傳統方法和學習型方法在估計多表連線查詢的基數時都沒有令人滿意的表現。它們或依賴於簡單的假設導致無 效的估計;或構建過大的模型來理解多表的聯合分佈,從而使得模型規劃時間較長並缺乏泛化能力。
本文提出了一個新的多表連線基數估計方法——FactorJoin 。FactorJoin 將傳統的連線直方圖 [1] 與學習型方法相結合以捕獲表間的關聯性進而進行基數估計。具體地說,離線訓練時,FactorJoin 先建立單表估計模型以學習單表的分佈。當處理連線查詢時,FactorJoin 首先依據已學習到的分佈將查詢建模為因子圖 [2] (Factor Graph ),而後使用變數消除 [3] (Variable Elimination ,VE )演算法進行推理。因只需單表的統計資訊即可估計出多表連線的基數,FactorJoin 在查詢的端到端處理時間優於其它學習型方法 [4,5,6] 的情況下,模型大小、訓練及更新時間比它們低了一至兩個量級。
1 多表基數估計方法
給定A,B 兩表上的查詢Q :
SELECT * FROM A, B WHERE Id1 = Id2 AND A1>0 AND B1>0
圖1 兩表連線示例
分別介紹下面四種估計方法。
1.1 Selinger 模型
Selinger 模型 [7] 在估計時作了兩點假設:屬性獨立假設以及連線鍵均勻分佈假設。首先依據屬性獨立假設計算兩屬性的聯合機率密度P A(A1 > 0) * P B(B1 > 0) ;而後使用連線鍵均勻分佈假設估計兩表連線的大小:|A ⋈ B| = |A| * |B| / max{num uniques in A.Id1, num uniques in B.Id2} 。
圖2 Selinger模型估計示例
圖2給出了Selinger模型以圖1 所示資料進行估計的過程:
P A(A1 > 0) * P B(B1 > 0) = 1/2 * 1/2,|A ⋈ B| = 8 * 8 / 3 = 21
|Q| = P A(A1 > 0) * P B(B1 > 0) * |A ⋈ B|
= 1/2 * 1/2 * 8 * 8 / 3
= 5
該查詢的真實基數為4 * 4 = 16 ,可以看到Selinger 模型因其所作的兩點假設導致估計結果存在較大的誤差。
1.2 連線直方圖
連線直方圖在估計時依舊採用了屬性獨立假設與連線鍵均勻分佈假設。與Selinger 模型不同的是,在估計兩表連線大小的時候對連線鍵進行了劃分。如圖3所示,對應連線鍵中的相同值被劃分到具有相同下標的桶中(如值a 被劃分到桶1 ,值b 和c 被劃分到桶2 )。在計算兩表連線大小時,直接將該連線鍵上所有桶中的對應元素的連線數目加和即可。
圖3 連線直方圖估計示例
如圖2 所示,|A ⋈B| = 4 * 4 / 1 + 4 * 4 / 2 = 24 ,
|Q| = 1/2 * 1/2 * 24 = 6
可以看到,連線直方圖的估計誤差同樣很大,但因其在估計兩表連線大小時在連線鍵上劃分了一些桶,因而不需要遍歷所有元素,進而使得估計時間大大減少。
1.3 學習型資料驅動的方法
學習型基數估計方法依據使用的資料型別可分為兩類:查詢驅動的方法與資料驅動的方法。其中,查詢驅動的方法在處理多表基數估計時僅將連線型別作為特徵之一,並同其它特徵一同送入網路中進行訓練以構造出從查詢到基數的對映函式。這種方法並未對多表基數估計進行特殊處理,因此不多贅述。
資料驅動的方法在處理多表基數估計時大多會學習多表的聯合分佈。如DeepDB 、FLAT 等會將關聯性較強的兩表透過全外連線的方式進行結合並學習全外連線表的分佈情況。而後依據學習到的聯合分佈進行選擇度的估計。
圖4 資料驅動的方法示意圖
圖4給出了資料驅動的方法的示例,表A 和表B 透過連線鍵Id1 與Id2 連線後被送入模型以學習其分佈。最後得到的結果與真值極為接近。
1.4 本文提出的方法
因資料驅動的方法須學習多表的聯合分佈,所以模型較大、訓練及更新時間較長,所以作者想在僅知道單表統計資訊的情況下估計出多表查詢的基數。因此,作者採用了連線直方圖的思想,即分別統計出參與連線的兩表滿足對應謂詞的元組分佈情況,並在連線鍵上進行分桶,而後將所有桶中對應值的連線數目加和即可。該方法的估計過程如圖5 所示。為了提高效率,作者將其與機率圖模型相結合,具體情況如後文所述。
圖5 本文方法的示意圖
2 多表連線基數估計的新框架
2.1 兩表連線基數估計示例
如圖6所示,查詢Q 需要對錶A 和表B 在連線鍵A.id 與B.Aid 上進行連線。連線直方圖這類方法在估計兩表的基數時會分別篩選出符合兩表謂詞的元組A|Q(A) 與B|Q(B) ,而後在篩選出的元組上進行相應的連線操作。可算出最終的連線結果為:8 * 6 + 4 * 5 + 3 * 5 = 83 。
圖6 兩表估計示意圖
這一步驟表示成公式則如公式(1 )所示。其中,P A(A.id = v | Q(A)) 表示值v 在表A 中滿足謂詞Q(A) 的元組中的分佈情況。
2.2 多表估計示例
給定查詢Q2 :
SELECT * FROM A, B, C, D WHERE A.id = B.Aid AND A.id2 = C.Aid2 AND C.id = B.Cid AND C.id = D.Cid AND Q2(A) AND Q2(B) AND Q2(C) AND Q2(D)
如圖7所示,在處理查詢Q2 時,首先將查詢涉及到的表表示成圖6 (ii )的形式。其中,矩形陰影部分表示查詢涉及到的表,橢圓代表涉及到的連線鍵,實線表示對應的連線關係。同種顏色實現連線起來的各連線鍵被稱為等價鍵簇,後文在最佳化演算法時會用到這個概念。
圖7 四表基數估計示意圖
同兩表估計的思想一般,逐個對每個等價鍵簇中的值在各表中作等值連線。該計算過程表示成公式則如公式2 所示。其時間複雜度為O(n 3) 。為了降低複雜度,作者將查詢表示成圖6 (iii )所示的因子圖。其中,變數節點V1 表示等價鍵簇1 ;因子節點表示表,該節點中存有表中元素的分佈資訊P A(V1, V2 | Q2(A)) * |Q2(A)| ;實線表示表中該查詢涉及到該表在對應連線鍵上的連線操作。
因子圖的推理是機率圖模型中經過充分研究的問題,常用的推理方法有變數消除和信念傳播 [8](belief propagation) 這兩種方法。本文采用了變數消除這種方法,此時的時間複雜度為O(N * |D| max(|JK|))) ,其中,N 表示等價鍵簇的數量,|D| 表示所有連線鍵中最大的域的長度,max(|JK|) 表示單表擁有的最大連線鍵的數量。在圖7 中,max(|JK|) 的值為2 。在現實世界的資料庫中,這種複雜度還是不可接受的,因為|D| 可能達到百萬級別,而max(|JK|) 可能比4 還要大,因此是不可接受的。為了降低複雜度,作者對這兩個點分別進行了最佳化,具體過程如下文所述。
2.3 整體的工作流程
圖8 FactorJoin 的工作流
整體的工作流程如圖8 所示。在離線訓練時,FactorJoin 先分別在各表上建立單表估計模型並依據資料模型對所有連線鍵進行分桶並統計相應資訊。線上推理時,FactorJoin 先將查詢表示成因子圖,而後分別在單表上進行估計,最後使用變數消除演算法對各表的連線結果進行估計。值得一提的是,FactorJoin 估計的是查詢的基數上限,而非具體的基數值。這是作者降本提效的一種手段,詳情如下文所述。
3 提升效率的兩種方法
上文提到,使用變數消除演算法對因子圖進行推理的複雜度為O(N * |D| max(|JK|)) 。其中影響較大的有最大的屬性域的長度|D| 以及單表擁有的最多的連線鍵的數量max(|JK|) 。作者從這兩個方面入手,分別進行了最佳化,使複雜度進一步降低。
3.1 機率上限演算法
在以連線直方圖估計多表連線的大小時,需要對連線鍵進行遍歷以將兩表連線鍵上對應的值進行連線。在現實的資料庫中,連線鍵的域很大,能達到百萬級別。為了提升效率,作者借鑑了基於機率上限方法的思想,即估計出基數的上限而非具體的值。
圖9 使用分桶策略的量表估計示例
圖9 給出了兩表估計的例子。如圖,分別在表A 、表B 中篩選出符合相應謂詞的元組後,統計連線鍵上的值分佈情況並在連線鍵上劃分桶,使得兩表連線鍵上相同的值落在同一個下標的桶中。而後分別估計每個桶的連線上限,即先找出桶中的最頻繁值(most frequent value, MFV )及桶包含的元組數目。如在表A 的桶1 中,值a 出現的次數最多,為8 次;桶2 中MFV 出現的次數為6 次,則兩桶中同一個值作等值連線最多產生48 個連線結果。表A 的桶1 中總元組數目為16 ,則其桶1 中最多包含兩個MFV ;對應地,表B 的桶1 中最多包含4 個MFV 。因此可以估計出兩桶對應值作等值連線的數目上限為:min(2, 4) * 8 * 6 = 96 。對比真值為8 * 6 + 4 * 5 + 3 * 5 = 83 。表示成公式則如公式3 所示。
在連線鍵上進行分桶時,需要考慮兩個問題:劃分多少個桶以及把哪些值放入同一個桶內。作者分別對這兩個問題進行了處理。
基於工作流決定桶的數量k
桶的數量k 對FactorJoin 的效能有顯著影響:較少的桶將連線鍵域中更多不同的值聚合到每一個桶,因此模型的準確性較低但效率更高。作者提出了一種基於工作流分桶的方法,在給定桶的數量上限K = ∑ki 的情況下,依據等價鍵簇在工作流中出現的次數多少,對每個不同的等價鍵簇分配不同的桶數量;出現的次數越多,則分配的桶的數目越多。
分桶策略
傳統的分桶策略有等寬劃分和等高劃分,但這兩種方法在極端情況下會出現較大的誤差,且等價鍵簇中所有的連線鍵共用一個分桶結果,所以為了降低每個連線鍵上桶的方差,作者提出了一種貪婪的分桶策略(greedy binning selection algorithm , GBSA )。
GBSA 演算法如演算法2 所述。GBSA 首先在每個等價鍵簇中生成次優的分桶結果(line 1) ,而後對每個等價鍵簇執行演算法2 所示的過程(line 2-14) 。以等價鍵簇中連線鍵域的長度遞減的順序進行排序(line 3) 。用一半數量的桶降低第一個連線鍵的方差(line 4) 。在單屬性上獲得具有最小方差的劃分結果時,可將屬性排序後以等深策略進行劃分。而後,GBSA 將在當前連線鍵上的分桶結果逐個應用到它後面的連線鍵中,計算各個桶的方差並以遞減的方式排序(line 6-9) ,用剩餘的可分配桶的數目的一半數量最佳化當前的桶方差,即將相應的桶一分為二(line 10-12) 。
3.2 捕獲屬性間的依賴關係
在使用因子圖計算多表的基數時,時間複雜度為O(N * |D| max(|JK|)) ,|D| 為所有連線鍵中最長的域的長度,已透過機率上限演算法進行最佳化;指數項max(|JK|) 表示單表擁有的最多連線鍵的數量,在IMDB 資料集中,該值能大到4 ,所以作者對這一項進行最佳化。
由於因子圖需要知道單表中連線鍵的聯合分佈,單表的連線鍵數量就決定著該部分推理的複雜度。如對擁有六個屬性的表A{id1, id2, id3, id4, attr1, attr2} (idi 表示各個連線鍵),因子圖需要估計P A(id1, id2, id3, id4 | Q(A)) 。即使已經採用機率上限演算法,該部分時空複雜度也達到了k 2 。然而,可用貝葉斯網路構建各連線鍵的依賴關係並使用變數消除演算法進行推理。此時,僅需進行如下形式的計算:
P A(id1 | Q(A)) * P A(id2 | Q(A)) * P A(id3 | id1) * P A(id4 | id3)
這種形式效率更高因為它最多隻涉及二維分佈上的乘積。時空複雜度降低為了O(N * k 2) 。
3.3 子計劃估計結果的重用
由於最佳化器在選擇查詢計劃時,可能會估計多達上千個計劃的代價。但這些計劃可能存在一些相同的子計劃,所以為了進一步提升效率,作者將各子計劃的結果保留用作其餘部分的估計。
4 實驗
資料集
Baselines
PostgresSQL [10]: 使用基於直方圖的方法
JoinHist [1]: 傳統的基於連線直方圖的方法
WJSample [11]: 在多表中使用基於隨機遊走的wander join 方法生成樣本
MSCN [4]、BayesCard [9]、DeepDB [5]、FLAT [6]: 最 具代表性的學習型方法
PessEst [12]:SOTA 的基於上限的方法,利用隨機雜湊和資料畫像來使上限盡量接近真值
U-Block [13]: 使用 top-k 統計資料來估計基數界限
4.1 總體表現
表3 表4 分別給出了眾模型在STATS-CEB 與IMDB-JOB 上的端到端時間的實驗結果。在STATS 資料集上,多數方法的端到端時間優於Postgres ,FactorJoin 達到最優的效果;值得注意的是,DeepDB 、FLAT 的端到端時間雖然略長於FactorJoin ,但二者的計劃時間比FactorJoin 高了一個量級,應是在處理CEB 包含的查詢時會產生多種執行計劃,DeepDB 與FLAT 需要把每種計劃都推理一遍,因此比較耗時。
表4 給出了在IMDB 資料集上的端到端時間的實驗結果。可以看到,除了MSCN 和FactorJoin 外其它方法的效果均沒有Postgres 的好。因為相較於STATS 資料集,IMDB 的體量更大,IMDB 擁有更多的表、更大的屬性域以及更復雜的連線關係。且IMDB 含有較多的複雜字元類資料,而BayesCard 、DeepDB 以及FLAT 僅支援可列舉的字元型資料,所以並未進行相應的實驗。值得一提的是,FactorJoin 的端到端時間在STATS 資料集上與TrueCard 相近,但在IMDB 資料集上則與之相差較遠。這是因為IMDB 擁有更復雜的連線,而FactorJoin 在連線鍵上進行上限估計,當連線鍵增多時錯誤也會累積。MSCN 相較於Postgres 也有提升,因為查詢驅動的方法對資料集的大小不敏感而更依賴於訓練所使用的查詢的質量。
圖10 給出了多個模型在兩個資料集上的端到端時間、模型大小以及訓練時間的實驗結果。可以看到,FactorJoin 在各個實驗內容上都達到了最優的效果,且其模型大小與訓練時間比DeepDB 與FLAT 低了兩個量級。
圖10 在兩個資料集上的總體表現
4.2 詳細分析
圖11 給出了幾個模型在CEB 的146 個查詢上估計的相對誤差。可以看到,PessEst 生成精 確的上限並且從不低估。 FLAT 使用更大的模型來理解連線模式的分佈併產生最準確的估計。FactorJoin 可以為超過 90% 的子計劃查詢輸出基數上限。大多數邊際低估都非常接近真實基數。
圖11 在STATS上的相對誤差
圖12 在STATS上單個查詢的表現
圖12 給出了各模型在STATS-CEB 上單個查詢的表現。可以看到,在時間較短的查詢裡,多數模型的表現不如Postgres 。隨著查詢的端到端的時間的提升,幾種方法的效果開始優於Postgres ,因為隨著查詢的端到端時間的增加,用於計劃的時間佔比降低,執行時間佔比增大,而其餘方法相較於Postgres 有更高的準確度進而會產生代價更低的計劃。
4.3 消融實驗
圖13 給出了FactorJoin 在不同的k 值下的表現。可以看到,隨著桶數量的增加,模型估計的端到端時間以及相對誤差在逐步降低並逐漸趨於穩定。而單查詢的推理時延、訓練時間以及模型大小在快速增加。
圖13 不同桶的數量(k)對模型的影響
表6 給出了在使用不同分桶演算法的情況下模型的端到端時間。可以看到,等寬劃分和等高劃分的效果相近,而本文提出的GBSA 優於這兩種方法。
表8 給出了使用本文提出的兩種方法相較於傳統的連線直方圖的端到端時間對比。可以看到,本文提出的兩種方法都能提升模型的估計效果以使最佳化器選擇更優的執行計劃。
總結
本文提出了一種用於連線查詢的基數估計框架FactorJoin ,該框架將經典的連線直方圖與學習型單表基數估計結合成一個因子圖。該框架將傳統的基數估計問題轉化成因子圖的推理問題,且只需要知道單表的分佈。作者還提出了兩種最佳化演算法以提升模型的效率。最終,FactorJoin 在查詢的端到端時間優於其它SOTA 演算法的情況下,模型大小、訓練及更新時間比DeepDB 及FLAT 低了兩個量級。
參考文獻
[1] Alberto Dell’Era. 2007. Join Over Histograms. Available on www. adellera.it/investigations/join_over_histograms (2007).
[2] H-A Loeliger. 2004. An introduction to factor graphs. IEEE Signal Processing Magazine 21, 1 (2004), 28–41.
[3] Daphne Koller and Nir Friedman. 2009. Probabilistic graphical models: principles and techniques. MIT press.
[4] Andreas Kipf, Thomas Kipf, Bernhard Radke, Viktor Leis, Peter Boncz, and Alfons Kemper. 2019. Learned cardinalities: Estimating correlated joins with deep learning. In CIDR.
[5] Benjamin Hilprecht, Andreas Schmidt, Moritz Kulessa, Alejandro Molina, Kristian Kersting, and Carsten Binnig. 2019. DeepDB: learn from data, not from queries! In PVLDB.
[6] Rong Zhu, Ziniu Wu, Yuxing Han, Kai Zeng, Andreas Pfadler, Zhengping Qian, Jingren Zhou, and Bin Cui. 2021. FLAT: Fast, Lightweight and Accurate Method for Cardinality Estimation. VLDB 14, 9 (2021), 1489–1502.
[7] P Griffiths Selinger, Morton M Astrahan, Donald D Chamberlin, Raymond A Lorie, and Thomas G Price. 1979. Access path selection in a relational database management system. In SIGMOD. 23–34.
[8] Frank R Kschischang, Brendan J Frey, and H-A Loeliger. 2001. Factor graphs and the sum-product algorithm. IEEE Transactions on information theory 47, 2 (2001), 498–519.
[9] Ziniu Wu, Amir Shaikhha, Rong Zhu, Kai Zeng, Yuxing Han, and Jingren Zhou. 2020. BayesCard: Revitilizing Bayesian Frameworks for Cardinality Estimation. arXiv e-prints (2020), arXiv–2012.
[10] Postgresql Documentation 12. 2020. Chapter 70.1. Row Estimation Examples. https://www.postgresql.org/docs/current/row-estimation-examples.html (2020).
[11] Feifei Li, Bin Wu, Ke Yi, and Zhuoyue Zhao. 2016. Wander join: Online aggregation via random walks. In SIGMOD. 615–629.
[12] Walter Cai, Magdalena Balazinska, and Dan Suciu. 2019. Pessimistic cardinality estimation: Tighter upper bounds for intermediate join cardinalities. In SIGMOD. 18–35.
[13] Axel Hertzschuch, Claudio Hartmann, Dirk Habich, and Wolfgang Lehner. 2021. Simplicity Done Right for Join Ordering. CIDR (2021).
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69909943/viewspace-2940072/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 連線查詢
- SQL連線查詢SQL
- oracle 連線查詢Oracle
- 【Oracle】--連線查詢Oracle
- sql 連線查詢例項(left join)三表連線查詢SQL
- oracle 查詢計劃中的基數cardinality概念(一)Oracle
- 資料庫資料的查詢----連線查詢資料庫
- MySQL之連線查詢和子查詢MySql
- mysql查詢語句5:連線查詢MySql
- select查詢之四:連線查詢
- 查詢oracle歷史最大連線[會話]數Oracle會話
- MySQL之連線查詢MySql
- 資料庫 - 連線查詢、巢狀查詢、集合查詢資料庫巢狀
- mysql-分組查詢-子查詢-連線查詢-組合查詢MySql
- 一種期望線性的靜態區間查詢
- 五種查詢Internet連線狀態[含IP]的方法 (轉)
- oracle連線查詢詳解Oracle
- MySQL學習-連線查詢MySql
- Hibernate連線查詢join
- 【janes】多表查詢 外連線
- MySQL8:連線查詢MySql
- 水煮oracle31----連線查詢&合併查詢Oracle
- 分頁查詢,CBO評估的行數有誤。
- 【學習】SQL基礎-006-多表連線查詢SQL
- mysql三表連線查詢以及百分數排序MySql排序
- MySql中的資料查詢語言(DQL)三:連線查詢MySql
- MySQL內連線查詢語句MySql
- 分組查詢連線號段
- Sql Server系列:多表連線查詢SQLServer
- SQL複雜查詢多表連線SQL
- SQL裡3個表的連線查詢SQL
- oracle 查詢計劃中的基數cardinality概念(二)Oracle
- 「Goravel 上新」驗證表單的三種新姿勢,估計你只用過一種Go
- 3.DQL資料查詢語言(內連線,外連線,自連線)
- 連線查詢中不等式的運用
- MySQL 連線查詢超全詳解MySql
- Hibernate【查詢、連線池、逆向工程】
- PHP連線、查詢MySQL資料庫PHPMySql資料庫