SQL where-clause中的union的替代方法

时间:2011-06-22 05:31:32

标签: sql sql-server sql-server-2005

where子句中,我正在使用

SELECT name 
  FROM products 
 WHERE id IN (
           SELECT product_id 
             FROM orders 
            UNION 
           SELECT 1);

需要时间来执行union

请提供一些其他替代方法来提高我的查询效果

5 个答案:

答案 0 :(得分:5)

怎么样

select name from products
where id in (select product_id from orders)
    or id = 1

答案 1 :(得分:4)

union删除重复项,遗憾的是,当union谓词中使用IN的结果时,SQL Server可能无法发现不需要这样的删除。

SELECT name 
  FROM products 
 WHERE id IN (
           SELECT product_id 
             FROM orders 
            UNION ALL
           SELECT 1);

UNION ALL表示允许重复,因此可以避免删除重复项的昂贵步骤。即使您可能认为,因为联合的第二部分只有一个值,重复检查应该很快,但事实并非如此。 UNION表示必须删除所有重复项。它必须从查询的第一部分中消除所有重复的product_id。


我刚做了一些快速测试,发现一个repro,其中优化器不够智能,以避免重复删除,版本2000,2005,2008。所有3显示一个查询计划,显示一个独特的排序是在表扫描(#IDs)和恒定扫描之间连接之后使用:

create table #IDs (
    ID int not null
)
go
insert into #IDs (ID)
select 1 union all
select 1 union all
select 2 union all
select 2 union all
select 3
go
select * from sysobjects where id in (select ID from #IDs union select 1)
go

答案 2 :(得分:2)

使用以下查询。这个地段最有效率。

select name from products P
where P.id = 1 or 
exists 
(select TOP 1 '1' from orders O
where O.product_id = P.id)

答案 3 :(得分:1)

select p1.name from products as p1
    inner join orders as o on o.product_id = p1.id
union
select p2.name from products as p2 where p2.id = 1;

答案 4 :(得分:0)

减少累计CPU总时间:9秒900毫秒 结束工作= job_1442292787903_0035 MapReduce工作推出: 鹿