web-dev-qa-db-ja.com

実行計画の計算になぜそんなに時間がかかるのですか?

お客様の1人が新しいサーバーにアップグレードしました。

特定のストアドプロシージャを初めて実行すると、実行に3分以上かかります。後続の実行は1秒未満です。

このため、最初の3分間は主に実行計画の計算に費やされていると思います。その後の実行では、キャッシュされたプランを使用して即座に実行されます。

テストデータベースでは、同じ手順の計画を計算するのに約5秒かかります。

プラン自体にひどいものは何もありません。ただし、プランはクエリの実行にかかる時間を示しており、計算自体は行わないため、関連性があるとは思いません。

サーバーは16コアで24 GBのメモリを搭載しています。 CPUやメモリの負荷が大きくなることはありません。

特定のデータベースでのみこのような遅い計算を引き起こしている可能性があるのは何ですか?

問題の原因を見つけるためにどのような手順を実行できますか?

編集

したがって、サーバーにアクセスして、クエリをSET SHOWPLAN_XML ONで実行しました。

クエリのCompileTimeがクエリ実行時間の99%を占めていることを確認できます。 StatementOptmEarlyAbortReason"TimeOut"であり、データベースのコピーを含むテストデータベースでは、理由はMemoryLimitExceededです。

9
Mongus Pong

私は自分の質問に答えるのが嫌いです。特に、解決策を見つけるために他の人から非常に多くの助けを得たので、ここに行きます。

この問題は、データベース内のいくつかの不必要な統計が原因でした。実行プランを見ると、オプティマイザはクエリから11.5 TBのデータが返されることを期待していました。実際には87kbを受け取っていました。返される期待される行と実際の行の大きな不一致は、統計が古くなっていることを示しています。

単に走る

exec sp_updatestats

すべてのテーブルの統計をデータベースに強制的に更新させます。

これにより、クエリの実行時間が3分から6秒に短縮されました。みんな勝者!

すべての助けてくれてありがとう。 :0)

9
Mongus Pong