我有一个表我想做分页和排序,并且能够得到类似于下面的查询来完成这项工作(真正的查询涉及更多与连接等)。Row_Number()CTE使用ORDER BY CASE时的性能
WITH NumberedPosts (PostID, RowNum) AS
(
SELECT PostID, ROW_NUMBER() OVER (ORDER BY
CASE WHEN @sortCol = 'User' THEN User END DESC,
CASE WHEN @sortCol = 'Date' THEN Date END DESC,
CASE WHEN @sortCol = 'Email' THEN Email END DESC) as RowNum
FROM Post
)
INSERT INTO #temp(PostID, User, Date, Email)
SELECT PostID, User, Date, Email
FROM Post
WHERE NumberedPosts.RowNum BETWEEN @start and (@start + @pageSize)
AND NumberedPosts.PostID = Post.PostID
麻烦的是使用CASE语句(至少10倍的减速)时,与正常ORDER BY Date desc
子句时性能大大降低。查看查询计划,即使它们不匹配@sortCol限定符,也会显示所有列仍在排序。
有没有办法让它以接近'原生'的速度执行?动态SQL是这个问题的最佳人选吗?谢谢!
你有一个三级排序(3 DESC和2个逗号)。为什么不仅仅使用单个案例来处理多个案件? – 2010-07-13 02:52:58