さまざまなアプリケーションから送信されたクエリには、DOPが異なります
-
16-10-2019 - |
質問
複数のビューから選択し、かなり重いクエリがあります。 Management Studioを使用してこのクエリを実行すると、16のCPUのほとんどにわたって並列処理を使用し、10秒以内に完了します。ただし、SpotFire(TIBCOの製品)から実行すると、1 CPUのみを使用しているため、完了するのに時間がかかります。
クエリのヒントを使用している場合、管理スタジオで問題を再現することができます オプション(MaxDop 1).
私はそれがSpotfireの問題かもしれないと思っていましたが、それは接続にMicrosoft JDBCドライバーを使用しており、並列性に関する接続特性は見られません。 Profilerを使用して、SpotfireとManagement Studioのクエリが正確に見えることを確認しました。 。同じ。唯一の違いは、並列実行です。
なぜこれが起こるのかについての洞察を提供できますか?
!解決した! [すこし
SQLプロファイラーのトレースを再表示しましたが、クエリは実際に同じであることがわかりましたが、実行される方法は異なります。
SpotFireから:
@p1 int
@p1 = 0を設定します
@p2 int
@p2 = 0を設定します
@p7 int
@p7 = 0を設定します
exec sp_cursorprepexec@p1出力、@p2出力、null、n'select a、b、c、d from myview '、16,8193、@p7出力
@p1、 @p2、 @p7を選択します
管理スタジオから:
myviewからa、b、c、dを選択します
次に、2つの新しいイベントをSQLプロファイラーに追加し、クエリを再生しました。
- パフォーマンス /並列性の程度
- パフォーマンス /ショープランすべて
これは、SpotFireのクエリがDOP 0(BinaryData = 0x00000000)を使用しており、管理スタジオからDOP 12(BinaryData = 0x1200000)であったことを示しています。次に、ShowPlanは、SpotFireのクエリが、データをクライアントに返す前に、ビューの結果を一時テーブルに挿入していることを示しました。
では、なぜこれを行うのですか?おそらくのためです sp_cursorprepexec 声明。しかし、なぜそれがDOPを0に低下させる必要があるのでしょうか?知らない。
「ソリューション」は、SpotFireで作業し、JDBC接続文字列を調整する可能性があると思います。
解決
これに影響を与える2つの標準的な方法があります
- クエリごとのMaxDopヒント
- 最大並列性オプションの度合い サーバー全体
SQL Server 2008リソースガバナーといくつかのトレースフラグが影響します。 Tibcoがリソースガバナーを使用しているので、痕跡の旗になる可能性があると思います。
私が見たもう1つのオプションは、暗黙のトランザクションを設定することです。
トレースフラグがなく、暗黙のトランザクションがなく、マックスドップのヒントがない場合、クエリ そうではありません 同じ。
編集、質問の更新後
準備および/またはカーソル設定を変更できるはずです。例: http://www.streamreader.org/serverfault/questions/177391/impact-on-sql-2000-performance-of-jdbc-selectmethodcursor
他のヒント
あなたはaを作成してみることができます 計画ガイド MaxDopヒントを指定するクエリの場合。リンクされた記事は、実行中のクエリを制御できない場合の使用と、SP_CursorPrepexecクエリを制御する例を示しています。