アプリ版:「スタンプのみでお礼する」機能のリリースについて

処理が終わったり終わらなかったり。

SQLServerの統計情報や実行計画に関してその挙動の
理解に苦しんでいます。
もし解決のヒントがいただけたらと思い、質問しました。
よろしくお願いします。

使用しているOSはWindows2008Server x64です。
DBはSQLServer2008 EEを用いています。
サーバー機はXeon 2.93MHz QuadCore×2です。
メモリは32GBで、うち20GBをSQLServerに使用させています。
javaのアプリケーション内でJDBCでDBアクセスしています。

処理は
(1)3000万件程度のデータをメモリ上へ
(2)計算処理してファイルへ
(3)ファイルをDBへBulkInsert
というもので、Javaのほうで8並列処理を行わせています。

この処理がどういうわけか(1)のところで動いたりとまったりします。
(止まっているというよりは、極端に遅くなっているというのが
正確かもしれません。)
経験則としては
・大量データを流す前に少量データで疎通を取った場合にとまる。
・大量データ→大量データではとまらない。
・止まったあと、一度スレッドをとめて統計情報を更新後、再度処理を流すと止まらない
というようなものがあります。

利用状況モニタを見ると、 I/O Completion というものが非常に長い時間処理しており、
なぜ状況によってこの処理時間が延びるのかがわかりません。

また、統計情報を更新したといっても、実行計画が殆ど変わらない場合もあります。
ただ、実行計画が殆ど変わらない(xmlにしてDIFFを取ると1行しか変わらない。)場合も、
再実行すると正常時間で処理が終了します。

何かお気づきの点がありましたら、是非ご教授ください。

A 回答 (1件)

SQLのコミットは、どの時点で実行しているのでしょうか? 質問を読むとコミットの可能性は低いですが・・・当たり前過ぎて見過ごすこともあるので参考までに。



1個のSQLでコミットすると非常に遅くなるので、ある程度纏まった時点でコミットしていると思いますが、コミットまでのSQLが大量に貯まるとコミットした時点で大量にメモリを消費して・・・という可能性もあるのでご確認しては?
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。
SQLServerの設定はAutoCommintでした。
TempDBにSelectしたデータを読み込むとき、ご指摘のような事象が起こっていないのか確認してみます。

お礼日時:2010/02/24 14:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!