特定の実際のクエリプランを再実行する


7

特定のクエリの実際のクエリプランをキャプチャしました。

その後、いくつかの変更(統計の更新を含む)を行い、その特定のクエリを再実行しました。現在、実際のクエリプランは異なります(これは理にかなっています)。

クエリの実行速度が大幅に向上しました。他の変更(IO設定、VM設定の変更、SQLインスタンスの再起動など)もパフォーマンスの向上を引き起こしている可能性があるため、新しい実行プランがこれと関係があるかどうか知りたいです。これをテストするためにもう一度クエリを実行し、SQL Serverに古い実行プランを強制的に使用させます。

質問:ユーザー指定の実行プランでクエリを再実行する方法、またはそのようなプランから直接クエリを実行する方法はありますか?

これが私がこれを理解しようとしたものです:

つまり、これは可能ですか?もしそうなら:どのように?


私は以下を使用して、私の開発システムとテストシステムで長時間実行されているクエリと短時間実行されているクエリをチェックしました。その後、既存のプラン、バッファ、キャッシュをクリアし、トレースをオンにしてクエリを実行します。dbcc drop / free関数を使用して、セッション、キャッシュ、バッファなどをクリアし、トレースをオフまたはオフに設定します。無関係ですが役立つのは、テーブル内のデータの扱いを確認することです。S2K12を使用していることがわかりましたので、これらの参照は一致する必要があります。SQL Serverの以前のバージョンでは、動作が異なる場合があります。お役に立てれば。DBCC FREESYSTEMCACHE、DROPCLEANBUFFERS、Trace On、show_statisticsなど
Ray Porrata '26

回答:


10

はい。

USE PLANヒントが必要です。

あなたXMLは最初の計画からあなたを供給します。

SELECT *
FROM T
OPTION (USE PLAN N'<?xml version="1.0" encoding="utf-16"?> ....')

計画が完全に同じになることは保証されませんが(たとえば、計算スカラー演算子は移動できるなど)、かなり近いと思われます。


ありがとう、まさに私が求めていたもの。(残念ながら、「オプティマイザがUSE PLANヒントで指定されたプランの検索中に許可された操作の数を超えたため、クエリプランが見つかりませんでした。」と思いますが、それは私が対処する別の問題だと思います。)
Jeroen

@Jeroen-うーん。そのための回避策があるかどうかはわかりません。たぶん、その制限を増やすトレースフラグがいくつかあるかもしれませんが、ある場合はわかりません!
マーティン・スミス

問題ありません。いずれにせよ、あなたの助けをありがとう:今日何か新しいことを学びました!:D
Jeroen 2014

@Jeroen-おそらくオプティマイザのタイムアウト無効にする文書化されていないTF 8780 ?それが望ましい効果をもたらすかどうかはわかりません。
マーティン・スミス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.