2012-05-24 16 views
15

Tengo muchas tablas con claves externas y algunas tienen un índice mientras que otras no. Todas las claves foráneas se llaman FK_<name of the foreign key> con índices llamados IX_<name of the foreign key>.sql server: crear índices en claves externas donde sea necesario

¿Existen algunas buenas prácticas, dada la cardinalidad de la columna de la clave externa, para crear (o no) índices? ¿Podría esto ser escrito como comandos T-SQL?

+0

creo que es necesario para aclarar su pregunta, consulte esta observación en la respuesta de Darren: * "Su pregunta es un poco ambigua , así que no estoy seguro si también está preguntando si está bien indexar todas las claves foráneas. "* – Kev

Respuesta

32

No importa si se crean a través de un script de T-SQL o mediante el Diseñador. Su pregunta es un poco ambigua, por lo que no estoy seguro si también está preguntando si está bien indexar todas las claves foráneas. Sin embargo, si usted es, los índices deben crearse en las columnas que se hace referencia con frecuencia en las consultas y se puede hacer lo siguiente para mejorar el rendimiento:

  • Ejecutar el Asistente para ajuste de la base de datos que suministrará un resumen de las mejoras y recomendar índices .

  • Indexe todas las claves foráneas y ejecute el plan de ejecución (para ver si las consultas se realizan más rápido o más despacio).

para crear un índice a través de T-SQL:

CREATE INDEX IX_INDEX_NAME 
ON Table (FieldName); 

Para obtener una lista de todas las claves externas:

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 

Para generar una secuencia de comandos que se aplica índices en todas las claves externas que podría haz esto:

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

Aclaré la pregunta, quiero hacer esto usando el script T-SQL – psadac

+0

@psadac - Actualicé mi publicación. –

+0

'Para generar un script que aplique índices en todas las claves externas' - ¿Qué pasa con las claves externas con una cierta cardinalidad? –

0

Excelente trabajo para todos, muy útil.

Añadiendo una mejora que incluye el esquema de la tabla. También puede excluir nombres FK si lo prefiere (no tiendo a añadir índices en tablas pequeñas)

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 
     '' 
) 
Cuestiones relacionadas