выберите топ-10… и выберите топ-30, следуя разным план выполнения

Во время оптимизации запросов я обнаружил странное поведение сервера sql (Sql Server 2008 R2 Enterprise). Я создал несколько индексов для таблиц, а также несколько индексированных представлений. У меня есть два запроса, например:

select top 10 N0."Oid",N1."ObjectType",N1."OptimisticLockField" from ((("dbo"."Issue" N0
 inner join "dbo"."Article" N1 on (N0."Oid" = N1."Oid"))
 inner join "dbo"."ProductLink" N2 on (N1."ProductLink" = N2."Oid"))
 inner join "dbo"."Technology" N3 on (N2."Technology" = N3."Oid"))
where (N1."GCRecord" is null and (N0."IsPrivate" = 0) and ((N0."HasMarkedAnswers" = 0) or N0."HasMarkedAnswers" is null) and (N3."Name" = N'Discussions'))
order by N1."ModifiedOn" desc

и

select top 30 N0."Oid",N1."ObjectType",N1."OptimisticLockField" from ((("dbo"."Issue" N0
 inner join "dbo"."Article" N1 on (N0."Oid" = N1."Oid"))
 inner join "dbo"."ProductLink" N2 on (N1."ProductLink" = N2."Oid"))
 inner join "dbo"."Technology" N3 on (N2."Technology" = N3."Oid"))
where (N1."GCRecord" is null and (N0."IsPrivate" = 0) and ((N0."HasMarkedAnswers" = 0) or N0."HasMarkedAnswers" is null) and (N3."Name" = N'Discussions'))
order by N1."ModifiedOn" desc

оба запроса одинаковы, за исключением того, что первый начинается с select top 10 , а второй - с select top 30 . Оба запроса возвращают один и тот же набор результатов - 6 строк. Но второй запрос в 5 раз быстрее первого! Я посмотрел на фактические планы выполнения для обоих запросов, и, конечно же, они различаются. Второй запрос использует индексированное представление и отлично работает, а первый запрос отказывается его использовать, вместо этого используя индексы в таблицах. Повторюсь - оба запроса одинаковые, к одной и той же таблице, на одном сервере, отличаются только номером в «верхней» части. Я пытался заставить оптимизатор использовать индексированное представление в первом запросе, обновляя статистику, уничтожая используемые им индексы и так далее. Независимо от того, как я пытаюсь выполнить фактическое выполнение, не используйте индексированное представление для первого запроса и всегда используйте его для второго.

Меня действительно интересуют причины, вызывающие такое поведение. Есть предложения?

Обновление Я не уверен, что это может помочь без описания соответствующих индексов и представления, но это фактические диаграммы плана выполнения: для избранных 19 лучших: for select top 19:

для выборки из первых 18: for select top 18:

еще один сбивающий с толку факт заключается в том, что для выборки из первых 19 запросов иногда используется индексированное представление, иногда нет

10
задан objectbox 22 November 2011 в 12:33
поделиться