Sql Server 2005 合併聯接演算法

2022-03-31 22:48:28 字數 4178 閱讀 4179

簡介:

如果兩個聯接輸入並不小但已在二者聯接列上排序(例如,如果它們是通過掃瞄已排序的索引獲得的),則合併聯接是最快的聯接操作。如果兩個聯接輸入都很大,而且這兩個輸入的大小差不多,則預先排序的合併聯接提供的效能與雜湊聯接相近。

從上次我們分析來看,巢狀迴圈適合輸入和輸出都小的情況,那如果輸入和輸入都比較大情況下,使用合併演算法什麼情況下最優。

最佳使用:

合併聯接本身的速度很快,但如果需要排序操作,選擇合併聯接就會非常費時。然而,如果資料量很大且能夠從現有

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...