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