none
SQLデータの取得 RRS feed

  • 質問

  •  

     皆様、またご質問をさせてください。

     

     

    現在VB2008とSQLServer2000の環境でデータ参照のアプリケーションを開発をしております。

     

    ADO.NETだったり、SQLのクエリ分などは問題なく記述できるのですが、

    SQL文で計算をさせるデータ量が多いため自分で設定をしたタイムアウト時間を超えてしまいます。

    (タイムアウト時間は300秒に設定をしております)

     

    タイムアウト時間の設定を変えれば問題なく動作するのですが、その間他のユーザーが

    SQLの処理を行えなくなってしまうため、何か良い方法がないか悩んでおります。

     

    恐らく自分で記述しているSQL文がパフォーマンスが悪い書き方なんだと思います(サブクエリを使用して

    かなり入れ子状態になっております)

     

    今考えているのは取得するデータの元テーブルをクライアント機のSQLExpressなどに

    書き込んだあと、クライアント機で計算をさせるくらいの回避策しか思い浮かびません。

     

    クエリ分一回発行で結果を取得しているため、パフォーマンスが悪いとは思うのですが、

    何か分散させて結果をだすようなテクニックなどは存在するのでしょうか?

     

    どなたかアドバイスをいただけると助かります。

     

     

     

    2008年8月8日 2:16

回答

  • この情報だけでは、ちょっと対応策を考えるのは難しいかも知れません。

    SQL Serverのチューニングである程度改善できる問題かも知れませんし、要件次第では別のアプローチも考えられます。

    チューニングしていく場合、どの処理にコストがかかっているのかを調査して、インデックスを設定したり、サブクエリを変更したりと地道な作業を行う必要があります。

    計算の内容として、ある程度の条件が限定できるものであれば、別のテーブルに定期的に集計を行うジョブを実行するということもありだと思います。

    また、データ量はどのくらいなのか?どの程度の計算をさせているのか?といった情報や、テーブルの構成や現象を確認できるサンプル的なクエリなども提示できるより具体的なアドバイスがでてくると思います。

    2008年8月8日 3:11
  • 大量のデータをサマリするとどうしてもレスポンスに時間がかかってしまいます。

    月次で入庫および出庫の集計を行ったテーブルを作成して、負荷を軽減していくほうが簡単だと思います。クライアント側のマシンスペックが高性能であるなら、データベースキャッシュを利用することで高速化を図れるとは思いますけれど...。

    最終販売日や最終入荷日も日付のMAX値を取得して保持しておけば良いだけですよね?
    ERPパッケージのテーブルのデータを変更することできないにしても、triggerを追加するくらいならできる状況なのでしょうか?もし可能であれば、最終販売日や最終入荷日をtriggerで別テーブルに更新してしまうことも可能です。

    私なら、このような方向でアプローチする方向で設計を考えてみますが、データベースアーキテクトを極めた技術者であるなら、もっとスマートな解決方法を持っているかも知れません。内容的にも、SQL Serverのフォーラムのほうが、的確なアドバイスが得られるのではないかと思いますよ。
    2008年8月8日 9:29
  • ちなみにどのようなSQLを書かれているのでしょうか?

    在庫数は入庫数の合計から出庫数の合計を引けば出ますし、最終販売日や最終入荷日もmax関数で求められるのではないかと思います。

    2008年8月11日 9:53
    モデレータ

すべての返信

  • この情報だけでは、ちょっと対応策を考えるのは難しいかも知れません。

    SQL Serverのチューニングである程度改善できる問題かも知れませんし、要件次第では別のアプローチも考えられます。

    チューニングしていく場合、どの処理にコストがかかっているのかを調査して、インデックスを設定したり、サブクエリを変更したりと地道な作業を行う必要があります。

    計算の内容として、ある程度の条件が限定できるものであれば、別のテーブルに定期的に集計を行うジョブを実行するということもありだと思います。

    また、データ量はどのくらいなのか?どの程度の計算をさせているのか?といった情報や、テーブルの構成や現象を確認できるサンプル的なクエリなども提示できるより具体的なアドバイスがでてくると思います。

    2008年8月8日 3:11
  •  

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

    さまざまな事情があり詳しくは書けないのですが、
    とあるソース非公開のERPで直接データベースに
    アクション(登録や修正、削除など)ができない(正確に申し上げますと
    、サポートなどの問題で既存のテーブルはいじりたくないが

    新たに集計テーブルなどを作るのは検討中)状態
    で、参照のみのアプリケーションを社内で開発しております。

     

    下記のようなテーブルがあります。

    商品入出庫テーブル
    取引日付 取引タイプ 商品コード 倉庫コード 入庫数 出庫数


    テーブル例
    取引日付  取引タイプ 商品コード 倉庫コード 入庫数 出庫数
    2008/08/08 売上    AAA     100         0           1
    2008/08/08 入荷    AAA     100       10            0
    2008/08/08 返品    AAA     100         1            0
    2008/08/08 移動    AAA     100         0            1
    2008/08/08 移動    AAA     200         1            0


    このテーブルにはすべてのやり取りが記録されているみたいなのですが
    在庫数を算出する場合、月間、年間などの集計テーブルがあるはずなのですが、
    使用しているERPではそのようなテーブルがみあたりません。

     

    このテーブルには200万件ほどレコードが登録されているのですが、

    何月何日の在庫数を算出する場合でも最初のレコードから

    計算を行わなくては在庫数もでません。(ちなみにリアルタイムの

    在庫数のテーブルだけはありました)

     

    このテーブルから

    下記の要件の情報をつくりたいのですが。

     

    期間を指定し、

    期間開始日と終了日の両方の日に在庫が存在し、

    なおかつ一つも売れていない商品

     

    結果例

    2008/07/01 ~ 2008/08/08の期間指定を行って

     

    倉庫コード  商品コード  現在在庫数 最終販売日 最終入荷日

    100                CCC                  10       2008/04/01     2008/04/01

     

    このような結果を出力するために

    在庫も最終販売日、最終入荷日もサブクエリで取得を

    行って結果を出力しています。

     

    在庫数などは集計テーブルを作成するバッチ処理などを行えばよいのでしょうが、

    リアルタイムな情報を見たい時に最終販売日や最終入荷日などはバッチが

    つくれません。

    そのため200万件のレコードの計算を複数行わなくてはいけなくて

    パフォーマンスが悪いSQL分しか作れていない状態です。

     

     

    説明がうまくできなくて申し訳ありません。

    2008年8月8日 8:15
  • 大量のデータをサマリするとどうしてもレスポンスに時間がかかってしまいます。

    月次で入庫および出庫の集計を行ったテーブルを作成して、負荷を軽減していくほうが簡単だと思います。クライアント側のマシンスペックが高性能であるなら、データベースキャッシュを利用することで高速化を図れるとは思いますけれど...。

    最終販売日や最終入荷日も日付のMAX値を取得して保持しておけば良いだけですよね?
    ERPパッケージのテーブルのデータを変更することできないにしても、triggerを追加するくらいならできる状況なのでしょうか?もし可能であれば、最終販売日や最終入荷日をtriggerで別テーブルに更新してしまうことも可能です。

    私なら、このような方向でアプローチする方向で設計を考えてみますが、データベースアーキテクトを極めた技術者であるなら、もっとスマートな解決方法を持っているかも知れません。内容的にも、SQL Serverのフォーラムのほうが、的確なアドバイスが得られるのではないかと思いますよ。
    2008年8月8日 9:29
  •  

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

     

    Triggerを使用。。

    検討させていただきます。

     

    一度SQL Serverフォーラムにも質問をさせていただきます。

     

    ご親切にお答えいただきましてありがとうございました。

     

    2008年8月11日 8:57
  • ちなみにどのようなSQLを書かれているのでしょうか?

    在庫数は入庫数の合計から出庫数の合計を引けば出ますし、最終販売日や最終入荷日もmax関数で求められるのではないかと思います。

    2008年8月11日 9:53
    モデレータ
  • こんにちは。中川俊輔 です。

     

    GX999さん、trapemiyaさん、回答ありがとうございます。

     

    さとさとさん、フォーラムのご利用ありがとうございます。

    有用な情報と思われたため、

    GX999さん、trapemiyaさんの回答へ回答済みチェックをつけさせていただきました。

     

    回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
    有用な情報と思われる回答があった場合は、なるべく回答済みボタンを押してチェックを付けてください。

    さとさとさんはチェックを解除することもできますので、ご確認ください。

     

    それでは!

    2008年8月25日 9:17