2010-02-22 57 views
7

看到,因爲SQL Server中的foreign key does not automatically create an index,我想在我的數據庫中創建的每一個領域FK一個明確的指標。我有過在架構100桌...在每個外鍵上添加索引的腳本?

因此,沒有任何人有一個現成的包裝腳本,我可以用它來檢測所有FKS,創造每一個指標?

+1

嘿,我做了一個週末,我拋棄它。它被定製我的命名規則,所以我做了很多字符串操作,並用模式名(schema_id)和OBJECT_NAME(parent_object_id)從sys.foreign_keys選擇。 – 2010-02-22 09:35:44

回答

7

OK,我工作了這一點,我自己 - 這是其他人的利益......

select 'create index IX_'+c.name+'_'+p.name+' on '+c.name+'('+cf.name+');' 
from sysforeignkeys fk join sysobjects c on fk.fkeyid=c.id 
join sysobjects p on fk.rkeyid=p.id 
join syscolumns cf on c.id=cf.id and cf.colid = fk.fkey 
left join sysindexkeys k on k.id = cf.id and k.colid = cf.colid 
where k.id is null 
order by c.name 

它不工作100%,例如,如果你有一個表中的兩個FKS相同的主表,但也有一些這樣的實例足以(在我的DB至少),我可以可行地用手糾正這些。

3

我修改查詢中使用他們的系統視圖。它還將腳本中的每個FK腳本編寫成不止一個。

SELECT 'CREATE NONCLUSTERED INDEX ndx_' + o.name + '__' + c.name 
    + ' ON ' + o.name + ' (' + c.name + ')' 
FROM sys.foreign_keys  fk 
JOIN sys.objects    o ON fk.parent_object_id = o.object_id 
JOIN sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id 
JOIN sys.columns    c ON fkc.parent_object_id = c.object_id 
           AND fkc.parent_column_id = c.column_id 
ORDER BY o.name 
+0

這是很好的,我就在一個名爲列用戶以防有人添加各地名方braquets(只是發生在我身上)。 – vercelli 2016-08-29 11:27:46

6

好的,這是我的承擔。我添加了對方案的支持,並且檢查當前命名約定是否存在索引。通過這種方式,當您修改表格時,您可以檢查缺少的索引。

SELECT 'CREATE NONCLUSTERED INDEX IX_' + s.NAME + '_' + o.NAME + '__' + c.NAME + ' ON ' + s.NAME + '.' + o.NAME + ' (' + c.NAME + ')' 
    FROM sys.foreign_keys fk 
    INNER JOIN sys.objects o ON fk.parent_object_id = o.object_id 
    INNER JOIN sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id 
    INNER JOIN sys.columns c ON fkc.parent_object_id = c.object_id 
     AND fkc.parent_column_id = c.column_id 
    INNER JOIN sys.tables t ON t.object_id = o.object_id 
    INNER JOIN sys.schemas s ON s.schema_id = t.schema_id 
    LEFT JOIN sys.indexes i ON i.NAME = ('IX_' + s.NAME + '_' + o.NAME + '__' + c.NAME) 
    WHERE i.NAME IS NULL 
    ORDER BY o.NAME 
+0

這太好了,謝謝你的發帖。 – udog 2013-11-25 03:35:03