добавить индекс SQL Server, но как перекомпилировать только затронутые хранимые процедуры? - PullRequest
4 голосов
/ 08 мая 2009

Мне нужно добавить индекс в таблицу, и я хочу перекомпилировать только / все хранимые процедуры, которые ссылаются на эту таблицу. Есть ли быстрый и простой способ?

EDIT:

из электронной документации по SQL Server 2005, перекомпиляция хранимых процедур:

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

Еще одна причина для принудительной перекомпиляции хранимой процедуры состоит в том, чтобы при необходимости противодействовать поведению компиляции хранимой процедуры «перехвата параметров». Когда SQL Server выполняет хранимые процедуры, любые значения параметров, используемые процедурой при ее компиляции, включаются как часть создания плана запроса. Если эти значения представляют собой типичные значения, с которыми процедура вызывается впоследствии, то хранимая процедура извлекает выгоду из плана запроса каждый раз, когда она компилируется и выполняется. Если нет, производительность может пострадать

Ответы [ 3 ]

3 голосов
/ 08 мая 2009

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

Смотрите это из документации MSDN: sp_recompile (Transact-SQL)

3 голосов
/ 08 мая 2009

Они обычно перекомпилируются автоматически. Я думаю, я не знаю, гарантировано ли это, но это было то, что я наблюдал - если вы измените (например, добавите индекс) объекты, на которые ссылается sproc, то он перекомпилирует.

create table mytable (i int identity)
insert mytable default values
go 100
create proc sp1 as select * from mytable where i = 17
go
exec sp1

Если вы посмотрите на план для этого выполнения, он показывает сканирование таблицы, как и ожидалось.

create index mytablei on mytable(i)
exec sp1

План изменился на поиск индекса.

РЕДАКТИРОВАТЬ: хорошо, я пришел с запросом, который, кажется, работает - это дает вам все имена sproc, которые имеют ссылку на данную таблицу в кэше плана. Вы можете объединить имя sproc с синтаксисом sp_recompile, чтобы сгенерировать кучу операторов sp_recompile, которые затем можно выполнить.

;WITH XMLNAMESPACES (default 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
,TableRefs (SProcName, ReferencedTableName) as
(
    select
        object_name(qp.objectid) as SProcName,
        objNodes.objNode.value('@Database', 'sysname') + '.' + objNodes.objNode.value('@Schema', 'sysname') + '.' + objNodes.objNode.value('@Table', 'sysname') as ReferencedTableName 
    from sys.dm_exec_cached_plans cp
    outer apply sys.dm_exec_sql_text(cp.plan_handle) st
    outer apply sys.dm_exec_query_plan(cp.plan_handle) as qp
    outer apply qp.query_plan.nodes('//Object[@Table]') as objNodes(objNode)
    where cp.cacheobjtype = 'Compiled Plan'
    and cp.objtype = 'Proc'
)
select 
    * 
from TableRefs
where SProcName is not null
    and isnull(ReferencedTableName,'') = '[db].[schema].[table]'
1 голос
/ 08 мая 2009

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

См. Раздел, озаглавленный «Перекомпиляция планов выполнения», для получения подробных сведений о возможных случаях автоматической перекомпиляции.

http://technet.microsoft.com/en-us/library/ms181055(SQL.90).aspx

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