SQLSrever2005は今日も働く。MTAでがんがん走って動かして、SQLを処理する。まぁこうやってそのシステムプログラムは総じて500万件ほどのデータを決められたテーブルへと入れていくわけなんですが、いざ、想定MAXデータを本番想定サーバーで実行すると……とまる(^^;、PorFilerで観察してみると、デッドロック?っぽく、ずーーーーーっと処理が進まない。
はて?とSQLServer Management Studio で「管理」>利用状況モニタをあけてみると
問題のクエリには 「CXPACKET」の文字
ちょいちょいと調べると
http://sqldev.net/articles/wait_types.htm
These waittypes are all involved in parallel query execution. These waittypes indicate that the SPID is waiting on a parallel process to complete or start.
むむ?と実行プランを早速見てみる。すると確かに、このクエリは内部でパラレルに走るらしい。そこで、さらにパラレルクエリについて、調べる
http://msdn2.microsoft.com/ja-jp/library/ms178065.aspx
ようするに、パラレル処理(並列処理)ってのは、SQLServerがこれは時間がかかりそうって思ったときに勝手に動くものらしい。でもこいつが「時間かかるかも」と判断する「しきい値」はサーバーオプションで変えられるらしいので
http://msdn2.microsoft.com/ja-jp/library/ms188603.aspx
てなカンジでパラメータをいじってみた。……けど、相変わらず、止まる。モニタではCXPACKETでずっとsuspend。もうどうしようもねー、ちきしょー!。キレぎみにさらにlive先生にググレカス(おいこら)をお願いしてみたら
http://support.microsoft.com/kb/915918/ja
こんなんでましたけど~~♪
・ サーバーは、 SQL Server 2005 Service Pack 1(SP1)または SQL Server 2005 の元のリリース バージョンを実行しています。
→うん、2005だよ、これ。
・ サーバーには、複数のプロセッサがあります。
→うん、CPUいっぱいあるし
・ クエリが並列実行できるように、 SQL Server が構成されます。
→当然ジャン、それがやりたいんだもん
・ デッドロックされたステートメントは、並列で複数のプロセッサで 1 つ実行されます。
→うん、並列で動いてるよ。実行プランで確認したさ
・ 通常このデッドロックされたステートメントの実行プランが並べ替える操作またはハッシュ結合操作を実行します。
→うおーーーっ!ソートしてますぜ!ハッシュしてますぜダンナ!
・ スキャン操作または並べ替えるこの操作またはこのハッシュ結合操作シーク操作がロックを待機します。
→えええええええ!
・ このロックは、別のセッションでの別の更新ステートメントによって保持されるロックで適合しません。
→別にそれはええんやけどさー
・ この別のセッションは、並列で動作していない可能性があります。
→それもいいーってば、それでっ!
次のすべての条件に該当する場合、この検出されなかったデッドロックの問題が発生のみします。
ホットフィクスよこせ(死) orz
そんな今日のちょいめも
TableからTableへのINSERTの処理順番(実行プランでみた流れ)
本体にINSERT
移送先テーブルのクラスターインデックスにISERT
移送先テーブルの非クラスターインデックスにINSERT
SQLServer2005のサーバーオプションのlightweight pooling
は
CLRストアドプロシジャを使っている場合には
使 え な い
(inトリビア風味)
つか、CLRって動いてる世界がSQLServerから制御できているようで実は別スレッド処理なんじゃねーの?と思うの。で、こいつが動くとSQLServerがスレッド管理しきれないんじゃないだろーか? 伝書鳩飛ばしたら帰ってくるまで何やってるかなんてどーでもいー、つか、わかんねーし、みたいに。なんて思ってみたりなんかしちゃったりなんかして♪
いぢょ
業務連絡:土曜某所の某ログをほしい人、片桐に連絡くださいw(お父さんとか玉子さまとかw)