none
PC起動後や一定時間経過後の読み出しについて RRS feed

  • 質問

  • 初めて投稿させて頂きます。
    よろしくお願いします。

    下記バイナリデータを収集、表示するアプリケーションがあるのですが、
    PC起動後のデータベースからの初回読み出し時や、一定時間経過した後の読み出しで
    読み出しに時間がかかり、フリーズしたような状態になってしまいます。
    2回目以降はキャッシュが効いているからか、時間はかからないのですが、
    初回読み込みに時間がかかり、データをデータベースに格納するアプリケーションに
    影響を与えてしまって、困っています。

    SQL Profilerで監視すると、Read量(回数)が
    初回 100回程度でまれに10000回以上
    2回目以降 2~3回となっております。

    テーブルの設計が悪いや調査した方がいい項目などアドバイスなどを頂けないでしょうか?

    ~仕様~
    ○概要
      2分ごとに常時100msec毎に収集したデータを30秒間程度収集して、そのデータを
      データベースにアイテム数分テーブルへ格納するアプリケーションと、
      そのデータを表示するアプリケーションがあります。

    ○DBへの格納(保存アプリケーション)
      IDリストテーブルに1レコード書き込み、
      データテーブルにアイテム数分テーブルに対して1レコード
      書き込みます。

    ○DBへの読み出し(表示アプリケーション)
      データテーブルのID1とアイテムIDから
      開始時間,開始ミリ秒をキーにバイナリデータを、アイテム数分読み出しています。


    ○テーブル構成
        IDリストテーブル
            テーブル数        1テーブル
            テーブル構成    ID1(int),開始時間(datetime),開始ミリ秒(int),ID2(char32),アイテムID
                            主キー(クラスタ化インデックス)は、ID1(int),開始時間(datetime),開始ミリ秒の3つ
           
           
        データテーブル
            テーブル名称   ID1_アイテムID     ※上記IDリストに紐づき、アイテムIDごとにテーブルが作成されます。
            テーブル数     ID1×アイテムID個
            テーブル構成   開始時間(datetime),開始ミリ秒(int),バイナリデータ(varBinary(Max))
                           バイナリデータは8000byteを超えます。100msec毎の約30秒間分のデータです。
                            主キー(クラスタ化インデックス)は、開始時間,開始ミリ秒の2つ
            アイテムIDは、ID1(int)に対して、25個程度作成されます。

    ○環境:OS  : Windows XP Professional SP3
          SQL : SQL Server 2008 WorkgroupEdition
          CPU : Core(TM)2Duo E8400 (3.00GHz)
          Mem : 4Gbyte

     

    2011年6月3日 12:09

回答

  • こんにちは。

    >テーブルのレコードに、8000byteを超えるバイナリデータ(varBinary(Max))を扱うことや
    >インデックスなどによって、起動時一回目のアクセスに時間がかかるなど考えられますでしょうか?

    前に少し書いたかもしれませんが、SQL Serverはバッファ管理を行っているため
    2回目以降がパフォーマンスが良くなることは普通です。

    ■バッファ管理
    http://msdn.microsoft.com/ja-jp/library/aa337525.aspx

    「起動時一回目が特別に遅い」と考えるべきでは無く、
    起動時一回目が本来の姿で、2回目以降がバッファ管理のおかげで早いと考えるべきでしょう。

    ですので、一旦2回目以降のことは忘れて、1回目のパフォーマンスをどうやって上げるかに集中すべきかなと思います。

    で、パフォーマンスの上げ方なのですが、
    ここでアプリケーション側の呼び出し方とか、何件必要なのかとか等、詳しい要件・仕様をすべて明らかにするのは不可能ですので、
    がんばって試行錯誤されるしかないかなと思います。

    たとえば、
    ■パフォーマンスの監視とチューニング
    http://msdn.microsoft.com/ja-jp/library/ms189081.aspx

    などが参考になります。
    また、クエリの実行プランとにらめっこしながら、少しずつチューニングをやるしか無いと思います。

    以上、あんまりお役に立てず申し訳ないですが、私の考えは以上です。
    (ひょっとしたら他の人が、「これかも」って投稿くださるかもしれません。)
    • 回答としてマーク Ak-key 2011年6月16日 12:20
    2011年6月7日 11:04

すべての返信

  • こんにちは。

    >SQL Profilerで監視すると、Read量(回数)が
    >初回 100回程度でまれに10000回以上
    >2回目以降 2~3回となっております。

    これは、SQL Profilerの「Reads」列の数値のことですか?
    それともRPC:Completedが100~10000回トレースされるということですか?
    2011年6月4日 4:24
  • ご返答ありがとうございます。

    SQL Profilerの「Reads」列の数値のことです。

    2011年6月5日 23:49
  • こんにちは。

    Readsはページ読み取り I/Oの回数で、初回100~、2回目移行2~3というのは正常の範囲だと思います。
    それより、動的にたくさんのテーブルを作成しているイメージ
    (仕様の概要は頑張って読み解こうとしたのですがIDとかアイテムIDとかたくさんあってよくわかりませんでした、すみません。)
    ですが、こちらの方に問題がある気がします。

    オブジェクトが動的に増えていくとそれだけ探すのにも時間がかかりますから、
    テーブル名をキーとするのではなく
    「ID1」「アイテムID」をキーとするようなテーブルを作った方が良いと思います。

    以上、参考になりましたら幸いです。
    2011年6月6日 14:12
  • こんにちは。

    仕様が分かりづらくて申し訳ありません。
    データテーブルの方は最大40テーブル程度で、初回に決めてしまえば動的に
    増えていくことはありません。
    上記40テーブルに2分毎に30秒分のデータを1レコードづつ追加するイメージになります。

    テーブルのレコードに、8000byteを超えるバイナリデータ(varBinary(Max))を扱うことや
    インデックスなどによって、起動時一回目のアクセスに時間がかかるなど考えられますでしょうか?

    2011年6月7日 0:07
  • こんにちは。

    >テーブルのレコードに、8000byteを超えるバイナリデータ(varBinary(Max))を扱うことや
    >インデックスなどによって、起動時一回目のアクセスに時間がかかるなど考えられますでしょうか?

    前に少し書いたかもしれませんが、SQL Serverはバッファ管理を行っているため
    2回目以降がパフォーマンスが良くなることは普通です。

    ■バッファ管理
    http://msdn.microsoft.com/ja-jp/library/aa337525.aspx

    「起動時一回目が特別に遅い」と考えるべきでは無く、
    起動時一回目が本来の姿で、2回目以降がバッファ管理のおかげで早いと考えるべきでしょう。

    ですので、一旦2回目以降のことは忘れて、1回目のパフォーマンスをどうやって上げるかに集中すべきかなと思います。

    で、パフォーマンスの上げ方なのですが、
    ここでアプリケーション側の呼び出し方とか、何件必要なのかとか等、詳しい要件・仕様をすべて明らかにするのは不可能ですので、
    がんばって試行錯誤されるしかないかなと思います。

    たとえば、
    ■パフォーマンスの監視とチューニング
    http://msdn.microsoft.com/ja-jp/library/ms189081.aspx

    などが参考になります。
    また、クエリの実行プランとにらめっこしながら、少しずつチューニングをやるしか無いと思います。

    以上、あんまりお役に立てず申し訳ないですが、私の考えは以上です。
    (ひょっとしたら他の人が、「これかも」って投稿くださるかもしれません。)
    • 回答としてマーク Ak-key 2011年6月16日 12:20
    2011年6月7日 11:04
  • こんにちは。

    >また、クエリの実行プランとにらめっこしながら、少しずつチューニングをやるしか無いと思います。
     
    そうですよね。
    今までご回答いただきありがとうございました。
    いろいろとやりながら解決していきたいと思います。
    2011年6月7日 23:55