2012-05-24 13 views
15

Mam wiele tabel z kluczami obcymi, a niektóre mają indeks, a inne nie. Wszystkie klucze obce mają nazwę FK_<name of the foreign key> z indeksami o nazwie IX_<name of the foreign key>.Serwer sql: tworzenie indeksów kluczy obcych w razie potrzeby

Czy istnieją pewne dobre praktyki, biorąc pod uwagę liczność kolumny klucza obcego, aby utworzyć (lub nie) indeksy? Czy można to skryptować jako polecenia T-SQL?

+0

Chyba trzeba wyjaśnić swoje pytanie, zobaczyć tę obserwację w odpowiedzi Darrena: * "Twoje pytanie jest trochę niejednoznaczne , więc nie jestem pewien, czy pytasz również, czy można indeksować wszystkie klucze obce. "* – Kev

Odpowiedz

32

Nie ma znaczenia, czy są tworzone za pomocą skryptu T-SQL lub za pośrednictwem Projektanta. Twoje pytanie jest trochę niejednoznaczne, więc nie jestem pewien, czy pytasz również, czy można indeksować wszystkie klucze obce. Jednakże, jeśli jesteś, indeksy powinny być tworzone na kolumnach, do których odwołuje się często w zapytaniach i można wykonać następujące czynności w celu zwiększenia wydajności:

  • uruchomić kreatora strojenia bazy danych, która będzie dostarczać podsumowanie ulepszeń i polecam indeksów .

  • Indeksuj wszystkie klucze obce i uruchom plan wykonania (Aby sprawdzić, czy zapytania działają szybciej lub wolniej).

Aby utworzyć indeks poprzez T-SQL:

CREATE INDEX IX_INDEX_NAME 
ON Table (FieldName); 

Aby uzyskać listę wszystkich kluczy obcych:

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 

Aby wygenerować skrypt, który stosuje indeksy we wszystkich kluczy obcych mogłeś zrób to:

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

Wyjaśniłem pytanie, chcę to zrobić za pomocą skryptu T-SQL – psadac

+0

@psadac - Zaktualizowano mój post. –

+0

'Aby wygenerować skrypt, który stosuje indeksy dla wszystkich kluczy obcych' - A co z kluczami obcymi z pewną liczbą? –

0

Świetna robota dla wszystkich, bardzo pomocna.

Dodanie akcesorium zawierającego schemat tabeli. Można również wykluczyć nazwy FK jeśli wolisz (I nie wydają się dodać indeksy na stoliki)

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 
     '' 
) 
Powiązane problemy