SQL性能问题:选择N行,直到找到200个不同的客户

时间:2018-09-26 11:37:40

标签: sql-server

我有带有这些列的表ORDERS:

id ||客户|产品

我想计算ORDERS表中的 N 行数。 N 的大小应足以容纳表格底部的200个不同的客户。我已经使用max(ID)编写了以下查询,但是运行此查询需要太多时间。我认为这不是最优的,因为我有成千上万的行,并且每次必须在整个表上使用group by来查找ID时:

select count(*) as N from ORDERS where id > (
 select top 1 id from 
      (select distinct top 200 CUSTOMER,max(id) as maxid from ORDERS group by CUSTOMER order by maxid desc) x
 order by id asc
)

还有另一种方法可以更好地处理此问题吗?

1 个答案:

答案 0 :(得分:0)

这是一个很大的猜测,但这至少会返回结果:

WITH Customers AS(
    SELECT TOP 200
           CUSTOMER,
           MAX(id) AS MaxID
    FROM ORDERS
    GROUP BY CUSTOMER
    ORDER BY MaxID DESC)
SELECT COUNT(*)
FROM ORDERS O
WHERE EXISTS (SELECT 1
              FROM Customers C
              WHERE C.MaxID = O.id);

如果它返回正确结果,但仍然运行缓慢,请发布表的DDL,并包括索引的DDL。我还建议使用Paste the Plan

发布查询计划