如果兩個聯(lián)接輸入并不小但已在二者聯(lián)接列上排序(例如,如果它們是通過掃描已排序的索引獲得的),則合并聯(lián)接是最快的聯(lián)接操作。如果兩個聯(lián)接輸入都很大,而且這兩個輸入的大小差不多,則預(yù)先排序的合并聯(lián)接提供的性能與哈希聯(lián)接相近。
從上次我們分析來看,嵌套循環(huán)適合輸入和輸出都小的情況,那如果輸入和輸入都比較大情況下,使用合并算法什么情況下。
使用:
合并聯(lián)接本身的速度很快,但如果需要排序操作,選擇合并聯(lián)接就會非常費時。然而,如果數(shù)據(jù)量很大且能夠從現(xiàn)有 B 樹索引中獲得預(yù)排序的所需數(shù)據(jù),則合并聯(lián)接通常是最快的可用聯(lián)接算法。
我們來測試一下,合并連接的情況:
測試環(huán)境:表:workflowinfo1 約45萬條 表workflowbase1 約4.5萬條
條件:workflowbase1中列id,creater都建立索引,workflowinfo1中workflowid建立了索引。
如果兩個聯(lián)接輸入并不小但已在二者聯(lián)接列上排序(例如,如果它們是通過掃描已排序的索引獲得的),則合并聯(lián)接是最快的聯(lián)接操作。如果兩個聯(lián)接輸入都很大,而且這兩個輸入的大小差不多,則預(yù)先排序的合并聯(lián)接提供的性能與哈希聯(lián)接相近。~:(creater=4028814110830a1e01108fe379e60061’的workflowbase1表有1023條數(shù)據(jù))
測試語句:
合并算法
select a.* from workflowbase1 a inner merge join dbo.workflowinfo1 b
on a.id=b.workflowid and a.creater='4028814110830a1e01108fe379e60061'
hash算法
select a.* from workflowbase1 a inner hash join dbo.workflowinfo1 b
on a.id=b.workflowid and a.creater='4028814110830a1e01108fe379e60061'
注意:這兩條SQL和上一個嵌套循環(huán)的例子有區(qū)別,一個 select * 和一個是 select a.*
從上次我們分析來看,嵌套循環(huán)適合輸入和輸出都小的情況,那如果輸入和輸入都比較大情況下,使用合并算法什么情況下。
使用:
合并聯(lián)接本身的速度很快,但如果需要排序操作,選擇合并聯(lián)接就會非常費時。然而,如果數(shù)據(jù)量很大且能夠從現(xiàn)有 B 樹索引中獲得預(yù)排序的所需數(shù)據(jù),則合并聯(lián)接通常是最快的可用聯(lián)接算法。
我們來測試一下,合并連接的情況:
測試環(huán)境:表:workflowinfo1 約45萬條 表workflowbase1 約4.5萬條
條件:workflowbase1中列id,creater都建立索引,workflowinfo1中workflowid建立了索引。
如果兩個聯(lián)接輸入并不小但已在二者聯(lián)接列上排序(例如,如果它們是通過掃描已排序的索引獲得的),則合并聯(lián)接是最快的聯(lián)接操作。如果兩個聯(lián)接輸入都很大,而且這兩個輸入的大小差不多,則預(yù)先排序的合并聯(lián)接提供的性能與哈希聯(lián)接相近。~:(creater=4028814110830a1e01108fe379e60061’的workflowbase1表有1023條數(shù)據(jù))
測試語句:
合并算法
select a.* from workflowbase1 a inner merge join dbo.workflowinfo1 b
on a.id=b.workflowid and a.creater='4028814110830a1e01108fe379e60061'
hash算法
select a.* from workflowbase1 a inner hash join dbo.workflowinfo1 b
on a.id=b.workflowid and a.creater='4028814110830a1e01108fe379e60061'
注意:這兩條SQL和上一個嵌套循環(huán)的例子有區(qū)別,一個 select * 和一個是 select a.*