gpt4 book ai didi

tsql - ROW_NUMBER() OVER PARTITION 优化

转载 作者:行者123 更新时间:2023-12-01 10:23:36 27 4
gpt4 key购买 nike

我有以下查询:

SELECT *
FROM
(
SELECT *,
ROW_NUMBER() OVER(PARTITION BY Code ORDER BY Price ASC) as RowNum
from Offers) r
where RowNum = 1

Offers 表包含大约 1000 万条记录。但是那里只有大约 4000 个不同的代码。所以我需要为每个代码获取价格最低的行,结果中只有 4000 行。

我在 INCLUDE 语句中有一个关于(代码、价格)列的索引以及所有其他列。

查询运行 2 分钟。如果我查看执行计划,我会看到具有 10M 实际行的索引扫描。所以,我猜它会扫描整个索引以获得所需的值。

为什么 MSSQL 要做全索引扫描?是因为子查询需要整个数据吗?如何避免这种扫描?是否有仅处理分区中第一行的 SQL 提示?

还有其他方法可以优化此类查询吗?

最佳答案

在尝试了多种不同的解决方案后,我找到了使用 CROSS APPLY 语句的最快查询:

SELECT C.* 
FROM (SELECT DISTINCT Code from Offers) A
CROSS APPLY (SELECT TOP 1 *
FROM Offers B
WHERE A.Code = B.Code
ORDER by Price) C

运行大约需要 1 秒。

关于tsql - ROW_NUMBER() OVER PARTITION 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48793629/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com