Как проиндексировать все внешние ключи в MS SQL? - PullRequest
1 голос
/ 07 декабря 2010

У нас большая база данных MS SQL с множеством таблиц и внешних ключей.Нам нужно индексировать все внешние ключи в наших таблицах из-за производительности, и мы стараемся избегать делать это вручную.Есть ли способ MS SQL сделать это автоматически или с помощью некоторых инструментов?

MS SQL-сервер используется MS SQL Server 2008 R2.

Большое спасибо.

Ответы [ 3 ]

5 голосов
/ 07 декабря 2010

Я бы отвел вас от попыток сделать это автоматически и рекомендовал бы вам проверить вашу систему (Google не хватает индексов DMV (SQL 2005 или более поздняя версия) для хорошего начала) и вместо этого создать соответствующие индексы. Если вы попытаетесь сделать это автоматически, вы можете столкнуться с такими проблемами, как:

  • Создание индексов для столбцов с низким мощность, которая будет потреблять ресурсы, но никогда не будет использоваться (например, внешний ключ для поиска таблица с небольшим количеством возможных значений)

  • Представляем поиск по закладкам, потому что созданные вами индексы могут иметь выиграл от включения дополнительных столбцы.

Я не говорю, что ваши внешние ключи не должны быть проиндексированы, просто нужно подумать о создании этих индексов.

0 голосов
/ 10 октября 2017

Сценарий, приведенный ниже, должен помочь:

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.

0 голосов
/ 07 декабря 2010

Это позволит найти все ФК и связанные с ними столбцы. Если кто-то так склонен, они могли бы написать сценарий, который проверяет количество задействованных таблиц и генерирует индексы

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...