22

外部キーを持つテーブルがたくさんあり、インデックスがあるものとないものがあります。すべての外部キーは、という名前FK_<name of the foreign key>のインデックスで名前が付けられますIX_<name of the foreign key>

外部キーの列のカーディナリティを考慮して、インデックスを作成する(または作成しない)ためのいくつかの良い方法はありますか?これはT-SQLコマンドとしてスクリプト化できますか?

4

2 に答える 2

46

それらがT-SQLスクリプトを介して作成されたのか、Designerを介して作成されたのかは関係ありません。あなたの質問は少し曖昧なので、すべての外部キーにインデックスを付けても大丈夫かどうかも尋ねているかどうかはわかりません。ただし、そうする場合は、クエリで頻繁に参照される列にインデックスを作成する必要があります。パフォーマンスを向上させるには、次の操作を実行できます。

  • データベースチューニングウィザードを実行すると、改善の概要が提供され、インデックスが推奨されます。

  • すべての外部キーにインデックスを付け、実行プランを実行します(クエリの実行速度が速いか遅いかを確認するため)。

を介してインデックスを作成するにはT-SQL

CREATE INDEX IX_INDEX_NAME
ON Table (FieldName); 

すべての外部キーのリストを取得するには:

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

すべての外部キーにインデックスを適用するスクリプトを生成するには、次のようにします。

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

于 2012-05-24T10:20:44.350 に答える