- - PR -
全件サマリーのレスポンスについて
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-06-22 19:00
お世話になっております。
例えば下記のようなテーブルでレコードが100万行程あったとします。 商品コード|商品名|金額 ---------------------------------- A000000001|商品A| 100 B000000001|商品B| 100 A000000001|商品A| 100 B000000001|商品B| 100 C000000001|商品C| 100 A000000001|商品A| 100 D000000001|商品D| 100 商品毎に全件サマリーなら下記のようなSQL文になると思うのですが、 レスポンスが悪くて困っています。 *select 商品名,sum(金額) as 合計 from table group by 商品名 where 商品コード = 'A000000001'などであれば、商品コードに インデックスを張ったりすれば良いと思うのですが、 こういう場合は、マシンパワーにゆだねるのしかないのでしょうか? それとも何か方法があるのでしょうか? ご教授下さい。よろしくお願いします。 | ||||
|
投稿日時: 2007-06-22 19:42
RDBMSによりますが、
といったインデクスをつけておけば、 インデクスをサーチするだけで処理してくれます。 | ||||
|
投稿日時: 2007-06-22 20:29
書き方が悪かったかも。
私の使用していたRDBMSでは、条件式、集合関数、order by等の 組み合わせでもインデクスを有効利用可能でした。 つるさんの使用しているRDBMSでも、インデクスを有効利用できないか 確認してみてください。 | ||||
|
投稿日時: 2007-06-25 09:21
忠犬様
返信ありがとうございます。 SQLサーバーはマイクロソフトのSQL2000です。 GroupBY句に該当する項目を全て入れたインデクスが良いのでしょうか? 例えば・・・・ select A,B,C,sum(金額) from table where 金額 <> 0 group by A,B,C と言った場合は、A,B,C,金額 でインデクスを作成 | ||||
|
投稿日時: 2007-06-25 10:58
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/createdb/cm_8_des_06_6ptj.asp
「インデックス付きビュー」も検討してみてはいかがでしょうか。 これを使用できるのは、SQLServerの2000だとEnterprise Edition またはDeveloper Edition だけのようです。2005だと全Editionで使用できるようです。 | ||||
|
投稿日時: 2007-06-25 18:42
「group by」の処理の背景で、ソートが必要になります。「group by」の指定 通り(列の順、昇降の指定)のインデクスがあれば、いくつかのRDBMSでは、 ソート抑止してくれます。 したがって、「group by A,B,C」のように指定するなら、「A,B,C」で構成 したインデクスがないと、ソート抑止できません。 さらに、「sum(金額)」でもインデクスが利用可能なように、「A,B,C,金額」 でインデクスを構成すれば、「インデクスだけでグループ毎の集計」が行なう ことが可能になります。 これは、私が長年、関係してきたRDBMSのオプティマイザでの話なので、SQL Server 2000でも期待通りになるかは、アクセス計画等を確認してみてください。 | ||||
|
投稿日時: 2007-06-25 20:40
お世話になっております。
かめたろ様 残念ながらSQL2000のスタンダードです・・・ 忠犬様 インデクスというのは、難しいですね。 色々とインデクスを張ってみたのですが、 結果変わらずが現状です。 ですが、やり始めたばかりなので、しばらく 格闘してみます。このインデクスというものに・・・ ありがとうございました! |
1