2013-06-24 2 views
1

Выполняю операции фильтрации, сортировки и подкачки в хранимых процедурах. Порядок этих операций должен быть в порядке выполнения 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 
+0

Установите флажок «Включить фактический план выполнения» в SSMS, запустите запрос и проверьте план выполнения самостоятельно. Или, если вы не можете что-то сделать, отправьте его нам для проверки. Это просто догадывается, не глядя на него. –

+1

И что касается догадок - должно быть, что поиск (WHERE) выполняется перед сортировкой (ORDER BY) –

+0

Действительно, вы обеспокоены тем, что сортировка будет выполнена до начала поиска. Как бы вы ожидали, что он будет сортировать результаты, которых у него нет. С несколькими UNIONS и несколькими JOINS план запроса выполняется по заказу. Я даже настраиваю запросы, чтобы заставить его быстрее ударить по более быстрым таблицам. – Paparazzi

ответ

0

Ответ «Не знаю, не волнует». Операторы SQL являются описательными. Они описывают производимую продукцию. SQL является не языком процедуры, поэтому механизм SQL может свободно выбирать любой порядок выполнения и метод оптимизации, который ему нравится.

Порядок исполнения не имеет никакого значения для результатов. План запроса предназначен для возврата всех результатов, а не только определенного подмножества.

Другими словами, вы беспокоитесь о неправильном. Просто убедитесь, что запрос возвращает нужные вам данные и наилучшим образом написан для оптимизатора, чтобы воспользоваться его способностями.

EDIT:

Чтобы было ясно, SQL Server documentation четко говорится:

Когда процессы SQL Server объединяет двигатель запрос выбирает наиболее эффективный метод (из нескольких возможных) обработки присоединиться. Физическое выполнение различных объединений может использовать множество различных оптимизаций и поэтому не может быть надежно предсказано.

Если у вас есть большое количество объединений в запросе (больше, чем в OP), оптимизатор может не учитывать все возможности. В этом случае порядок соединения может влиять на план запроса. Гораздо важнее, однако, статистика, которую оптимизатор использует для выбора порядка и типов операций объединения. Microsoft приложила много усилий для выбора лучших планов исполнения.

Несмотря на это, в некоторых случаях оптимизатор может быть неправильным. Вы можете влиять на результаты, используя явные подсказки для соединений. Я не знаю никаких подсказок, которые будут применяться к вопросу OP. И, я не думаю, что это даже стоит рассмотреть, если нет текущих проблем с производительностью.

+2

Заказ JOINS и порядок UNIONS могут влиять на план запросов. Я часто использую порядок в TSQL для настройки плана выполнения. – Paparazzi

+1

Допустим, у меня есть 100000 записей обратной связи, а 10 записей - текст поиска.Заказ 100000 записей, а затем поиск текста такой же, как и 10 записей, а затем сортировка 10 записей? Можете ли вы объяснить, как это сделать? – sotn

+0

@ Gordon И если у механизма БД нет оптимизаций для такого рода запросов, тогда я должен изменить запрос, чтобы он сначала взял записи, а затем отсортировал их. – sotn