Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL-Server:Erstellen Sie bei Bedarf Indizes für Fremdschlüssel

Dabei spielt es keine Rolle, ob sie über ein T-SQL-Skript oder über den Designer erstellt werden. Ihre Frage ist etwas mehrdeutig, daher bin ich mir nicht sicher, ob Sie auch fragen, ob es in Ordnung ist, alle Fremdschlüssel zu indizieren. In diesem Fall sollten jedoch Indizes für Spalten erstellt werden, auf die häufig in Abfragen verwiesen wird, und Sie können Folgendes tun, um die Leistung zu verbessern:

  • Führen Sie den Datenbank-Tuning-Assistenten aus, der eine Zusammenfassung der Verbesserungen liefert und Indizes empfiehlt.

  • Indizieren Sie alle Fremdschlüssel und führen Sie den Ausführungsplan aus (um zu sehen, ob Abfragen schneller oder langsamer ausgeführt werden).

So erstellen Sie einen Index über T-SQL :

CREATE INDEX IX_INDEX_NAME
ON Table (FieldName); 

So erhalten Sie eine Liste aller Fremdschlüssel:

SELECT f.name AS ForeignKey, 
 OBJECT_NAME(f.parent_object_id) AS TableName, 
 COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName, 
 OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName, 
 COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName 
FROM sys.foreign_keys AS f 
INNER JOIN sys.foreign_key_columns AS fc 
ON f.OBJECT_ID = fc.constraint_object_id

Um ein Skript zu generieren, das Indizes auf alle Fremdschlüssel anwendet, könnten Sie Folgendes tun:

SELECT 'CREATE INDEX [IX_' + f.name + '] ON ' + OBJECT_NAME(f.parent_object_id) + '(' + COL_NAME(fc.parent_object_id, fc.parent_column_id) + ')]'
FROM sys.foreign_keys AS f 
INNER JOIN sys.foreign_key_columns AS fc 
ON f.OBJECT_ID = fc.constraint_object_id

http://msdn.microsoft.com/en-us/library/ms188783 .aspx