さまざまなアプリケーションから送信されたクエリには、DOPが異なります

dba.stackexchange https://dba.stackexchange.com/questions/3464

質問

複数のビューから選択し、かなり重いクエリがあります。 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接続文字列を調整する可能性があると思います。

JDBCのすべての接続パラメーターに関するMSDNの記事を次に示します。

これは、私が抱えているまったく同じ問題を抱えていた人からの別の記事です。また、解決策もありません。

役に立ちましたか?

解決

これに影響を与える2つの標準的な方法があります

  1. クエリごとのMaxDopヒント
  2. 最大並列性オプションの度合い サーバー全体

SQL Server 2008リソースガバナーといくつかのトレースフラグが影響します。 Tibcoがリソースガバナーを使用しているので、痕跡の旗になる可能性があると思います。

私が見たもう1つのオプションは、暗黙のトランザクションを設定することです。

トレースフラグがなく、暗黙のトランザクションがなく、マックスドップのヒントがない場合、クエリ そうではありません 同じ。

編集、質問の更新後

準備および/またはカーソル設定を変更できるはずです。例: http://www.streamreader.org/serverfault/questions/177391/impact-on-sql-2000-performance-of-jdbc-selectmethodcursor

他のヒント

あなたはaを作成してみることができます 計画ガイド MaxDopヒントを指定するクエリの場合。リンクされた記事は、実行中のクエリを制御できない場合の使用と、SP_CursorPrepexecクエリを制御する例を示しています。

ライセンス: CC-BY-SA帰属
所属していません dba.stackexchange
scroll top