帐单必须按日期和数字连续。我正在执行此查询以检查是否没有乱序的账单,但是性能太差了(我有数百万个账单,所以一个月要花几分钟的时间):

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索引。据我所知,您无法定义允许您在两个不同字段上使用>
sql - 我无法优化无序帐单的支票-LMLPHP

最佳答案

@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/

10-09 03:49