Tsql 使用日期索引优化行号()

Tsql 使用日期索引优化行号(),tsql,Tsql,我有一个简单的问题,希望它能很好地解释 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) 但是我必须承认我以前从未使用过索引,我

我有一个简单的问题,希望它能很好地解释

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索引。请查看的索引指南部分

因此,您需要将
Price\u Id
作为索引的第一列

create index IX_Samples_POC on dbo.Samples(Price_Id, date desc);
但即使有了索引,也不能保证SQLServer会使用它。您正在查询所有的行和列,因此很可能会得到聚集索引扫描或表扫描,因为您的索引中可能没有包含所有其他列(聚集键会自动包含)

根据表结构的外观,如果在派生表中使用
row\u 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必须进行某种行的排序才能枚举它们。索引已提供该排序。

尝试删除
*
并指定列名(必需)