工会与或

时间:2010-06-23 16:32:01

标签: sql sql-server sql-server-2005 query-optimization

假设我有两个问题:

select top 20 idField, field1, field2 from table1
where idField in
    (
    select idField from table1 where field3 like '...'
    union
    select idField from table2 where field4 like '...'
    )
order by sortfield1

select top 20 idField, field1, field2 from table1
where field3 like '...' 
or idfield in 
(select idField from table2 where field4 like '...')
order by sortfield1

让我们说两个表都相当大(table2大于table1), 平均结果数范围是0-400,但我总是想要最多20个结果。

是否有可能以较大的概率说出哪种陈述会更高效 和/或声明的选择取决于什么? 谢谢

4 个答案:

答案 0 :(得分:1)

它很可能取决于您使用的dbms。我使用Oracle(8)的联合体验很糟糕,它非常慢,可能是因为它必须将两个查询的结果放入内存中的列表中。

我不确定这两个查询是否具有相同的结果。第二个查询仅返回table1中的值,而第一个查询也返回table2中的值。

答案 1 :(得分:1)

检查解释计划,看看效率如何。如果索引目前不存在,它还可以让您深入了解索引。

答案 2 :(得分:1)

在完美世界中,这不应该有所作为,但我仍然会尝试这种方法。可能会更快:

select top 20 idField, field1, field2 from table1
where idField in
    (
    select top 20 idField from table1 where field3 like '...'
    union
    select top 20 idField from table2 where field4 like '...'
    )

答案 3 :(得分:0)

仅仅通过查看你的答案,我猜第二个查询会更快,虽然不知道更多关于模式,索引和数据只能猜测。由于您使用LIKE,搜索字符串也会产生很大的不同,特别是如果您使用的是前导通配符。

使用LEFT OUTER JOIN或EXISTS可能会比使用“IN”的问题中的任何一个解决方案更快。但是,如果没有更多的信息,我再也无法肯定。

相关问题