Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Для всех внешних ключей (FK) в базе, для которых не создан индекс - создать.  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Для всех внешних ключей (FK) в базе, для которых не создан индекс - создать.

Готового скрипта не нашел, и написал свой.
SELECT 
'GO ' + CHAR(13) + CHAR(10) +
'IF EXISTS(SELECT 1 from sys.indexes WHERE name = ''INX_' + t1.TABLE_name + '_' + t1.name +''')' +
   + CHAR(13)+ CHAR(10) +
   + '  DROP INDEX INX_' + t1.TABLE_name + '_' + t1.name +' ON dbo.' + t1.TABLE_name ,
 CHAR(13)+ CHAR(10) + 
'CREATE NONCLUSTERED INDEX INX_' + t1.TABLE_name + '_' + t1.name +' ON ' +
 t1.TABLE_name  + ' (' +t1.name + ') ' 
      
--t1.TABLE_name, t1.name      
FROM  
(
SELECT 
    --obj1.object_id AS FK_name_id,
    --obj1.name AS FK_name,
    obj2.object_id AS TABLE_name_id,
    obj2.name AS TABLE_name,   
    c1.object_id AS column_id,
    c1.name 
   
FROM sys.foreign_key_columns co
    INNER JOIN  sys.objects obj1
    ON co.constraint_object_id = obj1.object_id

    INNER JOIN  sys.objects obj2
    ON co.parent_object_id = obj2.object_id

    INNER JOIN  sys.objects obj3
    ON co.referenced_object_id = obj3.object_id

    INNER JOIN  sys.tables t1
    ON t1.object_id = obj2.object_id 
    INNER JOIN  sys.columns c1
    ON t1.object_id = c1.object_id AND c1.column_id = co.parent_column_id
) t1
LEFT JOIN
(
SELECT  
    t4.object_id AS Table_name_id,
    t4.name AS Table_name,   
    c4.object_id AS INX_column_id,  
    c4.name AS INX_column   
FROM sys.index_columns ic

    INNER JOIN sys.indexes i
    ON i.object_id = ic.object_id AND ic.index_id =i.index_id
    AND ic.key_ordinal =1 -- это первый столбец в списке полей, в индексе
    AND i.index_id >= 1 -- это кластеризованный или некластеризованный индекс
    
    INNER JOIN  sys.tables t4
    ON t4.object_id = ic.object_id 
    INNER JOIN  sys.columns c4
    ON t4.object_id = c4.object_id AND c4.column_id = ic.column_id   
) t2
ON 
    t1.TABLE_name = t2.Table_name
AND t1.name = t2.INX_column

WHERE 1=1
    AND t2.TABLE_name IS NULL   
--ORDER BY t1.TABLE_name, t1.name


Если есть ошибки, просьба подсказать где.
27 сен 12, 17:04    [13234105]     Ответить | Цитировать Сообщить модератору
 Re: Для всех внешних ключей (FK) в базе, для которых не создан индекс - создать.  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Перед запуском скрипта нажать Results to Text.
27 сен 12, 17:05    [13234118]     Ответить | Цитировать Сообщить модератору
 Re: Для всех внешних ключей (FK) в базе, для которых не создан индекс - создать.  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
trew,

Считаете, что многоколоночные FK не существуют?
27 сен 12, 17:11    [13234175]     Ответить | Цитировать Сообщить модератору
 Re: Для всех внешних ключей (FK) в базе, для которых не создан индекс - создать.  [new]
iap
Member

Откуда: Москва
Сообщений: 47048
Что-то я не вижу ни одного ORDER BY (+ к invm).
Типа порядок полей в индексе неважен?
27 сен 12, 17:18    [13234239]     Ответить | Цитировать Сообщить модератору
 Re: Для всех внешних ключей (FK) в базе, для которых не создан индекс - создать.  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
iap,

AND ic.key_ordinal =1

а это не порядок полей?
27 сен 12, 17:21    [13234264]     Ответить | Цитировать Сообщить модератору
 Re: Для всех внешних ключей (FK) в базе, для которых не создан индекс - создать.  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
invm,

Спасибо, подумаю на эту тему.
27 сен 12, 17:23    [13234271]     Ответить | Цитировать Сообщить модератору
 Re: Для всех внешних ключей (FK) в базе, для которых не создан индекс - создать.  [new]
iap
Member

Откуда: Москва
Сообщений: 47048
Можно ещё юзать
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
27 сен 12, 17:24    [13234280]     Ответить | Цитировать Сообщить модератору
 Re: Для всех внешних ключей (FK) в базе, для которых не создан индекс - создать.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Вот 13189951 (под спойлером), можешь выкусить пару "идей" (каркас запроса).
27 сен 12, 20:07    [13235165]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить