8
votes

Script pour ajouter un index sur chaque clé étrangère?


1 commentaires

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).


5 Réponses :


10
votes

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


1 commentaires

Dans ma DB, ceci a généré 0 rangées, où la ci-dessous de Scott a généré



3
votes

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


1 commentaires

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é).



9
votes

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. xxx


0 commentaires

0
votes

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]


0 commentaires

2
votes

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 xxx


0 commentaires