gpt4 book ai didi

tsql - 使用日期索引优化 ROW_NUMBER()

转载 作者:行者123 更新时间:2023-12-04 00:35:56 29 4
gpt4 key购买 nike

我有这个简单的查询,希望它是不言自明的。

SELECT ROW_NUMBER() OVER (PARTITION BY Price_Id ORDER BY date DESC) r, *  FROM Samples

我的问题是我有超过 80000 条记录,执行该查询大约需要 3 秒。我的问题是我是否可以做些什么来提高性能?

我在想一个索引,想出了类似的东西

CREATE INDEX IX_Samples_Date ON Samples (Date DESC)

但我必须承认我以前从未使用过索引,而且我上面的尝试没有奏效。

最佳答案

您需要一个 POC 索引。查看 SQL Server 2012: How to Write T-SQL Window Functions, Part 3索引指南部分.

因此,在您的情况下,您需要将 Price_Id 作为索引中的第一列。

create index IX_Samples_POC on dbo.Samples(Price_Id, date desc);

但即使有了索引,也不能保证 SQL Server 会使用它。您正在查询所有行和所有列,因此无论如何您都可能会进行聚簇索引扫描或表扫描,因为您可能没有所有索引中包含的其他列(自动包含聚簇键)。

如果您在派生表中使用 row_number 并将结果连接回您获取其余部分的表,则根据您的表结构,您可能会使用索引获得更快的计划列。

类似这样的假设您有一个主键 ID,它也是聚集键。

select S.*,
T.r
from Samples as S
inner join (
select ID,
row_number() over(partition by Price_Id
order by date desc) as r
from dbo.Samples
) as T
on S.ID = T.ID;

另一种选择是在索引中包含您需要的列。如果您确实需要所有列,则可能不是一个好主意。

create index IX_Samples_POC on dbo.Samples(Price_Id, date desc) 
include(Col1, Col2);

与完全不使用索引相比,覆盖索引的主要区别在于 SQL Server 必须对行进行排序才能枚举它们。索引已经提供了那种排序。

关于tsql - 使用日期索引优化 ROW_NUMBER(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24608375/

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