私はJava1.6、JTDS 1.2.2(1.2.4を試しただけで役に立たなかった)、SQL Server 2005を使用して、ストアドプロシージャ(パラメーターなし)を実行するためのCallableStatementを作成しています。同じストアドプロシージャを実行しているJavaラッパーがSQLServerManagement Studioを使用するよりも30%遅くなっています。私はMSSQLプロファイラーを実行しましたが、2つのプロセス間のI / Oにほとんど違いがないため、クエリプランのキャッシュに関連しているとは思いません。
ストアドプロシージャは引数をとらず、データを返しません。サーバー側カーソルを使用して、テーブルにデータを入力するために必要な値を計算します。
Javaからストアドプロシージャを呼び出すと30%のオーバーヘッドがどのように追加されるかわかりません。確かに、SQLが送信され、データベースがそれを実行するのはデータベースへのパイプにすぎません。データベースがJavaを提供している可能性があります。別のクエリプランをアプリしますか?
私はMSDNフォーラムとsourceforgeJTDSフォーラムの両方に投稿しました(トピック:「DBで直接よりもJTDSで遅いストアドプロシージャ」)これがなぜ起こるのかについて誰かが何か提案があるかどうか疑問に思いました。
前もって感謝します、
-ジェームズ
(NB恐れることはありません。解決策が見つかったら、他のフォーラムで得た回答をここでまとめます)
Javaコードスニペット:
sLogger.info("Preparing call...");
stmt = mCon.prepareCall("SP_WB200_POPULATE_TABLE_limited_rows");
sLogger.info("Call prepared. Executing procedure...");
stmt.executeQuery();
sLogger.info("Procedure complete.");
SQLプロファイラーを実行しましたが、次のことがわかりました。
Javaアプリ:CPU:466,514読み取り:142,478,387書き込み:284,078期間:983,796
SSMS:CPU:466,973読み取り:142,440,401書き込み:280,244期間:769,851
(どちらもプロファイリングの前にDBCC DROPCLEANBUFFERSを実行し、両方とも正しい数の行を生成します)
だから私の結論は、彼らは両方とも同じ読み取りと書き込みを実行するということです、それは彼らがそれをしている方法が違うということです、皆さんはどう思いますか?
クエリプランはクライアントごとに大幅に異なることがわかります(Javaクライアントは、より高速なSQLクライアントにない挿入中にインデックスを更新します。また、結合の実行方法も異なります(ネストされたループとループ)。ストリームの収集、ネストされたループとインデックススキャン、argh!))。これがなぜなのか、私はまだわかりません(私がそれの底に達したときに私は再投稿します)
エピローグ
これを正しく動作させることができませんでした。JavaとMgmtスタジオクライアント間の接続プロパティ(など)を均質化してみarithabort
ました。ansi_nulls
その結果、2つの異なるクライアントは非常に類似したクエリ/実行プランを持っていました(ただし、実際のplan_idは異なります)。JDBCクライアントと管理スタジオの間だけでなく、Microsoft独自のコマンドラインクライアントであるSQLCMDの間でもパフォーマンスが異なることがわかったので、MSDN SQL Serverフォーラムに見つけたものの要約を投稿しました。また、ネットワークトラフィックなどのより急進的なものもチェックしました。また、ニヤリと言うために、ストアドプロシージャを別のストアドプロシージャ内にラップします。
問題はカーソルの実行方法のどこかにあると感じています。それはどういうわけかJavaプロセスの中断を引き起こしていましたが、他に何も実行されていないときに別のクライアントがこの異なるロック/待機動作を引き起こす必要があるのはなぜですか。同じ実行計画が実行されているのは、私のスキルを少し超えています(私はDBAではありません!)。
その結果、このようなことを無駄にするのに4日で十分だと判断したので、それを惜しみなくコーディングします(正直なところ、ストアドプロシージャは、再コーディングではなく、より増分的に再コーディングする必要がありました。 -とにかく毎週すべてのデータを計算します)、そしてこれをチョークで書き留めて体験してください。質問を開いたままにしておきます。帽子をリングに入れてくれたすべての人に感謝します。それはすべて役に立ちました。誰かがさらに何かを思いついた場合は、さらにいくつかのオプションを聞きたいです...そして誰かが見つけた場合この投稿は、独自の環境でこの動作を確認した結果です。うまくいけば、ここにいくつかのヒントがあり、自分で試してみて、私たちよりも完全に確認できることを願っています。
週末の準備ができました!
-ジェームズ