У меня есть таблица, в которой я хотел бы выполнить разбиение по страницам и упорядочить, и я смог получить запрос, аналогичный следующему, для выполнения работы (реальный запрос гораздо больше связан с соединениями и т. Д.).
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 лучшим кандидатом для решения этой проблемы? Спасибо!