2012-05-24 14 views
15

Diğerleri yokken bir çok indeksi var. Tüm yabancı anahtarlar IX_<name of the foreign key> adlı dizinlere sahip FK_<name of the foreign key> olarak adlandırılır.sql server: gerektiğinde yabancı anahtarlarda dizin oluşturulsun

indeksleri oluşturma (veya değil) için, yabancı anahtarın kolon kardinalitesi verilen bazı iyi uygulamalar var mı? Bu, T-SQL komutları olarak yazılabilir mi?

+0

(Ben küçük tablolarda dizinler eklemek için değil eğilimindedir) FK isimleri hariç tutabilir dizindeki yabancı anahtarların tümüne tamam olup olmadığını da soran eğer, bu yüzden emin değilim "* – Kev

cevap

32

bir T-SQL Script üzerinden veya Designer yoluyla oluşturulur eğer önemli değildir. Sorunuz biraz belirsiz, bu yüzden eğer tüm yabancı anahtarları indekslemenin iyi olup olmadığını soruyorsanız emin değilim. eğer Ancak, endeksler sorgularda sık başvurulan sütunlar üzerinde oluşturulması gerekir ve performansı artırmak için aşağıdakileri yapabilirsiniz:

  • geliştirmelerin bir özeti tedarik ve endeksler tavsiye eder veritabanı ayarlama sihirbazı çalıştırın .

  • Endeksi yabancı anahtarların tamamı ve yürütme planını çalıştırın (sorguları hızlı veya daha yavaş performans gösterip görmek için).

T-SQL aracılığıyla bir dizin oluşturmak için: yapabildin tüm yabancı tuşların üzerinde endeksleri uygulayan bir komut dosyası oluşturmak için

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 

:

CREATE INDEX IX_INDEX_NAME 
ON Table (FieldName); 

tüm yabancı anahtarların bir listesini almak için bunu yapmak:

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

soruyu açıklık, bunu kullanarak T-SQL komut dosyası – psadac

+0

@psadac yapmak istiyorum -. mesajımın güncellendi. –

+0

'Tüm yabancı anahtarlarda dizin uygulayan bir komut dosyası oluşturmak için - Belirli bir kardinaliteye sahip yabancı anahtarlar nedir? –

0

Herkesi tebrik, çok yararlı.

Tablo şemasını içeren bir geliştirme ekleme. * "Sorunuz belirsiz biraz: İsterseniz de sana, sorunuzu netleştirmek Darren'ın yanıtında bu gözlemi görmeliyiz

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