簡介:
如果兩個聯接輸入並不小但已在二者聯接列上排序(例如,如果它們是通過掃瞄已排序的索引獲得的),則合併聯接是最快的聯接操作。如果兩個聯接輸入都很大,而且這兩個輸入的大小差不多,則預先排序的合併聯接提供的效能與雜湊聯接相近。
從上次我們分析來看,巢狀迴圈適合輸入和輸出都小的情況,那如果輸入和輸入都比較大情況下,使用合併演算法什麼情況下最優。
最佳使用:
合併聯接本身的速度很快,但如果需要排序操作,選擇合併聯接就會非常費時。然而,如果資料量很大且能夠從現有
b 樹索引中獲得預排序的所需資料,則合併聯接通常是最快的可用聯接演算法。
我們來測試一下,合併連線的最優情況:
測試環境:表:
workflowinfo1 約45
萬條表workflowbase1
約4.5
萬條條件:
workflowbase1
中列id
,creater
都建立索引,
workflowinfo1
中workflowid
建立了索引。
1,測試條件:(
creater=4028814110830a1e01108fe379e60061』
的workflowbase1
表有1023
條資料)
測試語句:
合併演算法
select
a.*from workflowbase1 a inner
merge
join dbo.workflowinfo1 b
ona.id=b.workflowid and a.creater=
'4028814110830a1e01108fe379e60061'
hash
演算法select
a.*from workflowbase1 a inner
hash
join dbo.workflowinfo1 b
ona.id=b.workflowid and a.creater=
'4028814110830a1e01108fe379e60061'注意:
這兩條sql
和上乙個巢狀迴圈的例子有區別,乙個
select *
和乙個是
select a.*
重啟資料庫服務,檢視成本:
執行結果
:(10468
行受影響)表
'workflowinfo1'
。掃瞄計數
1,邏輯讀取
3527
次,物理讀取
1 次,預讀
3528
次,lob
邏輯讀取
0 次,
lob
物理讀取
0 次,
lob
預讀0 次。表
'workflowbase1'
。掃瞄計數
1,邏輯讀取
1571
次,物理讀取
0 次,預讀
1624
次,lob
邏輯讀取
0 次,
lob
物理讀取
0 次,
lob
預讀0
次。(10468
行受影響)表
'workflowbase1'
。掃瞄計數
3,邏輯讀取
1571
次,物理讀取
0 次,預讀
0 次,
lob
邏輯讀取
0 次,
lob
物理讀取
0 次,
lob
預讀0 次。表
'workflowinfo1'
。掃瞄計數
3,邏輯讀取
3886
次,物理讀取
0 次,預讀
0 次,
lob
邏輯讀取
0 次,
lob
物理讀取
0 次,
lob
預讀0 次。表
'worktable'
。掃瞄計數
0,邏輯讀取
0 次,物理讀取
0 次,預讀
0 次,
lob
邏輯讀取
0 次,
lob
物理讀取
0 次,
lob
預讀0
次。這,時,merge演算法比
hash
演算法少了
357次
io。這時發現,成本對比,合併連線要優於
hash連線,
排序使用了
b-tree
索引的排序,大表
workflowinfo1
就沒有排序操作。
這裡驗證了上面的一句話
:如果資料量很大且能夠從現有
b 樹索引中獲得預排序的所需資料,則合併聯接通常是最快的可用聯接演算法
如果我們換一下,將
select a.*
換成select *
,看看成本
這裡hash連線是最優的演算法
執行結果:
(10468
行受影響)表
'workflowbase1'
。掃瞄計數
3,邏輯讀取
1571
次,物理讀取
0 次,預讀
0 次,
lob
邏輯讀取
0 次,
lob
物理讀取
0 次,
lob
預讀0 次。表
'workflowinfo1'
。掃瞄計數
3,邏輯讀取
9604
次,物理讀取
0 次,預讀
0 次,
lob
邏輯讀取
0 次,
lob
物理讀取
0 次,
lob
預讀0
次。(10468
行受影響)y表
'worktable'
。掃瞄計數
0,邏輯讀取
0 次,物理讀取
0 次,預讀
0 次,
lob
邏輯讀取
0 次,
lob
物理讀取
0 次,
lob
預讀0 次。表
'workflowinfo1'
。掃瞄計數
1,邏輯讀取
9604
次,物理讀取
0 次,預讀
0 次,
lob
邏輯讀取
0 次,
lob
物理讀取
0 次,
lob
預讀0 次。表
'workflowbase1'
。掃瞄計數
1,邏輯讀取
1571
次,物理讀取
0 次,預讀
0 次,
lob
邏輯讀取
0 次,
lob
物理讀取
0 次,
lob
預讀0
次。這裡的hash和merge的io次數一樣,但merge連線裡多了乙個排序操作,佔到整個成本的60&,的確驗證了上面的一句話:
合併聯接本身的速度很快,但如果需要排序操作,選擇合併聯接就會非常費時。
兩個聯接輸入並不小但已在二者聯接列上排序,則合併聯接是最快的聯接操作。如果沒有排序
hash
連線是最優的操作。
注意:這裡的排序指
兩個輸入集合必須按相等列進行分別排序。而不是按其他列排序。
SQL Server2005複製實現
一 準備工作 1 在發布伺服器上建立乙個共享目錄,作為發布快照檔案的存放目錄。例如 在d 盤根目錄下建資料夾名為pub 2 設定sql 發布伺服器和訂閱伺服器均設定 步驟 開啟服務 控制面板 管理工具 服務 右擊sqlserver agent 屬性 登入 選擇 此帳戶 輸入或選擇第一步中建立的win...
SQL Server 2005完全解除安裝
sql server 2005的解除安裝是乙個非常頭疼的問題。我曾經嘗試過直接使用 新增或刪除程式 工具解除安裝 清除安裝目錄 刪除登錄檔內容等等各種方式綜合解除安裝,勉強成功。現在終於找到了乙個事半功倍的方法,多次嘗試,未有失敗,具體如下 第一種是微軟官方提供的工具 msicuu2.exe 微軟官...
SQLSERVER 2005 遞迴查詢
專案中有使用者組表usergroup如下 其中pid表示當前組的上級組 表資料如下 現在想查詢出頂級組 沒有上級組叫頂級組 a1組的所有子孫組id,sql如下 查詢子節點 with rtd1 as select id pid from usergroup rtd2 as select from rt...