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必须进行某种行的排序才能枚举它们。索引已提供该排序。尝试删除
*
并指定列名(必需)