2010-02-22 33 views
7

Xem dưới dạng foreign key does not automatically create an index trong SQL Server, tôi muốn tạo chỉ mục rõ ràng trên mọi trường FK trong cơ sở dữ liệu của mình. Và tôi có hơn 100 bảng trong lược đồ ...Tập lệnh để thêm chỉ mục trên mỗi khóa ngoại?

Vì vậy, có ai có tập lệnh đóng gói sẵn sàng mà tôi có thể sử dụng để phát hiện tất cả các FK và tạo chỉ mục trên mỗi loại không?

+1

Heh, tôi đã làm một vào cuối tuần và tôi đã hủy nó. Nó được tùy chỉnh theo quy ước đặt tên của tôi, vì vậy tôi đã thực hiện rất nhiều thao tác chuỗi và được chọn từ sys.foreign_keys với schema_name (schema_id) và object_name (parent_object_id). –

Trả lời

7

OK, tôi đã làm việc này ra bản thân mình - ở đây nó là cho tất cả mọi lợi ích của người khác ...

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 

Nó không làm việc 100%, ví dụ như nếu bạn có hai FKs trên một bảng với cùng bảng chính, nhưng có rất ít trường hợp đủ điều này (trong DB của tôi ít nhất) mà tôi có thể sửa chữa chính xác bằng tay.

3

Tôi đã sửa đổi truy vấn để sử dụng chế độ xem hệ thống. Nó cũng sẽ kịch bản mỗi FK trong bảng không chỉ là một.

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 
+0

Điều này là tốt đẹp, tôi sẽ thêm braquets vuông xung quanh tên chỉ trong trường hợp một người nào đó tên là một người sử dụng cột (chỉ xảy ra với tôi). – vercelli

6

Ok, đây là việc tôi thực hiện việc này. Tôi đã thêm hỗ trợ cho các lược đồ và cũng kiểm tra xem một chỉ mục có tồn tại với quy ước đặt tên hiện tại hay không. Bằng cách này khi bạn sửa đổi các bảng của mình, bạn có thể kiểm tra các chỉ mục bị thiếu.

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 
+0

Điều này thật tuyệt vời, cảm ơn bạn đã đăng bài. – udog

Các vấn đề liên quan