среда, 6 февраля 2008 г.

Создание индексов на поля, используемые в foreign keys в SQL Server

Рекомендуется индексировать поля, которые используется для построения отношений между таблицами (foreign keys). Однако, вручную следить за актуальностью набора индексов довольно муторно, ниже скрипт (для SQL Server 2005), который проверяет наличие индексов на все поля, задействованные в foreign keys и досоздает отсутствующие.


DECLARE ForeignKeys CURSOR FOR
select fk.name as fkname, so.name as tabname, c.name as colname
from sys.foreign_keys fk
inner join sys.objects so on so.object_id = fk.parent_object_id
inner join sys.foreign_key_columns fkc on fkc.constraint_object_id = fk.object_id
inner join sys.columns c on c.object_id = fkc.parent_object_id and c.column_id = fkc.parent_column_id

DECLARE @fkname nvarchar(255), @tabname nvarchar(255), @colname nvarchar(255), @sql nvarchar(max)

OPEN ForeignKeys
FETCH NEXT FROM ForeignKeys INTO @fkname, @tabname, @colname
WHILE @@FETCH_STATUS = 0
BEGIN
IF not exists (select * from sys.indexes where name = N'IX_' + @tabname + N'_' + @colname)
BEGIN
BEGIN TRY
SET @sql = N'CREATE NONCLUSTERED INDEX IX_'+ @tabname + N'_' + @colname + N' ON ' + @tabname + N'(' + @colname + N' ASC)'
EXEC sp_executesql @sql
print N'Index ' + N'IX_' + @tabname + N'_' + @colname + N' is successfully created'
END TRY
BEGIN CATCH
print N'Error while creating index: ' + N'IX_' + @tabname + N'_' + @colname
END CATCH
END
FETCH NEXT FROM ForeignKeys INTO @fkname, @tabname, @colname
END

CLOSE ForeignKeys
DEALLOCATE ForeignKeys

1 комментарий:

Michael Mix комментирует...

ссылки на странице http://anjlab.com/blog есть неверные, я на эту запись попал проходя по ссылке на запись об инвестициях