我有一個表我想做分頁和排序,並且能夠得到類似於下面的查詢來完成這項工作(真正的查詢涉及更多與連接等)。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