ROW_NUMBER 表现

ROW_NUMBER Performance

我们有一个用于在联接表中进行搜索的存储过程。我们有生产和开发 Sql 服务器。存储过程在生产服务器上运行良好,但在 Dev SQL 服务器上,执行时间超过 2 分钟。我认为行号是我们在开发服务器上遇到的性能问题的根本原因。

CREATE proc  sp_fullEmp 
@take int ,
@skip int 
as 

with main as (
select 
 dt.FirstName +' '+ dt.LastName [FullName],
 dt.[Location],
emp.FirstName + ' '+ emp.LastName [Manager],
dt.[ApplicationDate] 

from  ExtractedData dt 
left join ProcessTable tb
        left join Employee emp on emp.ID = tb.EmployeeID
 on td.ExtID = dt.ID),

searched as (select *, ROW_NUMBER() OVER (ORDER By FullName ASC) RN from main)

select * from searched where RN BETWEEN @skip AND @Take

相同查询的样本在其他表上 运行,在具有更大数据集的开发和生产服务器上没有任何性能问题。

此问题的根本原因是什么?

执行Dev Plan

执行Prod Plan

您的问题可能是参数嗅探。 SQL 不知道@Skip 和@Take 会是什么,这可能会影响计划。

值得比较 Prod 和 Dev 中的数据 - Dev 数据通常会更多 "skewy" 特别是如果它是手动插入的。 查看 Avg、min 和 Max

尝试在存储过程上使用 RECOMPILE,看看是否有帮助。 或者 - DBCC FREEPROCCACHE 将清空 proc 缓存并创建一个新计划。

我刚刚意识到你没有对你的 Row_Number() 查询进行分区 - 这意味着实际上你只是 运行 全名的前 N ​​个查询顺序 - 看起来很奇怪,因为它会随机给出基于 Extracts 和员工数量的结果