[pgsql-jp: 37480] Re: SQLの実行速度について
Sogo Ohta
ohta @ ec-one.com
2006年 8月 24日 (木) 18:31:56 JST
こんにちは。太田と申します。
手元にOracleしかないのですが
postgresでもスカラーサブクエリが使えるなら以下のような
感じではどうでしょうか?
SELECT *
FROM history t4
JOIN
(SELECT
(SELECT max(id) as id
FROM history t1
WHERE t1.item_id = t2.item_id) as id
FROM
(SELECT item_id FROM history GROUP BY item_id) t2
)
t3
ON (t4.id = t3.id)
[前提]
・idにインデックスを作成
・item_id, idに結合インデックスを作成
Yoshio Kano 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 メーリングリストの案内