我有一个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 by
和fetch next
的组合导致SQL运行不同的执行计划。由于Where
子句位于软件的一个单独部分,我无法更改order by
,因此它会破坏性能。
答案 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
时,它只会检查行是否存在