Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL性能问题:选择N行,直到找到不同的200个客户_Sql Server - Fatal编程技术网

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

Sql server SQL性能问题:选择N行,直到找到不同的200个客户,sql-server,Sql Server,我有以下列的表格订单: id |客户|产品 我想计算ORDERS表中的N行数N应该足够大,从表的底部可以容纳200个不同的客户。我已经使用max(ID)编写了以下查询,但运行此查询所需的时间太长。我认为这并没有得到优化,因为我有数千行,每次我必须在整个表上使用groupby来查找一个ID: select count(*) as N from ORDERS where id > ( select top 1 id from (select distinct top 200 C

我有以下列的表格订单:

id |客户|产品

我想计算ORDERS表中的N行数N应该足够大,从表的底部可以容纳200个不同的客户。我已经使用max(ID)编写了以下查询,但运行此查询所需的时间太长。我认为这并没有得到优化,因为我有数千行,每次我必须在整个表上使用
groupby
来查找一个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
)

是否有其他方法可以更好地处理此问题?

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

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。我还建议通过使用

“比什么更好的性能”来发布查询计划,但运行此查询需要太多的秒数-你怎么知道它太多了?该查询甚至会返回什么?带有子查询的子句将有效地计算为
WHERE id>id
,这永远不会是真的。有些东西永远不会比它本身更伟大。(子查询中的
id
将是外部查询中
id
的值,因为子查询的该部分(从
x
返回数据)没有列
id
(列为
CUSTOMER
maxid
)。不带别名的列将始终默认为内部查询,除非该列在该查询中不存在,否则它将看起来“外部”)。我有大约150K行,此查询运行大约需要10秒。我不知道是什么原因导致了这种意外的延迟?@MitchWheat很不幸,你是对的,并且在很长一段时间后它总是返回0@larnu当查询甚至没有返回正确的结果时,你为什么要询问性能?首先修复查询以返回正确的数据,然后考虑性能。对错误查询进行性能调优是毫无意义的。我发现SQL语法错误。抱歉,我不熟悉此语法,也猜不出问题来自何处?在不知道错误的情况下,我如何回答,@AliSheikhpour?查看我的查询(我还没有测试它,因为没有示例数据),我看不到任何语法错误。我遇到了此错误,但我解决了它:
关键字“with”附近的语法不正确。如果此语句是公共表表达式、xmlnamespaces子句或更改跟踪上下文子句,则必须使用分号终止上一个语句。
我必须使用
GO
@AliSheikhpour将其与上一个查询分开。正确的做法是终止您的语句,就像错误告诉你的那样。。。