动态SQL优化分页

动态SQL优化分页,sql,sql-server,performance,sql-server-2008-r2,paging,Sql,Sql Server,Performance,Sql Server 2008 R2,Paging,几年来,我一直在创建动态sql分页,方法是将其包装到一个带有行号的CTE中。该方法已在中多次提到,并提供了良好的性能 然而,由于sql server 2012引入了性能更好的偏移量和获取,我决定看看是否可以优化sql 2008 R2分页语句以匹配sql server 2012的性能 这描述了一个非常有趣的替代offset命令的方法: 然而,上面提到的这个替代方案是使用索引表,而我的需求是动态sql。我尝试了几种方法为动态sql语句创建类似的实现,但没有成功。。。性能比常规CTE/行数方法慢10倍

几年来,我一直在创建动态sql分页,方法是将其包装到一个带有行号的CTE中。该方法已在中多次提到,并提供了良好的性能

然而,由于sql server 2012引入了性能更好的偏移量和获取,我决定看看是否可以优化sql 2008 R2分页语句以匹配sql server 2012的性能

这描述了一个非常有趣的替代offset命令的方法:

然而,上面提到的这个替代方案是使用索引表,而我的需求是动态sql。我尝试了几种方法为动态sql语句创建类似的实现,但没有成功。。。性能比常规CTE/行数方法慢10倍

以下是迄今为止我能创建的最佳实现:

WITH T1 AS ( << Your Dynamic SQL here >>  )
SELECT TOP 100 T2.RowN , T2.*
FROM (
  SELECT ROW_NUMBER() OVER ( ORDER BY WhateverField ) AS RowN, WhateverID, WhateverField
  FROM T1
) AS T2
INNER LOOP JOIN T1 ON T2.WhateverID  = T1.WhateverID 
WHERE T2.RowN BETWEEN 10000 AND 10999
ORDER BY WhateverField;
理想情况下,我更喜欢只涉及动态sql的解决方案。。。我知道有时storedproc可能会提供其他选择,但如果我必须在管理SP和迁移到SQL 2012之间做出选择,我会选择第二种选择

WITH T1 AS ( << Your Dynamic SQL here >>  )
SELECT TOP 100 T2.RowN , T2.*
FROM (
  SELECT ROW_NUMBER() OVER ( ORDER BY WhateverField ) AS RowN, WhateverID, WhateverField
  FROM T1
) AS T2
INNER LOOP JOIN T1 ON T2.WhateverID  = T1.WhateverID 
WHERE T2.RowN BETWEEN 10000 AND 10999
ORDER BY WhateverField;