2009-05-08 3 views
4

Je dois ajouter un index à une table, et je veux recompiler seulement/toutes les procédures stockées qui font référence à cette table. Y a-t-il un moyen rapide et facile?ajouter l'index SQL Server mais comment recompiler uniquement les procédures stockées affectées?

EDIT:

de SQL Server 2005 en ligne, recompilation Procédures stockées:

En tant que base de données est modifiée par des actions telles que l'ajout d'index ou de modifier des données dans les colonnes indexées, les plans de requête d'origine utilisés pour l'accès ses tables devraient être optimisées à nouveau en les recompilant. Cette optimisation se produit automatiquement la première fois qu'une procédure stockée est exécutée après le redémarrage de Microsoft SQL Server 2005. Cela se produit également si une table sous-jacente utilisée par la procédure stockée change. Toutefois, si un nouvel index est ajouté à partir duquel la procédure stockée peut bénéficier, l'optimisation ne se produit pas jusqu'à la prochaine exécution de la procédure stockée après le redémarrage de Microsoft SQL Server. Dans cette situation, il peut être utile de forcer la procédure stockée à recompiler la prochaine fois qu'elle s'exécute

Une autre raison de forcer une procédure stockée à recompiler est de contrer, si nécessaire, le comportement de "reniflage de paramètres" de la procédure stockée compilation. Lorsque SQL Server exécute des procédures stockées, toutes les valeurs de paramètre utilisées par la procédure lors de la compilation sont incluses dans le cadre de la génération du plan de requête. Si ces valeurs représentent les valeurs typiques avec lesquelles la procédure est appelée par la suite, la procédure stockée bénéficie du plan de requête chaque fois qu'elle est compilée et exécutée. Sinon, les performances peuvent en souffrir

+0

Que voulez-vous dire par « recompiler "? Les procédures stockées n'ont pas besoin d'être compilées.Parlez-vous de mettre à jour vos requêtes SQL pour utiliser différentes clauses WHERE en utilisant des colonnes qui sont maintenant indexées? – karlgrz

+0

@KG: Les procédures stockées doivent être recompilées automatiquement par SQL Server ou manuellement afin qu'un nouveau plan d'exécution puisse remplacer le plan désormais obsolète dans le cache du plan, afin d'utiliser l'index nouvellement ajouté. –

+0

@KG, je pensais sp_recompile [@objname =] 'objet', provoque les procédures stockées et les déclencheurs à recompiler la prochaine fois qu'ils sont exécutés. –

Répondre

3

Vous pouvez exceute sp_recompile et fournir le nom de la table que vous venez d'indexer. tous les procs qui dépendent de cette table seront vidées à partir du cache de procédure stockée et être « compilé » la prochaine fois qu'ils sont exécutés

Voir ce des msdn docs: sp_recompile (Transact-SQL)

+0

C'est tellement moins cool et plus pratique que ma grosse requête de cache de plan :) Merci pour le pointeur. – ahains

3

Ils sont généralement recompilés automatiquement. Je suppose que je ne sais pas si cela est garanti, mais c'est ce que j'ai observé - si vous changez (par exemple, ajoutez un index) les objets référencés par le sproc, alors il recompile.

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 

Si vous examinez le plan pour cette exécution, il affiche une analyse de table comme prévu.

create index mytablei on mytable(i) 
exec sp1 

Le plan a été remplacé par une recherche d'index.

EDIT: ok Je suis arrivé avec une requête qui semble fonctionner - cela vous donne tous les noms de sproc qui ont une référence à une table donnée dans le cache du plan. Vous pouvez concaténer le nom du sproc avec la syntaxe sp_recompile pour générer un groupe d'instructions sp_recompile que vous pouvez ensuite exécuter.

;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]' 
+0

Ajout d'une requête pour trouver les références dans le cache du plan. Xquery sur le cache du plan est si pratique parfois :) – ahains

+0

+1 pour un bon essai –

1

Je crois que les procédures stockées qui pourraient bénéficier de la présence de l'indice en question auront automatiquement un nouveau plan de requête généré, a fourni les statistiques génèrent automatiquement l'option a été activée. Voir la section intitulée Recompilation des plans d'exécution pour plus de détails sur les éventualités qui provoquent une recompilation automatique.

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

+0

+1 très bon lien! –

Questions connexes