關聯動作會嚴重影響效能,spl支援記憶體預關聯,可以加快關聯動作,從而提公升效能。
為了理解關聯動作對效能的影響,下面設計一套oracle關聯表,以及無關聯的寬表,並執行同樣的計算。
關聯表的結構和關係如下:
資料量:聯絡歷史表(百萬條)、使用者表(十萬條)、開戶網點(一萬條),**商表(一萬條)。
計算目標:求通訊總成本,即所有呼出使用者和呼入使用者分別對應的網點均攤成本、**商均攤成本之和。
將關聯結果寫入另一張表,形成無關聯的寬表:
下面的spl指令碼,用來說明關聯動作對效能的影響:
可以看到,關聯比無關聯慢12.6倍(25802/2055),會嚴重影響計算效能。
spl可以通過預關聯來提公升關聯動作的效能。首先載入資料到記憶體,**如下:
為了直觀理解預關聯對計算效能的提公升,下面同樣用spl預關聯和寬表做比較。
可以看到,預關聯比寬表慢6倍(13272/2210),相對於關聯錶比寬表慢的12.6倍,已經有較大幅度的提公升。在寬表時,spl計算效能和oracle幾乎相同(2210:2055),但在有關聯時,預關聯的spl計算速度已經明顯超出臨時關聯的oracle了(13272:25802)。
需要注意的是,上述演算法雖然使用了寬表做對比,但並不是說寬表可以代替關聯表。事實上,寬表會浪費大量空間,還會造成建立、同步等維護困難,實際專案中很少用到。而預關聯使用引用來建立關聯,不會創造新錶,不會浪費空間,不需要同步資料。
效能優化技巧 預關聯
sql中join的效能是個老大難問題,特別是關聯表較多時,計算效能會急劇下降。sql實現join一般是採用hash分堆的辦法,即先計算關聯鍵的hash值,再將相同hash值的記錄放到一起再做遍歷對比。每乙個join都要做一輪這樣的運算。如果資料量相對於記憶體並不是很大,可以事先全部載入到記憶體中,那...
效能優化技巧 部分預關聯
在 效能優化技巧 預關聯 中,我們測試了將資料表事先全部載入進記憶體並做好關聯後的查詢效能優化問題,但如果記憶體不夠大,不能將維表和事實表全部裝入,那怎麼辦呢?此時,可以將維表預先裝入記憶體,建好索引,實現維表部分的預關聯,省去一半hash計算。我們下面再來測試一下這種場景,這次用資料量最大 記憶體...
效能優化08 記憶體抖動和計算效能優化案例
android效能優化彙總 優化後的斐波那契數列的非遞迴演算法 caching快取 批處理思想 public int computefibonacci int positioninfibsequence return current 1 優化前 public void imprettysuresor...