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


9

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

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

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

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

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

サーバーは24ギガバイトのメモリを備えた16コアです。CPUやメモリの負荷が大きくなることはありません。

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

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

編集する

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

クエリのCompileTimeがクエリ実行時間の99%を占めていることを確認できます。StatementOptmEarlyAbortReasonがある「タイムアウト」理由はMemoryLimitExceededされ、そのデータベースのコピーを持つ我々のテストデータベースに、。


1
ディスクからキャッシュにデータを読み込むだけでなく、プランのコンパイルに時間がかかると確信していますか?
Mark Storey-Smith、

1
コンパイル時間はプランXML自体に表示されます。それは間違いなくコンパイル時間であり、他のものではないことを確認しましたか?統計の同期自動更新など。SQL Serverのどのバージョンを使用していますか?
マーティンスミス

@ MarkStorey-Smithよくわかりません。そのプランのキャッシュのみをクリアするDBCC FREEPROCCACHEを実行すると、次のクエリ時間が最大3分かかることは知っています。
Mongus Pong、

@MartinSmithああ、とても便利です。ビジュアルクエリプランを使用しています。はい、コンパイル時間はおおよそクエリの実行時間全体です。SQL Server 2008 R2を使用しています。
Mongus Pong、

@MongusPong- 本番データベースの統計のみのコピー作成する場合、テスト環境でこれを再現できますか?計画は何を言いStatementOptmEarlyAbortReasonますか?
マーティン・スミス

回答:


9

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

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

単に走る

exec sp_updatestats

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.