5 Réponses :
OK, j'ai travaillé dessus moi-même - ici c'est pour le bénéfice de tous les autres ...
select 'create index IX_'+c.name+'_'+p.name+' on '+c.name+'('+cf.name+');' from sysforeignkeys fk join sysobjects c on fk.fkeyid=c.id join sysobjects p on fk.rkeyid=p.id join syscolumns cf on c.id=cf.id and cf.colid = fk.fkey left join sysindexkeys k on k.id = cf.id and k.colid = cf.colid where k.id is null order by c.name
Dans ma DB, ceci a généré 0 rangées, où la ci-dessous de Scott a généré
J'ai modifié la requête pour utiliser les vues du système. Il va également scripter chaque FK dans la table non seulement une.
SELECT 'CREATE NONCLUSTERED INDEX ndx_' + o.name + '__' + c.name + ' ON ' + o.name + ' (' + c.name + ')' FROM sys.foreign_keys fk JOIN sys.objects o ON fk.parent_object_id = o.object_id JOIN sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id JOIN sys.columns c ON fkc.parent_object_id = c.object_id AND fkc.parent_column_id = c.column_id ORDER BY o.name
C'est bien, je vais ajouter des brauquets carrés autour des noms au cas où une personne a nommé un utilisateur de colonne (juste m'est arrivé).
OK, voici mon prise sur ceci. J'ai ajouté la prise en charge des régimes et vérifiez également si un indice existe avec la convention de dénomination actuelle. De cette façon, vous modifiez vos tables, vous pouvez vérifier les index manquants.
Aucune idée si cela est plus précis mais j'ai trouvé cela en recherchant des https://encodo.com/latest/developer-blogs/create-indexes-for-all-Forign-keys-in-sql-server/ qui génère un script de création similaire à une partie de ce qui précède, ce qui devrait au moins donner plus d'options à quiconque se terminant ici pour essayer des choses.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- Executing this script will generate a create-script for inserting indexes -- over all tables in the database. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- Select 'IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N''[dbo].[' + tab.[name] + ']'') AND name = N''IX_' + cols.[name] + ''') ' + 'CREATE NONCLUSTERED INDEX [IX_' + cols.[name] + '] ON [dbo].[' + tab.[name] + ']( [' + cols.[name] + '] ASC ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]' From sys.foreign_keys keys Inner Join sys.foreign_key_columns keyCols On keys.object_id = keyCols.constraint_object_id Inner Join sys.columns cols On keyCols.parent_object_id = cols.object_id And keyCols.parent_column_id = cols.column_id Inner Join sys.tables tab On keyCols.parent_object_id = tab.object_id Order by tab.[name], cols.[name]
Voir toutes ces réponses est merveilleuse, mais je devais ignorer ces clés étrangères déjà indexées. À cette fin, j'avais emprunté du code et j'ai modifié avec une partie du code ici.
Les principales parties de ce code vient vraiment de:
Identifiez toutes les clés étrangères non indexées p>
Heh, j'ai fait un le week-end et je l'ai jeté. Il a été personnalisé à ma convention de dénomination, j'ai donc fait beaucoup de manipulation de chaîne et sélectionnée dans Sys.Forign_Keys avec Schema_Name (Schema_id) et Object_Name (parent_object_id).