Как определить, перекомпилируется ли хранимая процедура каждый раз? - PullRequest
0 голосов
/ 26 ноября 2008

У меня есть хранимая процедура SQL Server, в которой содержится следующий код T-SQL:

insert into #results ([ID], [Action], [Success], [StartTime], [EndTime], [Process])
select
    'ID' = aa.[ActionID],
    'Action' = cast(aa.[Action] as int),
    'Success' = aa.[Success],
    'StartTime' = aa.[StartTime],
    'EndTime' = aa.[EndTime],
    'Process' = cast(aa.[Process] as int)
from
    [ApplicationActions] aa with(nolock)
where
    0 = case
            when (@loggingLevel = 0) then 0
            when (@loggingLevel = 1 and aa.[LoggingLevel] = 1) then 0
        end
    and
    1 = case
            when (@applicationID is null) then 1
            when (@applicationID is not null and aa.[ApplicationID] = @applicationID) then 1
        end
    and
    2 = case
            when (@startDate is null) then 2
            when (@startDate is not null and aa.[StartTime] >= @startDate) then 2
        end
    and
    3 = case
            when (@endDate is null) then 3
            when (@endDate is not null and aa.[StartTime] <= @endDate) then 3
        end
    and
    4 = case
            when (@success is null) then 4
            when (@success is not null and aa.[Success] = @success) then 4
        end
    and
    5 = case
            when (@process is null) then 5
            when (@process is not null and aa.[Process] = @process) then 5
        end

Это то "динамическое" предложение WHERE, которое беспокоит меня. Пользователь не должен передавать каждый параметр этой хранимой процедуре. Только те, которые они заинтересованы использовать в качестве фильтра для вывода.

Как мне использовать SQL Server Studio или Profiler для проверки, перекомпилируется ли эта процедура хранилища каждый раз?

Ответы [ 3 ]

1 голос
/ 26 ноября 2008

В следующей статье объясняется, как узнать, перекомпилируется ли ваша хранимая процедура: http://it.toolbox.com/blogs/programming-life/sql-performance-abnormal-stored-procedure-recompiles-8105

Вот цитата из соответствующего раздела:

запустить SQL Profiler и запустить новый отслеживать, подключиться к нашему серверу и дать соответствующее имя трассы, выберите вкладка события и удалить уже существующие события на «Выбранное событие» список классов ". Теперь выберите Узел «Хранимые процедуры» в «Доступные классы событий» и добавить SPComplete, SPRecompile, SPStarting, SP: StmtStarting и SP: StmtCompleted. Теперь выберите вкладку «столбцы данных» и выберите примерно правильное количество события и столбцы данных, которые вам нужны. Добавить фильтры, чтобы уменьшить количество события, которые вы собираете.

Я бы отфильтровал по имени вашей хранимой процедуры.

1 голос
/ 28 ноября 2008

Ваша вставка в временную таблицу в вашем примере, которая заставляет SP каждый раз перекомпилироваться, потому что он не может быть предварительно скомпилирован.

Это одно из различий между использованием временных таблиц и табличных переменных - хорошую статью о различиях можно найти здесь

Соответствующий экстракт ...

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

1 голос
/ 26 ноября 2008

Просто случайно, вы можете упростить это:

    2 = case
                    when (@startDate is null) then 2
                    when (@startDate is not null and aa.[StartTime] >= @startDate) then 2
            end

к этому:

    (@startDate is null OR aa.[StartTime] >= @startDate)

Что касается перекомпиляции - объявлено ли WITH RECOMPILE?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...