如何索引MS SQL中的所有外键?

时间:2010-12-07 14:54:08

标签: sql-server indexing foreign-keys

我们有大型MS SQL数据库,包含许多表和外键。由于性能的原因,我们需要索引表中的所有外键,我们试图避免手动操作。有没有办法让MS SQL自动或使用某些工具?

使用的MS SQL服务器是MS SQL Server 2008 R2。

非常感谢。

3 个答案:

答案 0 :(得分:5)

我会引导您远离尝试自动执行此操作,并鼓励您检查您的系统(Google缺少索引DMV(SQL 2005或更高版本)以获得良好的开端)并创建适当的索引。如果您尝试自动执行此操作,则可能会出现以下问题:

  • 在低于列的列上创建索引 将消耗资源但永远不会被使用的基数 (例如,查找的外键 具有少量可能值的表格)

  • 介绍书签查找,因为 您创建的索引可能具有 受益于包括额外的 列。

我不是说你的外键不应该被编入索引,只是应该考虑创建这些索引。

答案 1 :(得分:0)

这将允许查找所有FK及其相关列。如果有人倾向于编写一个脚本来测试所涉及的表的基数并生成索引

Select rc.constraint_name, table_name,column_name 
from 
    information_schema.REFERENTIAL_CONSTRAINTS rc
    INNER JOIN information_schema.CONSTRAINT_COLUMN_USAGE usage
    on rc.constraint_name = usage.constraint_name

答案 2 :(得分:0)

下面的脚本应该有所帮助:

declare @schemaName varchar(128)
declare @tableName varchar(128)
declare @columnName varchar(128)

declare @refSchemaName varchar(128)
declare @refTableName varchar(128)
declare @refColumnName varchar(128)

declare @sql nvarchar(max)
set @sql = ''

declare cur cursor for
select sch.name as SchemaName, tab.name as TableName, col.name as ColumnName, ref_sch.name as RefSchemaName, ref_tab.name as RefTableName, ref_col.name as RefColumnName
from sys.foreign_keys fk
join sys.foreign_key_columns fkc on fkc.constraint_object_id = fk.object_id
join sys.tables tab on tab.object_id = fkc.parent_object_id
join sys.schemas sch on sch.schema_id = tab.schema_id
join sys.columns col on fkc.parent_column_id = col.column_id and fkc.parent_object_id = col.object_id
join sys.tables ref_tab on ref_tab.object_id = fkc.referenced_object_id
join sys.schemas ref_sch on ref_sch.schema_id = ref_tab.schema_id
join sys.columns ref_col on fkc.referenced_column_id = ref_col.column_id and fkc.referenced_object_id = ref_col.object_id

open cur
fetch next from cur into @schemaName, @tableName, @columnName, @refSchemaName, @refTableName, @refColumnName
while @@FETCH_STATUS = 0
begin
    set @sql = '
    if not exists (SELECT * FROM sys.indexes 
    WHERE name=''IX_' + @schemaName + @tableName + '_' + @columnName + ''' AND object_id = OBJECT_ID(''' + @schemaName + '.' + @tableName + ''')) 
    begin
        CREATE INDEX IX_' + @schemaName + @tableName + '_' + @columnName + ' ON [' + @schemaName + '].[' + @tableName + '] 
        ([' + @columnName + ']) WITH (FILLFACTOR = 80) 
    end'
    --print @sql
    exec sp_executesql @sql
    fetch next from cur into @schemaName, @tableName, @columnName, @refSchemaName, @refTableName, @refColumnName
end

close cur
deallocate cur

选择所有外键后,它会创建索引,其名称格式为'IX_“schemaName”“tableName”_“columnName”'和fillfactor = 80。