ページングと順序付けを行いたいテーブルがあり、次のようなクエリを取得して作業を行うことができました (実際のクエリは、結合などにはるかに関与しています)。
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
ORDER BY Date desc
問題は、CASE ステートメントを使用すると、通常の句と比較してパフォーマンスが大幅に低下することです (少なくとも 10 倍の速度低下) 。クエリ プランを見ると、@sortCol 修飾子と一致しない場合でも、すべての列がまだ並べ替えられているように見えます。
これを「ネイティブ」に近い速度で実行する方法はありますか? 動的 SQL はこの問題の最良の候補ですか? ありがとう!