在每个外键上添加索引的脚本?

Sha*_*ica 7 sql-server indexing foreign-keys

看作外键不会自动在SQL Server中创建索引,我想在我的数据库中的每个FK字段上创建一个显式索引.我在架构中有超过100个表...

那么,有没有人有一个现成的打包脚本,我可以用它来检测所有FK并在每个FK上创建一个索引?

Sha*_*ica 9

好吧,我自己做了 - 这里是为了其他人的利益......

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
Run Code Online (Sandbox Code Playgroud)

它不能100%工作,例如,如果一个表上有两个FK到同一个主表,但是有足够的实例(至少在我的数据库中),我可以手动纠正这些.


Sco*_*ams 8

好的,这是我对此的看法.我添加了对方案的支持,并检查是否存在具有当前命名约定的索引.这样,在修改表时,可以检查缺失的索引.

   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
Run Code Online (Sandbox Code Playgroud)