SQL Server三大演算法的I/O成本計算
本文作者先對SQL Server三大演算法的IO成本進行分析,然後提出優化原則。希望可以給讀者帶來幫助。
1. Nested Loop Join(巢狀迴圈聯結)
演算法:
其思路相當的簡單和直接:對於關係R的每個元組 r 將其與關係S的每個元組 s 在JOIN條件的欄位上直接比較並篩選出符合條件的元組。
代價:
被聯結的表所處內層或外層的順序對磁碟I/O開銷有著非常重要的影響。而CPU開銷相對來說影響較小,主要是元組讀入記憶體以後(in-memory)的開銷,是 O (n * m)
對於I/O開銷,根據 page-at-a-time 的前提條件,I/O cost = M + M * N,
翻譯一下就是 I/O的開銷 = 讀取M頁的I/O開銷 + M次讀取N頁的I/O開銷。
2. Sort-Merge Join (排序合併聯結)
Nested Loop一般在兩個集合都很大的情況下效率就相當差了,而Sort-Merge在這種情況下就比它要高效不少,尤其是當兩個集合的JOIN欄位上都有聚集索引(clustered index)存在時,Sort-Merge效能將達到最好。
演算法:
基本思路也很簡單(複習一下資料結構中的合併排序吧),主要有兩個步驟:
a.按JOIN欄位進行排序。
b.對兩組已排序集合進行合併排序,從來源端各自取得資料列後加以比較(需要根據是否在JOIN欄位有重複值做特殊的“分割槽”處理)。
代價:(主要是I/O開銷)
有兩個因素左右Sort-Merge的開銷:JOIN欄位是否已排序 以及 JOIN欄位上的重複值有多少。
最好情況下(兩列都已排序且至少有一列沒有重複值):O (n + m) 只需要對兩個集合各掃描一遍。(這裡的m,n如果都能用到索引那就更好了)。
最差情況下(兩列都未排序且兩列上的所有值都相同):O (n * log n + m * log m + n * m) 兩次排序以及一次全部元組間的笛卡爾乘積。
3. Hash Join (雜湊聯結)
Hash Join在本質上類似於兩列都有重複值時的Sort-Merge的處理思想——分割槽(patitioning)。但它們也有區別:Hash Join通過雜湊來分割槽(每一個桶就是一個分割槽)而Sort-Merge通過排序來分割槽(每一個重複值就是一個分割槽)。
值得注意的是,Hash Join與上述兩種演算法之間的較大區別同時也是一個較大限制是它只能應用於等值聯結(equality join),這主要是由於雜湊函式及其桶的確定性及無序性所導致的。
演算法:
基本的Hash Join演算法由以下兩步組成:
同nested loop,在執行計劃中build input位於上方,probe input位於下方。
hash join操作分兩個階段完成:build(構造)階段和probe(探測)階段。
a.Build Input Phase: 基於JOIN欄位,使用雜湊函式h2為較小的S集合構建記憶體中(in-memory)的雜湊表,相同鍵值的以linked list組成一個桶(bucket)
b.Probe Input Phase: 在較大的R集合上對雜湊表進行核對以完成聯結。
代價:
值得注意的是對於大集合R的每個元組 r ,hash bucket中對應 r 的那個bucket中的每個元組都需要與 r 進行比較,這也是演算法最耗時的地方所在。
CPU開銷是O (m + n * b) b是每個bucket的平均元組數量。
總結:
三種join方法,都是擁有兩個輸入,優化的基本原則:
1.避免大資料的hash join,(hash join適合低併發情況,他佔用記憶體和io是很大的);
2.儘量將其轉化為高效的merge join、nested loop join。可能使用的手段有表結構設計、索引調整設計、SQL優化,以及業務設計優化。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-622813/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 計算機I/O與I/O模型計算機模型
- Understanding How to Set the SQL Server I/O Affinity OptionSQLServer
- SQL Server 2008 I/O效能監控SQLServer
- SQL Server 2008效能故障排查(三)——I/OSQLServer
- 計算機組成原理——I/O通道計算機
- SQL Server日期計算SQLServer
- CPU-bound(計算密集型) 和I/O bound(I/O密集型)
- SQL Server日期計算 (轉)SQLServer
- 揭秘計算機奇蹟:探索I/O裝置的神秘世界!計算機
- WARNING:Could not increase the asynch I/O limit to 164 for SQL direct I/OMITSQL
- WARNING:Could not lower the asynch I/O limit to 160 for SQL direct I/O.MITSQL
- expdp匯出時卡死 Could not increase the asynch I/O limit to for SQL direct I/OMITSQL
- WARNING:Could not increase the asynch I/O limit to 224 for SQL direct I/O.MITSQL
- not set asynch I/O limit to nnnn for SQL directo I/O.It is set to 200_848859.1MITSQL
- SQL Server與雲端計算(下)WCSQLServer
- SQL Server與雲端計算(上)UHSQLServer
- SQL Server各種日期計算方法SQLServer
- 標準成本計算和平均成本計算比較
- Oracle標準成本計算和平均成本計算比較Oracle
- expdp匯出時卡死 Could not increase the asynch I/O limit to XXX for SQL direct I/OMITSQL
- Veritas Quick I/O and Cached Quick I/OUI
- SQL Server 中 ntext 長度如何計算 ?SQLServer
- java的I/OJava
- Oracle 成本計算公式Oracle公式
- CBO成本計算初探
- I/O埠和I/O記憶體記憶體
- 緩解 SQL Server has encountered 727 occurrence(s) of I/O requests taking longer than 15 secondsSQLServer
- sql server 重新啟動計算機失敗SQLServer計算機
- not lower asynch I/O limit to 224 for SQL dire I/O Aft Upgrad 10.2.0.5_1155445.1MITSQL
- 設計模式中巧記I/O設計模式
- 系統程式設計 - I/O模型程式設計模型
- Java I/OJava
- 計算機組成與體系結構-I/O資料傳輸計算機
- NESTED LOOPS 成本計算OOP
- 產品成本計算方法
- 計算SQL Server備份一次所花的時間SQLServer
- 探索計算機的I/O控制方式:瞭解DMA控制器的作用與優勢計算機
- 有關工序成本的計算邏輯