none
SQLServer2000からSQLServer2005へ RRS feed

  • 質問

  • お世話になっております。


    最近、あるシステムのサーバ環境を変更しました。

    それにより、24時間稼動している常駐プログラム
    (フォルダ内を監視しファイルを内容をDBに登録する)が
    あるのですが、データの登録に時間がかかり
    (1000行近くのデータ登録に1時間以上かかる)
    大変困っております。


    以前の環境は(Windows Server 2003 + SQLServer2000)で、
    移行後の環境は(Windows Server 2003 + SQLServer2005
    互換性レベル SQLServer2000 80)と
    なっております。


    データが正常に取り込まれなかった為、手動にてINSERT文を
    作成し(1,800レコード分)データを登録しようとしたところ
    1時間以上応答がありませんでした。


    自社にも同様の環境があり、INSERT文を実行したところ
    2,3秒にて完了したためSQLServerの設定に何か問題が
    あると考えております。


    ちなみに移行前のサーバからバックアップファイルを作成し、
    移行先のサーバへ復元しました。

    2010年6月3日 1:22

回答

  • ブロッキングの可能性はないでしょうか。(Serializableのトランザクションがinsertをブロックしている等)ブロッキングのモニター方法はsys.dm_tran_locksの利用やsp_blocker_pss80があります。

    http://support.microsoft.com/kb/271509/ja

    http://msdn.microsoft.com/ja-jp/library/ms190345.aspx

     

    • 回答の候補に設定 山本春海 2010年6月15日 8:24
    • 回答としてマーク 山本春海 2010年6月23日 2:25
    2010年6月3日 4:25
    モデレータ
  • 通常、 Insert クエリの場合、ブロッキングの対象になりにくいのですが、Insert の対象となっているテーブルが、他のプロセスにより、テーブルロックを取られた場合などは、ブロッキングが発生する可能性があると思います。

    あと、sp_blocker_pss80 の中でも採取されているのですが、Insert の時間が掛かっているとき、sys.sysprocesses  の waittime、lastwaittype などを確認すると良いかもしれません。

    sys.sysprocesses (Transact-SQL)

    • 回答の候補に設定 山本春海 2010年6月15日 8:24
    • 回答としてマーク 山本春海 2010年6月23日 2:25
    2010年6月3日 6:45

すべての返信

  • 1800レコードではなく、1レコードの場合は、数ミリ秒で正常にインサートされますでしょうか。
    2010年6月3日 3:05
  • NOBTA様

    返信ありがとうございます。

     

    1レコードの場合は数ミリ秒でインサートされたことを確認しました。

    2010年6月3日 3:19
  • 補足なんですが

    SQLServerを再起動すると、正常に取り込まれます。

    tempdbあたりも疑っているのですが、なかなか糸口が見つかりません。

    (SQLServerログにはエラーらしきログはありませんでした。)

     

    2010年6月3日 4:08
  • どのような Insert 文を実行されておりますでしょうか。

    2010年6月3日 4:24
  • ブロッキングの可能性はないでしょうか。(Serializableのトランザクションがinsertをブロックしている等)ブロッキングのモニター方法はsys.dm_tran_locksの利用やsp_blocker_pss80があります。

    http://support.microsoft.com/kb/271509/ja

    http://msdn.microsoft.com/ja-jp/library/ms190345.aspx

     

    • 回答の候補に設定 山本春海 2010年6月15日 8:24
    • 回答としてマーク 山本春海 2010年6月23日 2:25
    2010年6月3日 4:25
    モデレータ
  • INSERT文は以下のようなものになります。

     

    INSERT INTO [テーブル名] ( [項目1], [項目2], [項目3] ... [項目48] )VALUES( [項目1], [項目2], [項目3] ... [項目48] )

     

    常駐バッチでも手動においても、上記のようなINSERT文を実行いたしました。

    少ない数のINSERTなら問題ないようですが、これが18000レコード続くと結果がなかなか返ってきません。

    2010年6月3日 4:58
  • ElanLilac様

     

    返信ありがとうございます。

    ブロッキングの可能性考えていなかった為、調査しようかと思います。

     

    ただSQLServer2000の環境で正常に動作していた(約8年間)システムが

    SQLServer2005にして正常に動作しないのはなぜか釈然としませんね。。。

    2010年6月3日 5:11
  • 通常、 Insert クエリの場合、ブロッキングの対象になりにくいのですが、Insert の対象となっているテーブルが、他のプロセスにより、テーブルロックを取られた場合などは、ブロッキングが発生する可能性があると思います。

    あと、sp_blocker_pss80 の中でも採取されているのですが、Insert の時間が掛かっているとき、sys.sysprocesses  の waittime、lastwaittype などを確認すると良いかもしれません。

    sys.sysprocesses (Transact-SQL)

    • 回答の候補に設定 山本春海 2010年6月15日 8:24
    • 回答としてマーク 山本春海 2010年6月23日 2:25
    2010年6月3日 6:45
  • NOBTA様

     

    返信ありがとうございます。

    これから本番環境に対し、トレースログを仕込み採取しようかと思っておりました。

    合わせて確認させて頂きます。

    2010年6月3日 9:12
  • こんちには、shino555 さん。

    その後いかがでしょうか。

    ElanLilac さん、NOBTA さんからいただいたアドバイスありがとうございます。
    ElanLilac さん、NOBTA さんからのアドバイスが有効な情報かと思われますので、勝手ながら私のほうで回答としてマークさせていただきました。
    いただいた情報の中で、参考になったものや、有効な情報には、回答としてマークすることで、今後このスレッドを参照される方の目にもとまりやすくなるかと思います。

    お時間があるときにでも、その後の状況を是非お知らせくださいね。
    ご連絡お待ちしていますね。それでは。
                                        
    マイクロソフト株式会社 フォーラム オペレーター 山本 春海

    2010年6月23日 2:19
  • 状況の報告が送れて申し訳ございません。

    現時点では、いまだ根本的な解決には至っていません。

     

    又、調査したところテーブルロックが発生はしていなかった模様です。

    ただしクエリを流した際にCPU及びメモリの使用率が100%になっていた為、

    環境による問題の可能性があると考えられます。

    現状では、プログラムを作り変え同事象が発生しないよう対処致しました。

     

    根本的な原因はつかめていないのですが、回避する方向で進めました。

    みなさんありがとうございます。

    2010年6月30日 2:13