[pgsql-jp: 37438] Re: SQLの実行速度について

Yoshio Kano kano @ arcadia21.com
2006年 8月 21日 (月) 19:09:56 JST


賀内様

加納です。
ありがとうございます。
実際にやってみると少し早くなりました。

DISTINCT はどのデータが返るか分からない・・・という先入観が
あったもので使用を避けていました。
マニュアルによると集合の最初のデータを返すんですね。

頂いたSQLも視野に入れつつ、もう少し四苦八苦してみます。。。



> 賀内です。
> 
> 早くなるかどうか分かりませんが、DISTINCT ON を使ってみてはいかがでしょうか。
> 
> SELECT DISTINCT ON (itemid) itemid,* FROM history ORDER BY itemid,id DESC;
> 
> ※下のデータの「ID」が商品IDで、SQL文中の「itemid」ですよね?
>  SQL文中の「id」はレコードIDのことですね?
>  それで、新しいデータほどレコードIDが大きいと。
> 
> > SELECT ... FROM
> > (SELECT MAX(id) AS id,itemid FROM history GROUP BY itemid ) AS t1
> > LEFT JOIN history AS t2 ON (t2.id = t1.id)
> 
> > |NO	|ID	|STATUS	|OPTION TEXT	|CANGE_DATE	|
> > | 1	|a2	|stats1	|...........	|2006-07-05	|
> > | 2	|b3	|stats4	|...........	|2006-06-22	|
> > | 3	|a2	|stats2	|...........	|2006-07-25	|
> > | 4	|a2	|stats3	|...........	|2006-08-12	|
> > | 5	|b3	|stats2	|...........	|2006-08-16	|
> > | 6	|c4	|stats3	|...........	|2006-07-10	|
> 
> 
> 
> On Mon, 21 Aug 2006 15:05:44 +0900
> Yoshio Kano <kano @ arcadia21.com> wrote:
> 
> > こんにちわ。
> > 加納と申します。
> > SQLの実行速度の問題で悩んでおります。
> > 
> > ●実行環境(テストサーバ)
> > postgres 7.3.9
> > perl 5.6.1
> > apache 1.3.33
> > 
> > 下記に示すように、商品の状態履歴テーブルがあります。
> > 状態履歴テーブルは、商品ID/状態/コメント/変更日付をどんどん蓄積
> > しています。(※実際には他のデータも格納しています。)
> > この状態履歴テーブルには40万件ほどのデータがあります。
> > また、レコードID、商品IDと変更日付にインデックスを設定しています。
> > 
> > これらの状態履歴テーブルの各商品IDの最新のデータを取得したいと
> > 思っているのですが、もっと早くデータを取得できないものかと悩んで
> > おります。
> > 今使用しているSQLは以下の通りです。
> > 
> > ●SQL
> > ● → 状態履歴テーブル = history
> > ● → EXPLAIN ANALYZE 10回平均 で11,740 msec
> > SELECT ... FROM
> > (SELECT MAX(id) AS id,itemid FROM history GROUP BY itemid ) AS t1
> > LEFT JOIN history AS t2 ON (t2.id = t1.id)
> > 
> > 
> > そもそも、このテーブルの設計自体に問題があるのかもしれませんが、
> > どなたか良い知恵がありましたらよろしくお願いいたします。
> > 
> > 
> > ●状態履歴テーブル(40万件/IDとCHANGE_DATEにインデックス)
> > |NO	|ID	|STATUS	|OPTION TEXT	|CANGE_DATE	|
> > | 1	|a2	|stats1	|...........	|2006-07-05	|
> > | 2	|b3	|stats4	|...........	|2006-06-22	|
> > | 3	|a2	|stats2	|...........	|2006-07-25	|
> > | 4	|a2	|stats3	|...........	|2006-08-12	|
> > | 5	|b3	|stats2	|...........	|2006-08-16	|
> > | 6	|c4	|stats3	|...........	|2006-07-10	|
> > 
> >  ↓
> > 
> > ●抽出結果
> > |NO	|ID	|STATUS	|OPTION TEXT	|CANGE_DATE	|
> > | 1	|a2	|stats3	|...........	|2006-08-12	|
> > | 2	|b3	|stats2	|...........	|2006-08-16	|
> > | 3	|c4	|stats3	|...........	|2006-07-10	|




pgsql-jp メーリングリストの案内