我有这个简单的查询,希望可以很不言自明。
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的索引指南部分:如何编写T-SQL窗口函数,第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必须执行某种类型的行才能枚举它们。索引已经提供了这种排序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句