我有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