账单必须按日期和编号连续。我正在执行此查询以检查我是否没有乱序账单,但性能很糟糕(我有数百万张账单,所以检查一个月需要几分钟):
SELECT NUMBER, DATE
FROM BILLS
WHERE DATE BETWEEN @FROM AND @TO AND
EXISTS (SELECT *
FROM BILLS OUT_OF_ORDER
WHERE OUT_OF_ORDER.NUMBER < BILLS.NUMBER
AND OUT_OF_ORDER.DATE > BILLS.DATE)
我已经有了按 NUMBER、DATE 和 DATE + NUMBER 的索引,但复合索引不能真正用于该查询。
我也试过删除子查询,没有明显的区别。
SELECT DISTINCT BILLS.NUMBER, BILLS.DATE
FROM BILLS
INNER JOIN BILLS OUT_OF_ORDER ON OUT_OF_ORDER.NUMBER < BILLS.NUMBER AND
OUT_OF_ORDER.DATE > BILLS.DATE
WHERE DATE BETWEEN @FROM AND @TO
您知道如何改进这种查询(同时在两个不同字段上使用 >< 操作数)吗?
我已经添加了执行计划。问题显然出在检查 OUT_OF_ORDER 账单上,它只使用普通的 DATE 索引。据我所知,您无法定义允许您在两个不同字段上使用 >< 操作数进行搜索的复合索引。
最佳答案
@Damien_The_Unbeliever 让我记得我没有差距(或者我不应该有差距,这在第二次查询中得到验证)。所以我可以只检查之前的一张账单,而不是之前的所有账单。
查之前的账单用的是主键,因为我直接找账单NUMBER - 1
现在这个查询只需要几秒钟而不是几分钟。
SELECT BILLS.NUMBER, BILLS.DATE
FROM BILLS
INNER JOIN BILLS OUT_OF_ORDER ON OUT_OF_ORDER.NUMBER = BILLS.NUMBER - 1 AND
OUT_OF_ORDER.DATE > BILLS.DATE
WHERE DATE BETWEEN @FROM AND @TO
谢谢大家
关于sql - 我无法优化无序账单的支票,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45411825/