關係代數的並行計算,關係代數並行計算

來源:互聯網
上載者:User

關係代數的並行計算,關係代數並行計算

從Dremel和Impala的學習引申出了SQL查詢的並存執行問題,於是藉此機會深入學習一下關聯式資料庫以及關係代數的並行計算。

Speedup和Scaleup

Speedup指用兩倍的硬體換來一半的執行時間。Scaleup指兩倍的硬體換來同等時間內執行兩倍的任務。但往往事情不是那麼簡單,兩倍的硬體也會帶來其他問題:更多CPU帶來的長啟動時間和通訊開銷,以及並行計算帶來的資料扭曲問題。


多處理器架構

共用記憶體:任意CPU都能訪問任意的記憶體(全域共用)和磁碟。優點是簡單,缺點是擴充性差,可用性低。


共用磁碟:任意CPU都能訪問任何的磁碟,但是只能訪問自己的主存。優點是可用性和擴充性比較好,缺點是實現複雜以及潛在的效能問題。


不共用:任意CPU都只能訪問自己的主存和磁碟。優點也是擴充性和可用性,缺點是實現複雜以及複雜均衡。


混合型:系統整體上是shared nothing架構,但結點內部可能是其他架構。這樣就混合了多種架構的優點。


資料分區

資料分區的目的就是:讓資料庫能夠並行地讀寫資料,最大程度地挖掘I/O的潛力。常見的分區演算法有:round-robin、範圍索引、雜湊。


關係運算並行化

關係代數自身的屬性允許關係操作的並行化


並行查詢處理主要分為四步:

Ø  翻譯:將關係代數運算式翻譯成查詢樹。

Ø  最佳化:重排join順序,並選擇不同join演算法來最小化執行開銷。

Ø  並行:將查詢樹轉換成物理操作樹,並載入到處理器。

Ø  執行:並行運行最終的執行計畫。

首先將一條SQL語句翻譯成查詢樹。


然後根據表大小、索引等情況,重新排列join順序,並選擇合適的演算法。


關於join演算法,常見的有以下幾種:

Ø  Nested Loop join:思路很簡單,相當於兩層迴圈遍曆,外層是驅動表,返回滿足關聯條件的行。適用於驅動表小(經過條件過濾後),而被驅動表上join欄位有索引的情況。在兩表都很大時效率很差。

for each row R1 in the outer table
    for each row R2 in the inner table
        if R1 joins with R2
            return (R1, R2)

Ø  Sort-merge join:思路也很簡單,就是按join欄位排序,然後進行歸併排序。當join欄位存在重複值時,相當於每個重複值形成了一個分區。Join欄位是否排序和重複值的多少決定了sort-merge的效率。適用於兩表都很大的情況,尤其當join欄位上存在叢集索引時(相當於已經排好序了),效率很高。演算法主要消耗在磁碟上。

Ø  Hash join:類似於存在重複值情況時的sort-merge,只不過是人為的使用雜湊函數進行分區。思路是掃描小表建立雜湊表(build階段,小表也叫build表),然後漸進式掃描大表進行比較(probe階段,大表也叫probe表)。適用於兩表都很大又沒有索引的情況,限制是只適用於等值串連。演算法主要消耗在CPU上。


此外,對於子查詢還有semi joinanti join等演算法。

 

最後將查詢樹變成物理操作樹,也就是真正的執行計畫。然後根據叢集的資源情況,調度到合適的結點上進行並行計算。


參考資料

1 Parallel Query Processing

 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.