2012-05-24 10 views
15

Ho molte tabelle con chiavi esterne e alcune hanno un indice mentre altre no. Tutte le chiavi esterne sono denominate FK_<name of the foreign key> con indici denominati IX_<name of the foreign key>.sql server: creare indici sulle chiavi esterne, ove necessario

Esistono alcune buone pratiche, data la cardinalità della colonna della chiave esterna, per creare (o non) indici? Potrebbe essere programmato come comando T-SQL?

+0

penso che è necessario per chiarire la tua domanda, vedi questa osservazione in risposta di Darren: * "La tua domanda è un po 'ambigua , quindi non sono sicuro se stai anche chiedendo se va bene indicizzare tutte le chiavi esterne. "* – Kev

risposta

32

Non importa se vengono creati tramite uno script T-SQL o tramite il Designer. La tua domanda è un po 'ambigua, quindi non sono sicuro se stai chiedendo anche se è giusto indicizzare tutte le chiavi esterne. Tuttavia, se, gli indici devono essere creati su colonne cui viene fatto riferimento di frequente nelle query ed è possibile effettuare le seguenti operazioni per migliorare le prestazioni:

  • Eseguire la procedura guidata tuning del database che fornirà una sintesi dei miglioramenti e raccomandare indici .

  • Indicizzare tutte le chiavi esterne ed eseguire il piano di esecuzione (per vedere se le query si stanno svolgendo più velocemente o più lentamente).

per creare un indice tramite T-SQL:

CREATE INDEX IX_INDEX_NAME 
ON Table (FieldName); 

per ottenere un elenco di tutte le chiavi esterne:

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 

Per generare uno script che applica gli indici in tutte le chiavi esterne si potrebbe Amento:

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

+0

Ho chiarito la domanda, voglio farlo usando lo script T-SQL – psadac

+0

@psadac - Aggiornato il mio post. –

+0

'Per generare uno script che applica gli indici su tutte le chiavi esterne. - Che dire solo delle chiavi esterne con una certa cardinalità? –

0

Ottimo lavoro a tutti, molto utile.

Aggiunta di un miglioramento che include lo schema della tabella. È inoltre possibile escludere nomi FK se si preferisce (tendo a non aggiungere indici sui tavolini)

SELECT 
    * 
FROM 
(
    SELECT TOP 99 PERCENT 
      f.name AS ForeignKeyName 

     , s.name 
       + '.' 
       + OBJECT_NAME(f.parent_object_id) 
       + '.' 
       + COL_NAME(fc.parent_object_id, fc.parent_column_id) 
      ParentTable 

     , referencedSchema.name 
       + '.' 
       + OBJECT_NAME (f.referenced_object_id) 
       + '.' 
       + COL_NAME(fc.referenced_object_id, fc.referenced_column_id) 
      ReferencedTable 

     , 'CREATE INDEX [IX_' + f.name + ']' 
       + ' ON ' 
        + '[' + referencedSchema.name + ']' 
        + '.' 
        + '[' + OBJECT_NAME(f.parent_object_id) + ']' 
        + '(' 
         + COL_NAME(fc.parent_object_id, fc.parent_column_id) 
        + ')' 
      CreateIndexSql   

    FROM 
     sys.foreign_keys AS f 
     INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID = fc.constraint_object_id 
     inner join sys.schemas s on f.schema_id = s.schema_id 

     inner join sys.tables referencedTable on f.referenced_object_id = referencedTable.object_id 
     inner join sys.schemas referencedSchema on referencedTable.schema_id = referencedSchema.schema_id 

    ORDER BY 
     2, 3, 1 
) a 
where a.ParentTable not in (
    -- Add any exclusions here so you can forget about them 
     '' 
) 
Problemi correlati