27個のウェアハウステーブルに結合されたSQLSELECT
ステートメントがあります。元のステートメントは毎日1時間以上かかっていたので、最適化することにしました。
いくつかのインデックスを作成しましたが、それでも時間がかかりました。主な原因を見つけるために、selectステートメントをSELECT COUNT(*)
に変更し、すべての結合にコメントを付け、結合のコメントを1つずつ解除し始めました。
いくつかのNOLOCKS
以上のインデックスを使用して、実行時間を65分から6分に短縮できましたが、列をCOUNT(*)
ではなくSELECT
ステートメントに追加し直しました。 、70分以上かかり始めました。
それで、誰かがこれが起こっている理由と私がそれを解決する方法を説明できますか?.
P.S.:selectステートメントでcaseステートメントやその他の計算が行われていません。その純粋に選択する列。 (約150列)
選択した列のカバーインデックスがないと思います。 Count(*)の実行速度が速いため、おそらく、結合またはwhere句にインデックスが付けられた列があります。選択した列を追加し直すとすぐに、クエリエンジンはテーブル全体を再度スキャンする必要があります。可能であれば、選択した列をインクルード列としてインデックスに追加します(これがms sqlサーバーかどうかはわかりません)。