Không quan trọng nếu chúng được tạo thông qua T-SQL Script hoặc thông qua Trình thiết kế. Câu hỏi của bạn hơi mơ hồ, vì vậy tôi không chắc liệu bạn cũng đang hỏi liệu việc lập chỉ mục tất cả các khóa ngoại có ổn không. Tuy nhiên, nếu đúng như vậy, chỉ mục nên được tạo trên các cột được tham chiếu thường xuyên trong các truy vấn và bạn có thể làm như sau để cải thiện hiệu suất:
-
Chạy trình hướng dẫn điều chỉnh cơ sở dữ liệu sẽ cung cấp bản tóm tắt các cải tiến và đề xuất các chỉ mục.
-
Lập chỉ mục tất cả các khóa ngoại và chạy kế hoạch thực thi (Để xem các truy vấn đang hoạt động nhanh hơn hay chậm hơn).
Để tạo chỉ mục qua T-SQL
:
CREATE INDEX IX_INDEX_NAME
ON Table (FieldName);
Để nhận danh sách tất cả các Khóa ngoại:
SELECT f.name AS ForeignKey,
OBJECT_NAME(f.parent_object_id) AS TableName,
COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName,
OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName,
COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName
FROM sys.foreign_keys AS f
INNER JOIN sys.foreign_key_columns AS fc
ON f.OBJECT_ID = fc.constraint_object_id
Để tạo một tập lệnh áp dụng các chỉ mục trên tất cả các khóa ngoại, bạn có thể làm như sau:
SELECT 'CREATE INDEX [IX_' + f.name + '] ON ' + OBJECT_NAME(f.parent_object_id) + '(' + COL_NAME(fc.parent_object_id, fc.parent_column_id) + ')]'
FROM sys.foreign_keys AS f
INNER JOIN sys.foreign_key_columns AS fc
ON f.OBJECT_ID = fc.constraint_object_id
http://msdn.microsoft.com/en-us/library/ms188783 .aspx