SQL 查询优化,查看前 x 条记录

标签 sql sql-server

这个查询有效,但是有更好的方法来编写这个查询吗?目前的速度似乎很慢。该场景非常简单。

我有两个表:“客户”和“付款”。客户表包含您所期望的客户信息。付款表跟踪客户每月支付的款项。它有一些我们需要查看的字段 - DueDate、PaymentDate 和 CustomerID。

我想要的查询是我想要所有在前 12 次付款中至少迟到 3 个月的客户。我的查询如下,但似乎相当慢。有没有比我下面写的更好的方法?

SELECT  CustomerID
FROM    Customers AS C
WHERE   EXISTS ( SELECT DueDate, CustomerID, PaymentDate
                 FROM   ( SELECT TOP 12 *
                          FROM      Payments as P
                          WHERE     P.CustomerID = C.CustomerID
                          ORDER BY PaymentDate
                        ) AS First12Payments
                 WHERE  DATEDIFF(MONTH, First12Payments.DueDate, First12Payments.PaymentDate) > 3 )

谢谢!

最佳答案

嗯,Joe Enos 和 Brandon 的评论中的建议很棒。但是,如果您无法添加该列,则对 SQL 语句进行 2 个小更改可能会使其速度更快一些。为了使其更好,您可能需要向 Payments 表中的 DueDate 和 PaymentDate 列添加索引。

SELECT  CustomerID
FROM    Customers AS C
WHERE   EXISTS ( SELECT 1 -- no need for a columns list since you only check for existance
    FROM (SELECT TOP 12 DueDate, PaymentDate -- no need for all the columns, only the ones you use
          FROM      Payments as P
          WHERE     P.CustomerID = C.CustomerID
          ORDER BY PaymentDate
         ) AS First12Payments
        WHERE  DATEDIFF(MONTH, First12Payments.DueDate, First12Payments.PaymentDate) > 3 

关于SQL 查询优化,查看前 x 条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29213384/

相关文章:

sql - 表列之间的一对多关系。分组和查找组合

sql - 启用 RLS(行级安全性)时 PostgreSQL 查询不使用 INDEX

Mysql删除重复的记录,除了一个有最大时间

sql-server - 长时间运行的查询是否会阻止对相关表的插入?

sql - 如何使用Golang直接从文件执行mssql脚本

sql - 任何 RDBMS 技术的通用语言

mysql - SQL - 提高性能

"if exists"的 SQL 语法

sql - 首次记录后 31 天内的群组记录

sql - 基于列组织表中的数据