我有很多与外键的表和一些有一个索引,而另一些则没有。 所有的外键被命名为FK_<name of the foreign key>
名为指标IX_<name of the foreign key>
。
是否有一些好的做法,考虑到外键的列基数,以创建(或没有)索引? 作为T-SQL命令会这样的脚本?
我有很多与外键的表和一些有一个索引,而另一些则没有。 所有的外键被命名为FK_<name of the foreign key>
名为指标IX_<name of the foreign key>
。
是否有一些好的做法,考虑到外键的列基数,以创建(或没有)索引? 作为T-SQL命令会这样的脚本?
如果他们通过T-SQL脚本或通过设计器创建没关系。 你的问题是有点暧昧,所以我不能确定,如果你还问,如果它是好的索引所有的外键。 但是,如果你是,索引应当对在查询中经常被引用,你可以做以下,以提高性能列上创建:
运行,这将提供改进的总结和建议索引数据库优化向导。
指数所有的外键和运行执行计划(要查看查询执行更快或更慢)。
要通过创建一个索引T-SQL
:
CREATE INDEX IX_INDEX_NAME
ON Table (FieldName);
为了让所有外键的列表:
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
要生成所有外键,你可以做到这一点适用索引的脚本:
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
干得好大家好,非常有帮助。
并称,包括表架构的增强。 您还可以排除FK的名字,如果你喜欢(我倾向于不要在表上添加索引)
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
''
)