Выполняю операции фильтрации, сортировки и подкачки в хранимых процедурах. Порядок этих операций должен быть в порядке выполнения search-> order-> paging. Я не знаю, выполнила ли моя хранимая процедура порядок сначала по операциям или поисковым операциям. Так что мои вопросы:Порядок выполнения предложения SQL WITH
1) Каков порядок выполнения этой хранимой процедуры?
2) Если порядок выполнения выполняется перед оператором поиска, как я могу выполнить операции поиска во-первых?
CREATE PROCEDURE [dbo].[Grid_Feedbacks_Select_All]
@search nvarchar(100),
@orderby nvarchar(50),
@orderbydirection nvarchar(4),
@skipLength int,
@length int
AS
BEGIN
--THIS PART IS ORDER BY PART
WITH CTE_Results
AS (
SELECT ROW_NUMBER() OVER (ORDER BY
CASE WHEN (@orderby = 'Subject' AND @orderbydirection='asc')
THEN Subject
END ASC,
CASE WHEN (@orderby = 'Subject' AND @orderbydirection='desc')
THEN Subject
END DESC,
CASE WHEN (@orderby = 'Text' AND @orderbydirection='asc')
THEN Text
END ASC,
CASE WHEN @orderby = 'Text' AND @orderbydirection='desc'
THEN Text
END DESC
) AS ROWNUM,
Count(*) over() AS TotalCount,
(
--THIS PART IS SEARCH PART
SELECT COUNT(*) FROM Feedbacks f(nolock)) AS TotalRecordsCount,
f.Id,
f.Response,
f.Subject,
f.Text,
u.Username,
c.FirmName,
c.Name,
c.Surname
FROM Feedbacks f(nolock), Users u, Customers c
WHERE
f.UserId = u.Id
AND u.CustomerId = c.Id
OR(f.Text LIKE '%' + @search + '%')
OR (u.Username LIKE '%' + @search + '%')
OR (c.Name LIKE '%' + @search + '%')
)
--THIS PART IS PAGING PART
SELECT * FROM CTE_Results AS CPC
WHERE CPC.ROWNUM > @skipLength AND
CPC.ROWNUM < @skipLength + @length + 1
ORDER BY CPC.ROWNUM ASC
END
Установите флажок «Включить фактический план выполнения» в SSMS, запустите запрос и проверьте план выполнения самостоятельно. Или, если вы не можете что-то сделать, отправьте его нам для проверки. Это просто догадывается, не глядя на него. –
И что касается догадок - должно быть, что поиск (WHERE) выполняется перед сортировкой (ORDER BY) –
Действительно, вы обеспокоены тем, что сортировка будет выполнена до начала поиска. Как бы вы ожидали, что он будет сортировать результаты, которых у него нет. С несколькими UNIONS и несколькими JOINS план запроса выполняется по заказу. Я даже настраиваю запросы, чтобы заставить его быстрее ударить по более быстрым таблицам. – Paparazzi