Comment obtenir une liste de toutes les colonnes d'index et d'index dans SQL Server 2005+? Le plus proche que j'ai pu obtenir est:
select s.name, t.name, i.name, c.name from sys.tables t
inner join sys.schemas s on t.schema_id = s.schema_id
inner join sys.indexes i on i.object_id = t.object_id
inner join sys.index_columns ic on ic.object_id = t.object_id
inner join sys.columns c on c.object_id = t.object_id and
ic.column_id = c.column_id
where i.index_id > 0
and i.type in (1, 2) -- clustered & nonclustered only
and i.is_primary_key = 0 -- do not include PK indexes
and i.is_unique_constraint = 0 -- do not include UQ
and i.is_disabled = 0
and i.is_hypothetical = 0
and ic.key_ordinal > 0
order by ic.key_ordinal
Ce n'est pas exactement ce que je veux.
Ce que je veux, c'est répertorier tous les index définis par l'utilisateur ( ce qui signifie qu'il n'y a pas d'index qui prennent en charge les contraintes uniques et les clés primaires ) avec toutes les colonnes (classées selon leur apparence dans la définition de l'index) plus autant de métadonnées que possible.
sql-server
tsql
indexing
reverse-engineering
Anton Gogolev
la source
la source
Réponses:
Il existe deux vues de catalogue "sys" que vous pouvez consulter:
Ceux-ci vous donneront à peu près toutes les informations que vous pourriez souhaiter sur les indices et leurs colonnes.
EDIT: Cette requête se rapproche assez de ce que vous recherchez:
la source
is_ms_shipped=0
), mais pas de clés primaires (is_primary_key=0
) et aucun index créés pour prendre en charge uniquement des contraintes uniques (is_unique_constraint=0
).WHERE (1=1)
laisse l'enchaîner et réorganiser sesAND ...
s sans se soucier de ce qui était le premier. Voir: stackoverflow.com/a/8149183/1160796 et stackoverflow.com/a/242831/1160796Vous pouvez utiliser le
sp_helpindex
pour afficher tous les index d'une table.Et pour tous les index, vous pouvez parcourir
sys.objects
pour obtenir tous les index de chaque table.la source
Rien de ce qui précède n'a fait le travail pour moi, mais cela fait:
Si vos noms contiennent des espaces, ajoutez des crochets autour d'eux dans les scripts de création.
Lorsque la dernière colonne Clé est entièrement nulle, vous savez qu'aucune ne manque.
Le filtrage des clés primaires, etc., comme dans la demande d'origine, est trivial.
REMARQUE: faites attention à cette solution car elle ne distingue pas les colonnes indexées et incluses.
la source
--Court et doux:
la source
Les éléments suivants fonctionnent sur SQL Server 2014/2016 ainsi que sur toute base de données Microsoft Azure SQL.
Produit un ensemble de résultats complet qui est facilement exportable vers le Bloc-notes / Excel pour le découpage et la découpe et comprend
la source
Hé les gars, je ne suis pas passé par là mais j'ai obtenu ce que je voulais dans la requête postée par l'auteur original.
Je l'ai utilisé (sans conditions / filtres) pour mon besoin mais cela a donné des résultats incorrects
Le principal problème était que les résultats obtenaient un produit croisé sans condition de jointure sur index_id
la source
J'ai eu besoin d'obtenir des index particuliers, leurs colonnes d'index et leurs colonnes incluses également. Voici la requête que j'ai utilisée:
la source
SELECT
pour générer lesCREATE
déclarations:,CreateStatement = 'CREATE INDEX [' + INX.[name] + '] ON dbo.[' + TBL.[name] + '] (' + REPLACE(DS1.IndexColumnsNames, '] [', '], [') + ')' + CASE WHEN DS2.IncludedColumnsNames IS NOT NULL THEN ' INCLUDE (' + REPLACE(DS2.IncludedColumnsNames, '] [', '], [') + ')' ELSE '' END
.Ce qui suit est similaire à sp_helpindex tablename
la source
Sur la base de la réponse acceptée et de deux autres questions 1 , 2, j'ai assemblé la requête suivante:
Cette requête renvoie des résultats tels que ceux ci-dessous qui affichent la liste des index, leurs colonnes et leur utilisation. Très utile pour déterminer quel indice fonctionne mieux que d'autres:
la source
cela fonctionnera:
cela ne reurn le nom de la table et vous obtiendrez des avertissements pour toutes les tables sans index, si c'est un problème, vous pouvez créer une boucle sur les tables qui ont des index comme celui-ci:
MODIFIER
si vous le souhaitez, vous pouvez filtrer les données, voici quelques exemples (ceux-ci fonctionnent pour l'une ou l'autre méthode):
la source
la source
index_column_id
n'est pas l'ordre des colonnes dans le PK mais dans le tableau! Utilisezkey_ordinal
plutôt.C'est une façon de reculer dans les index. Vous pouvez utiliser SHOWCONTIG pour évaluer la fragmentation. Il répertorie tous les index de la base de données ou de la table, ainsi que les statistiques. Je vous préviens que sur une grande base de données, cela peut durer longtemps. Pour moi, l'un des avantages de cette approche est que vous n'avez pas besoin d'être administrateur pour l'utiliser.
--Afficher les informations de fragmentation sur tous les index d'une base de données
... désactivez NOCOUNT lorsque vous avez terminé
--Afficher les informations de fragmentation sur tous les index d'une table
--Afficher les informations de fragmentation sur un index spécifique
la source
Puis-je hasarder une autre réponse à cette question saturée?
Il s'agit d'une refonte libérale de la réponse de @marc_s, mélangée à des éléments de @Tim Ford, dans le but d'avoir un ensemble de résultats plus propre et plus simple et un affichage final et une commande pour mes besoins actuels.
la source
basé sur le code Tim Ford, voici la bonne réponse:
la source
index_column_id
n'est pas l'ordre des colonnes dans le PK mais dans le tableau! Utilisezkey_ordinal
plutôt.J'ai trouvé celui-ci, qui me donne l'aperçu exact dont j'ai besoin. Ce qui est utile, c'est que vous obtenez une ligne par index dans laquelle les colonnes d'index sont agrégées.
la source
Étant donné que votre profil indique que vous utilisez .NET, vous pouvez utiliser des objets gérés par le serveur (SMO) par programmation ... sinon l'une des réponses ci-dessus est fantastique.
la source
La solution ci-dessus est élégante, mais selon MS, INDEXKEY_PROPERTY est obsolète. Voir: http://msdn.microsoft.com/en-us/library/ms186773.aspx
la source
Dans Oracle
Dans SQL Server avec
la source
Notez simplement que si vous allez utiliser l'une des requêtes de travail ci-dessus pour écrire vos index, vous devez incorporer la colonne filter_definition de la table sys.indexes dans vos requêtes pour obtenir la définition de filtre des index non clusterisés dans SQL 2008+
UN M
la source
La requête ci-dessous comprend toutes les informations pertinentes pour les index définis par l'utilisateur, (pas d'index pour les contraintes uniques et les clés primaires) avec toutes les colonnes:
En prime, la requête ci-dessous est formatée pour écrire les scripts de création d'index et de suppression d'index:
la source
C'est le mien, fonctionne sur un schéma par défaut mais il peut être facilement amélioré Il donne 3 colonnes avec SQLQueries - Créer / Supprimer / Reconstruire (pas de réorganisation)
Requete:
Production
la source
Tout d'abord, veuillez noter que toutes les requêtes ci-dessus peuvent manquer ou incorporer par erreur les colonnes INCLUDE des indices. Il manque également dans certains le bon ordre et / ou l'option ASC / DESC des colonnes.
Modification de la requête ci-dessus par jona. En passant, dans la plupart des bases de données que j'utilise, j'installe ma propre fonction d'agrégat CLR CONCATENATE, donc le code ci-dessous dépend de quelque chose comme ça. Les instructions SQL ci-dessus se réduisent à un niveau beaucoup plus facile à maintenir:
Il existe de nombreux agrégats de concaténation si votre environnement autorise l'ajout de fonctions basées sur CLR.
la source
Pour les colonnes uniques par index:
la source
Voici la meilleure façon de procéder:
Je préfère utiliser les jointures implicites car c'est plus facile à comprendre pour moi. Vous pouvez supprimer la référence object_id car vous n'en aurez peut-être pas besoin.
À votre santé.
la source
À l'aide de SQL Server 2016, cela donne une liste complète de tous les index, avec un vidage inclus de chaque table afin que vous puissiez voir comment les tables sont liées. Il affiche également les colonnes incluses dans les index de couverture:
la source
index_column_id
n'est pas l'ordre des colonnes dans le PK mais dans le tableau! Utilisezkey_ordinal
plutôt.J'ai utilisé la requête suivante lorsque j'ai eu cette exigence ...
la source
Solution de travail pour SQL Server 2014. J'ai inclus seulement une poignée de champs de sortie ici, mais n'hésitez pas à en ajouter autant que vous le souhaitez.
la source
index_column_id
n'est pas l'ordre des colonnes dans le PK mais dans le tableau! Utilisezkey_ordinal
plutôt.J'ai donné une réponse à KFD9.
J'ai adapté leur version pour prendre en charge la spécification d'inclusion et ne pas utiliser indexkey_property qui est obsolète
Cela vous donne une instruction create et drop pour les index et les contraintes.
la source
la source
index_column_id
n'est pas l'ordre des colonnes dans le PK mais dans le tableau! Utilisezkey_ordinal
plutôt.