SQL Serverの場合、最終的な実行計画には多くの要因があります。基本的なレベルでは、統計は非常に大きな役割を果たしますが、データに基づいていますが、必ずしもすべてのデータに基づいているわけではありません。統計も常に最新ではありません。インデックスを作成または再構築する場合、統計はデータのFULL/100%サンプルに基づいている必要があります。ただし、自動統計更新のサンプルレートは100%よりもはるかに低いので、実際にデータの大部分を代表しない範囲をサンプリングすることは可能です。操作の推定行数も、表の行数またはフィルター操作の統計に基づく役割を果たす。したがって、古くなった(または不完全な)統計では、テーブル内のいくつかの行がインデックスを完全に無視するようになる可能性があるので、オプティマイザが最適ではないプランを選択する可能性があります。別の回答で述べたように、よりユニークな(すなわち、選択的)、データがより有用であることを示す。ただし、統計情報を保持する唯一の保証された列は、索引の先頭(または「左端」または「最初」)の列であることに注意してください。 SQL Serverは、他の列の統計情報を収集することもできます(一部のIndexesではなく、AutoCreateStatistics DBオプションが設定されている場合はデフォルトで設定されます)。
また、外部キーの存在は、これらのフィールドがクエリ内にあるときにオプティマイザを助けることができます。
しかし、質問で考慮されていない領域の1つは、クエリ自体の領域です。わずかに変更されたが同じ結果を返すクエリは、根本的に異なる実行計画を持つことができます。理想的には、(操作がある読んで心に留めておく、今
WHERE DATEADD(DAY, -1, field) < GETDATE()
:など、
LIKE '%' + field
または関数内のフィールドをラップ:使用してインデックスの使用を無効にすることも可能です)を使用すると、索引を高速化することができますが、DML操作(INSERT、UPDATEおよびDELETE)は、索引のメンテナンスが必要になるほど遅くなります(CPUおよびディスクI/Oが増えます)。
最後に、コストの「推定された」CPUなどの値は、必ずしも信頼されるとは限りません。より良いテストは、以下を行うことです。
SET STATISTICS IO ON
run query
SET STATISTICS IO OFF
「論理読み取り」に焦点を当てます。論理読み込みを減らすと、パフォーマンスが向上するはずです。
最終的には、インデックスとクエリ自体の両方に関してパフォーマンスチューニングを行うために、プロダクションにある程度近いデータセットが必要です。
特にデータベースはありますか?彼らはすべて物事を全く同じように扱うわけではありません。 –