解析SQL Server三大算法的I/O成本_Mssql數(shù)據(jù)庫教程
推薦:怎樣利用SQL Server 2005中的模板參數(shù)如果你用SQL Server 2005 Management Studio建立函數(shù)或存儲過程,你會注意到這些新窗口中都是模板。通常,你可以獲得一個散布著標(biāo)記的框架。 列表A是一個通過擴(kuò)張對象瀏覽器(object explorer)中可編程性節(jié)點(diǎn)而建立的實(shí)例,選擇存儲過程,然后右擊并選擇新的
1. Nested Loop Join(嵌套循環(huán)聯(lián)結(jié))
算法:
其思路相當(dāng)?shù)暮唵魏椭苯樱簩τ陉P(guān)系R的每個元組 r 將其與關(guān)系S的每個元組 s 在JOIN條件的字段上直接比較并篩選出符合條件的元組。寫成偽代碼就是:
代價:
被聯(lián)結(jié)的表所處內(nèi)層或外層的順序?qū)Υ疟PI/O開銷有著非常重要的影響。而CPU開銷相對來說影響較小,主要是元組讀入內(nèi)存以后(in-memory)的開銷,是 O (n * m)
對于I/O開銷,根據(jù) page-at-a-time 的前提條件,I/O cost = M M * N,
翻譯一下就是 I/O的開銷 = 讀取M頁的I/O開銷 M次讀取N頁的I/O開銷。
2. Sort-Merge Join (排序合并聯(lián)結(jié))
Nested Loop一般在兩個集合都很大的情況下效率就相當(dāng)差了,而Sort-Merge在這種情況下就比它要高效不少,尤其是當(dāng)兩個集合的JOIN字段上都有聚集索引(clustered index)存在時,Sort-Merge性能將達(dá)到最好。
算法:
基本思路也很簡單(復(fù)習(xí)一下數(shù)據(jù)結(jié)構(gòu)中的合并排序吧),主要有兩個步驟:
a.按JOIN字段進(jìn)行排序
b.對兩組已排序集合進(jìn)行合并排序,從來源端各自取得數(shù)據(jù)列后加以比較(需要根據(jù)是否在JOIN字段有重復(fù)值做特殊的“分區(qū)”處理)
代價:(主要是I/O開銷)
有兩個因素左右Sort-Merge的開銷:JOIN字段是否已排序 以及 JOIN字段上的重復(fù)值有多少。
◆最好情況下(兩列都已排序且至少有一列沒有重復(fù)值):O (n m) 只需要對兩個集合各掃描一遍。(這里的m,n如果都能用到索引那就更好了)
◆最差情況下(兩列都未排序且兩列上的所有值都相同):O (n * log n m * log m n * m) 兩次排序以及一次全部元組間的笛卡爾乘積
3. Hash Join (哈希聯(lián)結(jié))
Hash Join在本質(zhì)上類似于兩列都有重復(fù)值時的Sort-Merge的處理思想——分區(qū)(patitioning)。但它們也有區(qū)別:Hash Join通過哈希來分區(qū)(每一個桶就是一個分區(qū))而Sort-Merge通過排序來分區(qū)(每一個重復(fù)值就是一個分區(qū))。
值得注意的是,Hash Join與上述兩種算法之間的較大區(qū)別同時也是一個較大限制是它只能應(yīng)用于等值聯(lián)結(jié)(equality join),這主要是由于哈希函數(shù)及其桶的確定性及無序性所導(dǎo)致的。
算法:
基本的Hash Join算法由以下兩步組成:
同nested loop,在執(zhí)行計(jì)劃中build input位于上方,probe input位于下方。
hash join操作分兩個階段完成:build(構(gòu)造)階段和probe(探測)階段。
a.Build Input Phase: 基于JOIN字段,使用哈希函數(shù)h2為較小的S集合構(gòu)建內(nèi)存中(in-memory)的哈希表,相同鍵值的以linked list組成一個桶(bucket)
b.Probe Input Phase: 在較大的R集合上對哈希表進(jìn)行核對以完成聯(lián)結(jié)。
代價:
值得注意的是對于大集合R的每個元組 r ,hash bucket中對應(yīng) r 的那個bucket中的每個元組都需要與 r 進(jìn)行比較,這也是算法最耗時的地方所在。
CPU開銷是O (m n * b) b是每個bucket的平均元組數(shù)量。
總結(jié):
三種join方法,都是擁有兩個輸入,優(yōu)化的基本原則:
1.避免大數(shù)據(jù)的hash join,(hash join適合低并發(fā)情況,他占用內(nèi)存和io是很大的);
2.盡量將其轉(zhuǎn)化為高效的merge join、nested loop join�?赡苁褂玫氖侄斡斜斫Y(jié)構(gòu)設(shè)計(jì)、索引調(diào)整設(shè)計(jì)、SQL優(yōu)化,以及業(yè)務(wù)設(shè)計(jì)優(yōu)化。
分享:解讀SQL2005:一個很實(shí)用的函數(shù)COALESCE 返回其參數(shù)中的第一個非空表達(dá)式,當(dāng)你要在n個字段中選取某一個非空值可以用它,比如下面語句 以下為引用的內(nèi)容:
- sql 語句練習(xí)與答案
- 深入C++ string.find()函數(shù)的用法總結(jié)
- SQL Server中刪除重復(fù)數(shù)據(jù)的幾個方法
- sql刪除重復(fù)數(shù)據(jù)的詳細(xì)方法
- SQL SERVER 2000安裝教程圖文詳解
- 使用sql server management studio 2008 無法查看數(shù)據(jù)庫,提示 無法為該請求檢索數(shù)據(jù) 錯誤916解決方法
- SQLServer日志清空語句(sql2000,sql2005,sql2008)
- Sql Server 2008完全卸載方法(其他版本類似)
- sql server 2008 不允許保存更改,您所做的更改要求刪除并重新創(chuàng)建以下表
- SQL Server 2008 清空刪除日志文件(瞬間日志變幾M)
- Win7系統(tǒng)安裝MySQL5.5.21圖解教程
- 將DataTable作為存儲過程參數(shù)的用法實(shí)例詳解
Mssql數(shù)據(jù)庫教程Rss訂閱編程教程搜索
Mssql數(shù)據(jù)庫教程推薦
- asp.net連接查詢SQL數(shù)據(jù)庫并把結(jié)果顯示在網(wǎng)頁上(2種方法)
- 談SQL Data Services將成為云中完整的數(shù)據(jù)庫
- 當(dāng)SQL Server數(shù)據(jù)庫崩潰時如何恢復(fù)
- 讓sql2005運(yùn)行在獨(dú)立用戶下出現(xiàn) WMI 提供程序錯誤的解決方式
- 詳解SQL存儲過程
- 解析SQL Server三大算法的I/O成本
- sqlserver附加.mdf權(quán)限問題解決
- 解讀SQL Server小知識:Processor Affinity
- 解析SQL 2000和Sql 2005如何相互轉(zhuǎn)換
- 淺析優(yōu)化SQL語句性能調(diào)整原則
- 相關(guān)鏈接:
- 教程說明:
Mssql數(shù)據(jù)庫教程-解析SQL Server三大算法的I/O成本
。