自 2005 版以来,我习惯于从 MS SQL Server 脚本中的 ROW_NUMBER 函数中获益。但我注意到使用此函数查询大表存在很大的性能劣势。
想象一下有四列的表(来自外部数据库的真实表有更多列,但我只使用那些以避免示例的复杂性):
DECLARE TABLE StockItems (
Id int PRIMARY KEY IDENTITY(1,1),
StockNumber nvarchar(max),
Name nvarchar(max),
[Description] nvarchar(max))
我已经编写了使用以下参数查询该表的过程,该表由 200 000+ 行填充:
- @SortExpression - 我要排序的列的名称
- @SortDirection - 位信息(0=升序,1=降序)
- @startRowIndex - 我要检索行的从零开始的索引
- @maximumRows - 要检索的行数
询问:
SELECT sortedItems.Id
,si.StockNumber
,si.Name
,si.Description
FROM (SELECT s.Id
,CASE WHEN @SortDirection=1 THEN
CASE
WHEN CHARINDEX('Name',@SortExpression)=1 THEN
ROW_NUMBER() OVER (ORDER by s.Name DESC)
WHEN CHARINDEX('StockNumber',@SortExpression)=1 THEN
ROW_NUMBER() OVER (ORDER by s.StockNumber DESC)
ELSE ROW_NUMBER() OVER (ORDER by s.StockNumber DESC)
END
ELSE
CASE
WHEN CHARINDEX('Name',@SortExpression)=1 THEN
ROW_NUMBER() OVER (ORDER by s.Name ASC)
WHEN CHARINDEX('StockNumber',@SortExpression)=1 THEN
ROW_NUMBER() OVER (ORDER by s.StockNumber ASC)
ELSE ROW_NUMBER() OVER (ORDER by s.StockNumber ASC)
END
END AS RowNo
FROM stockItems s
) as sortedItems
INNER JOIN StockItems si ON sortedItems.Id=si.Id
ORDER BY sortedItems.RowNo
在行数快速增长的情况下,ROW_NUMBER 变得无效,因为必须对所有行进行排序。
请您能帮我避免这种性能劣势并加快查询速度吗?