外部キーを持つテーブルがたくさんあり、インデックスがあるものとないものがあります。すべての外部キーは、という名前FK_<name of the foreign key>
のインデックスで名前が付けられますIX_<name of the foreign key>
。
外部キーの列のカーディナリティを考慮して、インデックスを作成する(または作成しない)ためのいくつかの良い方法はありますか?これはT-SQLコマンドとしてスクリプト化できますか?
外部キーを持つテーブルがたくさんあり、インデックスがあるものとないものがあります。すべての外部キーは、という名前FK_<name of the foreign key>
のインデックスで名前が付けられますIX_<name of the foreign key>
。
外部キーの列のカーディナリティを考慮して、インデックスを作成する(または作成しない)ためのいくつかの良い方法はありますか?これはT-SQLコマンドとしてスクリプト化できますか?
それらが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