我有2個單獨的查詢,它們只是基本的選擇,都返回一個不同的int列。然後,我需要將這兩個ints列表結合在一起,以產生一個最終的單獨列表。從2個不同的int列表中獲取不同的int列表
有沒有更快的方法來做到這一點比以下?
SELECT DISTINCT ID
FROM dbo.Test
UNION
SELECT DISTINCT ID
FROM dbo.Test2
我有2個單獨的查詢,它們只是基本的選擇,都返回一個不同的int列。然後,我需要將這兩個ints列表結合在一起,以產生一個最終的單獨列表。從2個不同的int列表中獲取不同的int列表
有沒有更快的方法來做到這一點比以下?
SELECT DISTINCT ID
FROM dbo.Test
UNION
SELECT DISTINCT ID
FROM dbo.Test2
如果你沒有在每個表中重複,再下面是可能更快:
select id
from dbo.test
union all
select id
from dbo.test1 t1
where not exists (select 1 from dbo.test t where t.id = t1.id);
對於這一點,你要對test(id)
的索引。
即使有重複,下面是可能會更快:
select distinct id
from dbo.test
union all
select distinct id
from dbo.test1 t1
where not exists (select 1 from dbo.test t where t.id = t1.id);
這需要兩個test(id)
和test1(id)
指標。這個想法是索引被掃描以返回id。
我認爲在你的情況下,最快的方法是刪除這兩個DISTINCT
因爲UNION
將刪除所有重複整體反正:
SELECT ID
FROM dbo.Test
UNION
SELECT ID
FROM dbo.Test2
注意兩個DISTINCT
■不要確保整個唯一無論如何,這兩個序列就是UNION
所做的。如果你不需要/想要獨特的元素使用UNION ALL
。
我認爲這不一定更快。如果這兩個表有'id'上的索引,我不確定SQL Server是否會使用該索引進行重複刪除。如果每個表都有很多重複項,這可能會對性能產生很大影響。 –
當它是一個UNION時,不需要做SELECT DISTINCT。 (由於UNION刪除所有重複項。) – jarlh
從兩個查詢中刪除'DISTINCT',這是'union'所做的。 –
@vpk:'union all'確實比'union'更快,但它不會消除重複值:-) – dnoeth