在where
子句中,我正在使用
SELECT name
FROM products
WHERE id IN (
SELECT product_id
FROM orders
UNION
SELECT 1);
需要时间来执行union
。
请提供一些其他替代方法来提高我的查询效果
答案 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工作推出: 鹿