2009-06-26 11 views
4

Existe-t-il un moyen de voir quels objets SQL d'une base de données utilisent un certain index. Mais je ne veux pas avoir à voir le plan d'exécution pour chaque objet car j'ai beaucoup de procédures stockées et de vuesObjets SQL utilisant un index

PS. C'est pour SQL 2005

Répondre

2

Les objets de base de données n'utilisent pas d'index, ce que font les requêtes.

Un table ou un view peut avoir un index défini dessus. Vous pouvez le voir dans l'arbre des propriétés dans le Management Studio.

L'indice peut ou ne peut pas être plus tard utilisé par une requête contre cette table ou view.

Une décision d'utiliser ou non l'index est prise au cours de la phase d'analyse de la requête.

L'affichage du plan d'exécution est le seul moyen de déterminer si la requête utilise ou non l'index.

+0

??? Les procédures stockées et les UDF sont aussi des objets ... –

0

vous pouvez interroger le sys.indexes table qui:

contient une ligne par index ou tas d'un objet sous forme de tableau, comme une table, une vue ou d'une fonction à valeur de table.

+0

qui ne vous dit pas si elle est utilisée, vous devez vous joindre à sys.dm_db_index_usage_stats pour l'utilisation, voir la requête que j'ai posté – SQLMenace

+0

@SQLMenace, bon point. Je lisais dans le terme «utiliser» pour signifier «avoir pour usage» – akf

2

non, vous ne pouvez pas ... mais vous pouvez voir si les index sont utilisés par une requête

Voici une telle requête qui vous donnera cette information

SELECT 
TableName = OBJECT_NAME(s.[OBJECT_ID]), 
IndexName = i.name, 
s.last_user_seek, 
s.user_seeks, 
CASE s.user_seeks WHEN 0 THEN 0 
ELSE s.user_seeks*1.0 /(s.user_scans + s.user_seeks) * 100.0 END AS SeekPercentage, 
s.last_user_scan, 
s.user_scans, 
CASE s.user_scans WHEN 0 THEN 0 
ELSE s.user_scans*1.0 /(s.user_scans + s.user_seeks) * 100.0 END AS ScanPercentage, 
s.last_user_lookup, 
s.user_lookups, 
s.last_user_update, 
s.user_updates, 
s.last_system_seek, 
s.last_system_scan, 
s.last_system_lookup, 
s.last_system_update,* 
FROM 
sys.dm_db_index_usage_stats s 
INNER JOIN 
sys.indexes i 
ON 
s.[OBJECT_ID] = i.[OBJECT_ID] 
AND s.index_id = i.index_id 
WHERE 
s.database_id = DB_ID() 
AND OBJECTPROPERTY(s.[OBJECT_ID], 'IsMsShipped') = 0 
AND OBJECT_NAME(s.[OBJECT_ID]) = 'TestIndex'; 

certains plus d'infos ici Use the sys.dm db index usage stats dmv to check if indexes are being used

votre autre option serait d'analyser la colonne query_plan de la requête ci-dessous

SELECT q.TEXT,cp.usecounts,cp.objtype,p.*, 
q.*, 
cp.plan_handle 
FROM 
sys.dm_exec_cached_plans cp 
cross apply sys.dm_exec_query_plan(cp.plan_handle) p 
cross apply sys.dm_exec_sql_text(cp.plan_handle) AS q 
WHERE 
cp.cacheobjtype = 'Compiled Plan' 
and q.TEXT not like '%sys.dm_exec_cached_plans %' 
+0

+1 - (a) l'utilisation d'index est déterminée par le plan de requête de sorte qu'il peut changer au fil du temps, même pour la même requête. (b) un extrait pour montrer comment le rechercher dans le dictionnaire de données. – ConcernedOfTunbridgeWells

+0

Il va changer à chaque fois que l'index est frappé J'ai fourni un lien qui montre que. Cela aussi se réinitialise si vous redémarrez le serveur sql donc les gens doivent être au courant de cela – SQLMenace

+0

Oui, j'ai extrait l'index utilisé et le rapport de seek + scan + lookup/mise à jour mais je voudrais savoir quelles requêtes les utilisaient donc je peut prendre une meilleure décision de conserver ou de supprimer un certain index – Roxana

0

Je voulais juste ajouter un commentaire, mais il semble tout script entraîné est brisé aujourd'hui à mon avis de SO et je dois ajouter une réponse complète à la place ...

En plus des sys.dm_db_index_usage_stats qui montre comment les index sont effectivement utilisés, SQL Server conserve également les index manquants et propose des DMV qui indiquent quels index auraient été utilisés par les requêtes si elles avaient été présentes. Voir http://msdn.microsoft.com/en-us/library/ms345405.aspx (Utilisation des informations d'index manquantes pour écrire des instructions CREATE INDEX).

Vous devez également télécharger les rapports SQL Server 2005 Performance Dashboard de http://www.microsoft.com/downloads/details.aspx?FamilyId=1d3a4a0d-7e0c-4730-8204-e419218c1efc&displaylang=en qui facilitent la navigation dans toutes ces informations (index utilisés, index manquants, etc.).

Questions connexes