當單臺數據庫的數據量太大而影響性能時,能夠把數據拆分到多臺服務器上,每臺服務器只承擔部分計算壓力,再由SPL合併計算結果。特殊地,數據可拆分爲歷史數據庫和當前實時數據庫,由SPL實現T+0計算。下面用幾個典型例子來講明分庫彙總的用法。mysql
過濾算法
訂單表orders分庫存儲在兩個Oracle數據庫中,數據源名分別爲orclA、orclB,請過濾出金額amount大於等於10000的訂單。sql
SPL代碼以下:數據庫
排序服務器
請過濾出金額大於等於10000的訂單,並按訂單金額順序排序。函數
分庫排序算法中,各線程的計算結果不能簡單合併,而要用merge函數歸併,SPL代碼以下:性能
分組彙總spa
請將訂單表按年、月分組,對各組數據的amount字段求和。線程
分庫分組彙總算法中,合併後的數據要作二次分組彙總,SPL代碼以下:翻譯
若是分組數較多,則應當利用有序來提升性能,具體作法是:在SQL中事先按分組字段排序,使SQL結果有序,以後使用歸併算法合併數據,並用group@o分組彙總。SPL代碼以下:
分組彙總後過濾
請將訂單表按年、月分組,對各組數據的amount字段求和,再過濾出彙總值大於110000000的結果。
SQL實現本算法,一般在group by後帶having語句,即:
select extract(year from orderTime)y,extract(month from orderTime)m,sum(amount) amt from orders group by extract(year from orderTime),extract(month from orderTime) having sum(amount)>=120000000
分庫實現算法時,不能直接使用上述SQL,應該先實現分組彙總算法,再用SPL實現過濾。代碼以下:
異構庫分庫
SPL除了支持同構庫分庫,也支持異構庫分庫。須要注意的是,不一樣數據庫的SQL語法並不通用,好比數字截斷函數,Oracle中寫做trunc,在MySQL中寫做truncate。爲了正確處理不一樣的語法,應當先寫出SPL標準SQL,再用SPL的sqltranslate函數翻譯成不一樣的本地SQL。
好比:orders表分庫存儲在Oracle和mysql中,數據源名爲orcl和my,請查詢amount字段大於等於10000的記錄,並將amount字段截斷取整。
SPL代碼以下:
鏈接
除了單表分庫計算,SPL也支持多表鏈接分庫計算。這種狀況下應對事實表和維表分別處理,事實表應當分庫存放,每一個數據庫存放一部分數據,維表不分庫,應當全量複製到每個數據庫中。
好比銷售人員表sales是訂單表orders的維表,二者以salesID爲關聯字段,請按sales表的部門字段dept分組,求各部門的銷售額。假設sales表已全量存儲於各數據庫,則SPL代碼以下: