Нет плана запроса для процедуры в SQL Server 2005

У нас есть БД SQL Server с 150-200 хранимыми процедурами, каждая из которых создает план запроса для просмотра в sys.dm_exec_query_plan, кроме одного. Согласно http://msdn.microsoft.com/en-us/library/ms189747.aspx:

При следующих условиях выходные данные Showplan не возвращаются в столбце query_plan возвращаемой таблицы для sys.dm_exec_query_plan:

  • Если план запроса, указанный с помощью plan_handle, был исключен из кэша планов, столбец query_plan возвращаемой таблицы будет пустым. Например, это условие может возникнуть, если существует задержка между захватом дескриптора плана и его использованием с sys.dm_exec_query_plan.
  • Некоторые операторы Transact-SQL не кэшируются, например операторы массовых операций или операторы, содержащие строковые литералы размером более 8 КБ. XML Showplans для таких инструкций нельзя получить с помощью sys.dm_exec_query_plan, если пакет не выполняется в данный момент, потому что они не существуют в кэше.
  • Если пакет Transact-SQL или хранимая процедура содержит вызов пользовательской функции или вызов динамического SQL, например, с использованием EXEC (строка), скомпилированный XML Showplan для пользовательской функции не включается в возвращаемую таблицу. с помощью sys.dm_exec_query_plan для пакета или хранимой процедуры. Вместо этого вы должны сделать отдельный вызов sys.dm_exec_query_plan для дескриптора плана, соответствующего пользовательской функции.

И позже..

Из-за ограничения количества вложенных уровней, разрешенных для типа данных xml, sys.dm_exec_query_plan не может возвращать планы запросов, которые соответствуют или превышают 128 уровней вложенных элементов.

Я уверен, что ни один из них не применим к этой процедуре. Результат никогда не имеет плана запроса, независимо от времени, поэтому 1 не применяется. Нет длинных строковых литералов или массовых операций, поэтому 2 не применяется. Здесь нет определяемых пользователем функций или динамического SQL, поэтому 3 не применяется. И там мало вложенности, поэтому последнее не применяется. На самом деле, это очень простой процесс, который я включаю полностью (с некоторыми измененными именами таблиц для защиты невиновных). Обратите внимание, что махинации с перехватом параметров датируются более поздней датой возникновения проблемы. Это все равно происходит, даже если я использую параметры непосредственно в запросе. Любые идеи о том, почему у меня нет плана запроса для просмотра для этого процесса?

ALTER PROCEDURE [dbo].[spGetThreadComments] 
    @threadId int, 
    @stateCutoff int = 80, 
    @origin varchar(255) = null, 
    @includeComments bit = 1, 
    @count int = 100000
AS

if (@count is null)
begin
    select @count = 100000
end

-- copy parameters to local variables to avoid parameter sniffing
declare @threadIdL int, @stateCutoffL int, @originL varchar(255), @includeCommentsL bit, @countL int
select @threadIdL = @threadId, @stateCutoffL = @stateCutoff, @originL = @origin, @includeCommentsL = @includeComments, @countL = @count

set rowcount @countL

if (@originL = 'Foo')
begin
    select * from FooComments (nolock) where threadId = @threadId and statusCode <= @stateCutoff 
    order by isnull(parentCommentId, commentId), dateCreated
end
else
begin       
    if (@includeCommentsL = 1)
    begin
        select * from Comments (nolock) 
            where threadId = @threadIdL and statusCode <= @stateCutoffL
            order by isnull(parentCommentId, commentId), dateCreated
    end
    else
    begin
        select userId, commentId from Comments (nolock) 
            where threadId = @threadIdL and statusCode <= @stateCutoffL
            order by isnull(parentCommentId, commentId), dateCreated
    end
end

person sidereal    schedule 02.03.2010    source источник
comment
Можете ли вы получить план запроса для каждого из 3 запросов? Являются ли эти таблицы представлениями, которые могут вызывать функции?   -  person Amy B    schedule 02.03.2010
comment
Эй, Дэвид. Я могу подтвердить через dm_exec_query_stats, что plan_handle, который не дает мне план запроса, на самом деле выполняет работу, поэтому я не думаю, что дело в том, что я просто смотрю на какой-то зонтичный план, а не на операционный план.   -  person sidereal    schedule 02.03.2010
comment
Упс. Хороший звонок, Дэвид. Хотя обе таблицы теоретически являются просто таблицами, одна из них на самом деле несуществующая таблица. FooComment был удален где-то по пути. Это не вызвало проблем во время выполнения, потому что эта ветвь, по-видимому, никогда не используется, но похоже, что отсутствие таблицы мешало правильно сгенерировать и/или отобразить план запроса. Если вы хотите написать это как ответ, я отдам вам должное.   -  person sidereal    schedule 02.03.2010


Ответы (2)


Хм, возможно, столы на самом деле не столы. Это могут быть просмотры или что-то еще.

person Amy B    schedule 02.03.2010
comment
Наш магазин столкнулся с множеством несуществующих объектов при копировании структур базы данных из одной БД в другую. В итоге мы получили инструмент для обнаружения отсутствующих зависимостей. - person Amy B; 02.03.2010
comment
Странно, что ничто в SQL не будет жаловаться на это, пока вы не выполните эту ветвь кода. Кажется, что-то стоит предупредить где-то. - person sidereal; 02.03.2010

попробуйте поставить dbo. или любую другую схему перед всеми именами таблиц, а затем проверьте еще раз.

см. эту статью:

http://www.sommarskog.se/dyn-search-2005.html

цитата из статьи:

Как видите, я ссылаюсь на все таблицы в двухчастной нотации. То есть, я также указываю схему (которая на языке SQL 7/2000 обычно называется владельцем). Если бы я исключил схему, каждый пользователь получил бы свою собственную частную версию плана запроса.

person KM.    schedule 02.03.2010
comment
Привет КМ. Это похоже на хорошую практику (и на самом деле у нас есть проблемы, когда трассировка sql показывает плохо выполняющиеся запросы, которые выполняются нормально, когда я их запускаю... возможно, случай, когда каждое соединение получает другой план запроса). Но в данном случае мы исключили полные имена из всех наших процессов, и только у этого отсутствует план запроса. - person sidereal; 02.03.2010