Скрипт для добавления индекса на каждый внешний ключ? - PullRequest
7 голосов
/ 22 февраля 2010

Вид внешнего ключа не создает автоматически индекс в SQL Server, я хочу создать явный индекс для каждого поля FK в моей базе данных. И у меня есть более 100 таблиц в схеме ...

Итак, есть ли у кого-нибудь готовый упакованный скрипт, который я мог бы использовать для обнаружения всех FK и создания индекса для каждого?

Ответы [ 3 ]

9 голосов
/ 22 февраля 2010

Хорошо, я сам решил это - вот это для всех остальных ...

select 'create index IX_'+c.name+'_'+p.name+' on '+c.name+'('+cf.name+');'
from sysforeignkeys fk join sysobjects c on fk.fkeyid=c.id
join sysobjects p on fk.rkeyid=p.id
join syscolumns cf on c.id=cf.id and cf.colid = fk.fkey
left join sysindexkeys k on k.id = cf.id and k.colid = cf.colid
where k.id is null
order by c.name

Это не работает на 100%, например, если у вас есть два FK на одной таблице к одной и той же первичной таблице, но таких примеров достаточно (по крайней мере, в моей БД), чтобы я мог вручную исправить их вручную .

8 голосов
/ 28 мая 2013

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

   SELECT 'CREATE NONCLUSTERED INDEX IX_' + s.NAME + '_' + o.NAME + '__' + c.NAME + ' ON ' + s.NAME + '.' + o.NAME + ' (' + c.NAME + ')'
    FROM sys.foreign_keys fk
    INNER JOIN sys.objects o ON fk.parent_object_id = o.object_id
    INNER JOIN sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id
    INNER JOIN sys.columns c ON fkc.parent_object_id = c.object_id
        AND fkc.parent_column_id = c.column_id
    INNER JOIN sys.tables t ON t.object_id = o.object_id
    INNER JOIN sys.schemas s ON s.schema_id = t.schema_id
    LEFT JOIN sys.indexes i ON i.NAME = ('IX_' + s.NAME + '_' + o.NAME + '__' + c.NAME)
    WHERE i.NAME IS NULL
    ORDER BY o.NAME
3 голосов
/ 14 августа 2012

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

SELECT 'CREATE NONCLUSTERED INDEX ndx_' + o.name + '__' + c.name 
   + ' ON ' + o.name + ' (' + c.name + ')'
FROM   sys.foreign_keys        fk
JOIN   sys.objects             o    ON  fk.parent_object_id = o.object_id
JOIN   sys.foreign_key_columns fkc  ON  fk.object_id = fkc.constraint_object_id
JOIN   sys.columns             c    ON  fkc.parent_object_id = c.object_id
                                AND fkc.parent_column_id = c.column_id
ORDER BY o.name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...