我有一张桌子,里面有我们所有的订单。订单链接到一个人。每个人都隶属于一家公司。现在我需要一个在某个日期之前从未订购过的所有公司的列表。查询工作正常,但速度很慢。
这是我的 T-SQL 查询:
SELECT
DISTINCT p1.company_id
FROM
order o
JOIN person p1 ON (o.person_id = p1.id AND p1.company_id IS NOT NULL)
WHERE
o.orderDate > '2017-01-01'
AND
o.orderDate < '2017-09-01'
AND NOT EXISTS (SELECT
p2.company_id
FROM
order o2
JOIN person p2 ON (o2.person_id = p2.id AND p2.company_id = p1.company_id)
WHERE
o2.orderDate < '2017-01-01')
我已经将它从 NOT IN 更改为 NOT EXISTS。因为这是这里大多数人推荐的。没有太大帮助。更好的索引稍微改善了这种情况,但查询仍然很慢。我认为这是因为对于每个订单都必须执行子查询。
这是执行计划:
https
://www.brentozar.com/pastetheplan/?id=SyAlAU3db
为简单起见,我在上面的示例中删除了一些 WHERE 子句)
该查询在 Azure SQL(以及用于开发的 SQL Server Express 12)上运行
有人对如何解决这个问题有更好的想法吗?