質問: @p__linq__0 ``` このSQLで実行プランを見たところ、主キー(id)しかインデックスがない状態ではどちらもClustered Index Scan 100%でした。 以下のようにIncludeオプションでインデックスを作成した状態では、query1はIndex Seek50%、キー参照50%で、query2はIndex Seek100%でした。 `CREATE INDEX IX_member ON member (age) INCLUDE(name)` 100回ぐらい処理時間を計測したところ、平均して30ミリ秒程度ですがquery2の方が遅かったです。 既存プログラムでは、query1の使い方がほとんどなので、そうなるとインデックスはあんまり効果ないということになるのでしょうか? Includeオプションで他のカラムをすべて指定しておくという使い方はアリなのでしょうか? こちらの利用も初めてですみません。引き続きよろしくお願い致します。
回答: Entity Frameworkは魔法でもなんでもなく、指示に従ってSQL文を生成したうえで、生成したSQL文をDBエンジンに実行させます。生成したSQL文はデータベース操作のログ記録と受信で確認することができます。 DBエンジン側は受け取ったSQL文を解析し、インデックスが使えるかを判断します。 ですので、 * Entity FrameworkがどのようなSQL文を生成したのか * DBエンジンがSQL文をどのように解釈したのか の2段階に分けて判断してください。 > > 100回ぐらい処理時間を計測したところ、平均して30ミリ秒程度ですがquery2の方が遅かったです。 > > 既存プログラムでは、query1の使い方がほとんどなので、そうなるとインデックスはあんまり効果ないということになるのでしょうか? > > > 相対値として30ms程度とのことですが、絶対値はいかがでしょうか? もともと短時間で済む処理であれば、インデックスの効果が薄くなってしまうのかもしれません。また、このクエリはプログラム全体の処理の中で有意のあるウェイトを占める処理なのでしょうか? 80:20の法則という言葉もあるように、十分に高速な部分をさらに高速化しても全体としては得るものがありません。