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