sql - 我无法优化无序账单的支票

标签 sql sql-server

账单必须按日期和编号连续。我正在执行此查询以检查我是否没有乱序账单,但性能很糟糕(我有数百万张账单,所以检查一个月需要几分钟):

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 索引。据我所知,您无法定义允许您在两个不同字段上使用 >< 操作数进行搜索的复合索引。

enter image description here

最佳答案

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

相关文章:

c# - 事件日志实用性

sql - 在 SQL GROUP BY 查询中,非聚合列使用什么值?

java - 如何使用 jTDS 将表值参数传递给存储过程?

sql-server - 数据库批准拒绝工作流程

mysql - SQL准备失败: (1136) Column count doesn't match value count at row 1

mysql - 选择同名的最后一行

mysql - 按字段排序(列名,(选择))

sql - 将游戏世界矩阵位置保存到数据库

sql-server - 如何在子查询中返回多个结果?

php - $wpdb 特定多个数据库表条目的 SQL 语法