sql server:在必要时在外键上创建索引

psa*_*dac 18 sql t-sql database sql-server sql-server-2005

我有很多带外键的表,有些有索引,有些则没有.所有外键都使用名为FK_<name of the foreign key>的索引命名IX_<name of the foreign key>.

考虑到外键的列基数,创建(或不创建)索引是否有一些好的做法?这可以作为T-SQL命令编写脚本吗?

Dar*_*ren 37

它们是通过T-SQL脚本还是通过Designer创建的并不重要.你的问题有点含糊不清,所以我不确定你是否也在询问是否可以索引所有的外键.但是,如果是,则应在查询中经常引用的列上创建索引,并且可以执行以下操作以提高性能:

  • 运行数据库调整向导,该向导将提供改进摘要和建议索引.

  • 索引所有外键并运行执行计划(查看查询是执行得更快还是更慢).

通过T-SQL以下方式创建索引:

CREATE INDEX IX_INDEX_NAME
ON Table (FieldName); 
Run Code Online (Sandbox Code Playgroud)

要获取所有外键的列表:

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

要生成一个跨所有外键应用索引的脚本,您可以这样做:

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

http://msdn.microsoft.com/en-us/library/ms188783.aspx