- ベストアンサー
問い合わせ結果が得られるまでに時間がかかる?
延べ4000支店×12ヶ月間における商品1と商品2の売り上げを 150ある会社別に合計値を集計するSQL文で、phpMyAdmin経由で 問い合わせ結果が得られるまでに思ったより時間がかかる(体感時間で 2~4分くらい?)のですがそういうものなのでしょうか? ざっくり書くと次のようなもので、 SELECT KAISYACODE, SUM(URIAGE1) AS U1, SUM(URIAGE2) AS U2 FROM MYTABLE GROUP BY KAISYACODE 会社マスター、支店マスター、売り上げテーブルの3つから成り ます。 集計結果イメージ KAISYACODE U1 U2 ------------------------------- 001 1556,782 343,451 002 2556,989 432,343 003 1456,799 349,213 :(略) 150 3556,980 433,343
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>ひとつ気づいたのは、150社ごとにSQLを5種類を150回発行(ループ)しているので、プログラム側の効率的問題かもしれません。 ということは、150*5で750クエリ。 それは多すぎですね^^; SQL文を見直すか、設計を見直すべきでしょう。 下手にSQL発行するよりはPHP側で回したほうが早い場合もあります。
その他の回答 (2)
- yambejp
- ベストアンサー率51% (3827/7415)
商品ごとにフィールドを持っているように見えますが これはさすがに非効率かとおもいます。 商品が追加変更されるたびにフィールドを増減させて いてはSQLとしてのデータアクセシビリティも よろしくありません。 それが速度の低下につながっているかどうかは わかりかねますが、通常データの持ち方であれば 以下のような形式の方がよくないでしょうか? 「会社コード,商品コード,売上」のような持ち方 をして、「SELECT `会社コード`,`商品コード`, SUM(`売上`) AS `売上` FROM `MYTABLE` GROUP BY `会社コード`,`商品コード`」 縦会社コード、横商品コードの表にするのは 受け取った側のミドルウェア、たとえばPHPなどで 処理すればよいかと思います
お礼
すみません、書き方が悪かったですが、商品ごとに もっているわけではありません。 でも、考え方は大変勉強になりました。 一応、専門業者さんが設計開発したPHP+MySQLシステムなので そのあたりは大丈夫なのですが、取り出す側(わたし) が悪いのだとは思います。 ともかく、貴重なアドバイスありがとうございました。
- moon_night
- ベストアンサー率32% (598/1831)
時間がかかりすぎのような・・・ データは何件くらい入っているのでしょうか? また、INDEXは使用していますか? ついでに、サーバの性能はどの程度でしょうか? SQL文はシンプルなので、サーバの処理能力の問題も考えられます。
お礼
貴重なアドバイスありがとうございました。 データの件数は、会社数マスター150、支店マスター4000、 売り上げテーブル12×4000程度です。 INDEXってMySQL4でつかえるのですか? (とはいえ私はINDEXという用語のみで使い方を知りませんが・・) サーバーは大手電話系会社の月2-3万程度のものです。 ひとつ気づいたのは、150社ごとにSQLを5種類を150回発行(ループ)しているので、プログラム側の効率的問題かもしれません。
お礼
御礼遅くなりました。失礼しました。 やっぱそうですよね・・・ 貴重なコメントありがとうございました。