SQL Server:为什么这个查询这么慢?

时间:2015-03-18 13:49:22

标签: sql sql-server optimization

我有一个SQL语句来提取记录。某些员工可以访问某些记录。人员安全性全部在一个单独的进程中完成,并添加到搜索SQL子句的where子句中。

简化示例:

select 
    o.id, o.staff.id 
from 
    Orders o
where 
    staffid = 100 
    or orderid in (select orderid from schedule where staffid = 5)

VS

select 
    o.id, o.staff.id 
from 
    Orders o
where 
    staffid = 100 or orderid in (1, 2, 3, 4, 5, 6, 7, 8)

嵌套的sql select orderid from schedule where teamid = 5在1秒内运行。如果将结果粘贴到其位置,则主查询将在2秒内运行。如果运行顶级SQL,则需要一分钟才能运行。出于某种原因,如何告诉SQL首先运行嵌套选择而不将其分解为临时表?

您提供的所有建议的更多信息:

我的SQL也有OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY。删除后查询很快。它可以在1秒内返回1800条记录,但要求10条记录需要40秒。

如果我将订单更改为staffid,它也会快速运行。 order byfetch next的组合导致SQL运行不同的执行计划。由于Where子句位于软件的一个单独部分,我无法更改order by,因此它会破坏性能。

3 个答案:

答案 0 :(得分:0)

with    scheduleOrders as 
        (select orderid from schedule where staffid = 5)
select  o.id, o.staff.id
from    Orders o
where   o.staffId = 100
union
select  o.id, o.staff.id
from    Orders o join scheduleOrders so on o.orderId = so.orderId

答案 1 :(得分:0)

SELECT o.id, o.staffId 
FROM Orders o
WHERE o.staffid = 100 
OR EXISTS ( SELECT 'a'
            FROM schedule s
            WHERE s.staffId = 5
            AND s.orderId = o.orderId
           )

编辑... 加入版本更快?

SELECT DISTINCT o.*
FROM Orders o JOIN schedule s ON s.orderId = o.orderId
WHERE o.staffid = 100 
OR s.staffId = 5

你的桌子有多少行?

答案 2 :(得分:0)

尝试使用Exists

Select o.id, o.staff.id 
from Orders o
Where staffid = 100 or EXISTS (select 1 from schedule s where staffid = 5 and s.orderid=o.orderid)

使用In它会尝试检索所有内部查询结果,而使用Exists时,它只会检查行是否存在