- - PR -
ロックリソースの[BULK-OP-DB]とは?
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2005-08-03 15:29
お世話になります。質問ばかりで申し訳ありません。助けてください。
ユーザー環境において、ストアドプロシージャによる更新のパフォーマンスが 著しく落ちてしまう現象が起きております。 そこで「sp_lock」でロック情報を採取したのですが、ロックリソースに [BULK-OP-DB]、[BULK-OP-LOG]などという情報が出力されています。 以下が「sp_lock」の抜粋です。 spid,dbid,ObjId,IndId,Type,Resource,Mode,Status 21,2,0,0,DB,[BULK-OP-DB] ,S,GRANT 21,2,0,0,DB,[BULK-OP-LOG] ,S,GRANT これは、何を意味するのでしょうか? 色々と文献を検索してみましたが、適切な情報が得られませんでした。 どなたかご教授願います。 | ||||
|
投稿日時: 2005-08-03 15:49
申し訳ありません。環境の記載を忘れておりました。
<環境> ・OS:Windows2000 Server(SP3) ・DB:SQLServer 7.0(SP3) 以上、宜しくお願い致します。 | ||||
|
投稿日時: 2005-08-03 17:16
http://www.dbforums.com/archive/index.php/t-1104308.html
(英語サイトです) 参考になります? | ||||
|
投稿日時: 2005-08-03 18:01
お疲れ様です。 夏椰さんが示されているリンクにありますとおり, Rock Resource:[BULK-OP-DB] は様々な状況下で発生します。 総括として,字面の通りデータベースに対する大規模な操作に関するロックです。 今回のロックでは, 「S」 Shared ロックが取得されていますから, インデックスの作成や,BULK コマンドによるデータベースの更新が行われているのではないでしょうか? spid と dbid の情報から,どの作業がロックを取得しているのか判定できると思います。 原因によってチューニングの対応は異なります。 それと, 直前のスレッドで多くの方が議論してくださっている件に レスを返されたほうがよいと思います。 ---------- TimberLandChapel http://blogs.timberlandchapel.com/ | ||||
|
投稿日時: 2005-08-04 11:16
問題のストアドプロシージャで、「SELECT INTO」により一時テーブルを作成しております。 又、dbidから”tempdb”がロックされている事が判明しました。 今回の現象は、SQLServerログにエラーは出力されないのでしょうか? エラーコードを明確に把握したいです。 それと、現在別スレッドでも質問させてもらっています。 返信が前後して申し訳ありません。 後ほど、別スレッドの方にも返信させてもらいます。 | ||||
|
投稿日時: 2005-08-04 12:36
・SELECT INTO で一時テーブルにインサート を行った際に tempdb に [BULK-OP-DB] がかかるのは正常な動作です。 (ログの dbid が 2 だったので tempdb 周りだとは思いましたが。。。) システムのパフォーマンスダウンとは,どういった現象として発現していますか? ・他のプロセスがタイムアウトでエラーになってしまいますか? ・単純に処理が遅いだけで正常終了しますか? エラーコードを正確に把握されたいとありますが, 上記のタイムアウトになっている場合は,タイムアウトした側のプロセスのエラーコードがそのまま取得されたいものです。 一方正常終了する場合は,エラーコードという観点から情報を得ることは難しいです。 また,デッドロックなどが発生する場合には,トレース1204 をとるなどして情報を取得できる場合もあります。 (少し前にこのフォーラムでフォローアップしました 参考:http://blogs.timberlandchapel.com/blogs/timberlandchapel/archive/2005/06/28/22.aspx ) ■どのくらい大きな結果セットを SELECT INTO していますか? 一時テーブルに挿入する結果セットの大きさによっては,ある程度パフォーマンスダウンすることは仕方がありません。 どうしてもチューニングする場合は,一時テーブルの利用そのものから見直さなければならないでしょう。 何が起こっているかを把握するための例を1つ 1.次のクエリを発行して,tempdb に [BULK-OP-DB] ロックを発生させてください。 [code]----- BEGIN TRAN SELECT [Key] INTO #TestTemp FROM Test --ROLLBACK TRAN [code]----- 2.EM から[現在の利用状況] を表示させてみてください。 → タイムアウトすると思います。 3.EM が実行待ちをしている間に sp_lock を打ってください。 wait になっているプロセスが見えると思います。 [ メッセージ編集済み 編集者: TLC 編集日時 2005-08-04 12:39 ] [ メッセージ編集済み 編集者: TLC 編集日時 2005-08-04 12:40 ] | ||||
|
投稿日時: 2005-08-04 12:47
http://blogs.timberlandchapel.com/blogs/timberlandchapel/archive/2005/06/28/22.aspx
リンクが動かなかったので。 | ||||
|
投稿日時: 2005-08-04 18:58
レス有難う御座います。
以下、ご確認下さい。 >システムのパフォーマンスダウンとは,どういった現象として発現していますか? > >・他のプロセスがタイムアウトでエラーになってしまいますか? >・単純に処理が遅いだけで正常終了しますか? 単純に処理が遅いだけで、5〜6時間待てば正常終了します。 >どのくらい大きな結果セットを SELECT INTO していますか? >一時テーブルに挿入する結果セットの大きさによっては,ある程度パフォーマンスダウン >することは仕方がありません。 正確には把握できていませんが、恐らく50万レコードぐらいだと思います。 1レコードは40バイト程です。インデックスは付けておりません。 >一時テーブルに挿入する結果セットの大きさによっては,ある程度パフォーマンスダウン >することは仕方がありません。 これまで、他の処理で一時テーブルを頻繁に使用してきましたが、パフォーマンスダウンは 特に無かったように思います。 「SELECT INTO」で一時テーブルを作成する事に問題があるのでしょうか? | ||||
