帐单必须按日期和数字连续。我正在执行此查询以检查是否没有乱序的账单,但是性能太差了(我有数百万个账单,所以一个月要花几分钟的时间):
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让我记得我没有差距(或者我不应该有差距,这在第二次查询中得到了验证)。因此,我只可以查看之前的一个帐单,而不是所有以前的帐单。
检查前一个帐单使用主键,因为我直接查找帐单编号-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/