[pgsql-jp: 29516] Re: INSERTの速度UP に関して

Tadashi Kanbayashi Tadashi.Kanbayashi @ toppan.co.jp
2003年 3月 31日 (月) 12:04:32 JST


杉田様

お疲れさまです。
ありがとうございます。
KANです。

以下の件ですが、動作しました。
結果も変わりませんでした。
処理時間は相変わらず遅く、約75分かかりました。

しかし、文法的に正しいのでしょうか?
どうもJOINの書き方がプランナを混乱させている気がするのですが?。

とりあえず、JOINを使わないようにすると約3分で結果が返ってくるので、
JOINを使わないSQLに書き換えようと思いますが、それでも約3分かかります。
INDEXをはること以外で、何か策はないでしょうか。

テーブル結合の処理の高速化としては、
(1)プランナ任せ(コストベース)
(2)INDEXの追加
(3)JOINで結合手順を強制的にいじる(ルールベース)
で行ない、それでもだめそうな場合は、SQLを分割(処理をわける)することが必要
でしょうか。

どんなSQLでも、高速化の限界はあると思いますが、そのときの目安(閾値)が
あれば教えていただきたく。

ちなみに、結合しているテーブルの規模は以下の通りです。
t_cidinf:6990
t_contopen:50679
t_cpinf:130
t_cpshare:248
t_miminf:249
t_payinf:102
t_tidinf:295
t_paycid:3271
t_paycidgroup:6986
t_hanroinf:21
t_shimebi:80
t_bill_detail:150548

教えてください。
お願いします。

----- Original Message -----
送信者 : <sugita @ sra.co.jp>
宛先 : <pgsql-jp @ ml.postgresql.jp>
送信日時 : 2003年3月28日 18:15
件名 : [pgsql-jp: 29495] Re: INSERTの速度UP に関して


>   杉田です。
>
> From: "Tadashi Kanbayashi" <Tadashi.Kanbayashi @ toppan.co.jp>
> Subject: [pgsql-jp: 29494] Re: INSERTの速度UP に関して
> Date: Fri, 28 Mar 2003 17:47:44 +0900
>
> ;;; 下記の件で、エラーにならなかったSQLです。
> ;;; (長いので、FROM句以外はいくらか削除してあります。)
> ;;;
> ;;; お願いします。
> ;;;
> ;;; SELECT
> ;;; t_cidinf.cid
> ;;;  FROM
> ;;;    (
> ;;;     (
> ;;;      (
> ;;;       (
> ;;;        (
> ;;;         (
> ;;;          (t_cidinf INNER JOIN t_contopen
> ;;;           ON t_cidinf.cid = t_contopen.cid
> ;;;          ) INNER JOIN t_cpinf
> ;;;           ON t_contopen.cpcd = t_cpinf.cpcd
> ;;;         ) INNER JOIN t_cpshare
> ;;;          ON t_cpinf.cpcd = t_cpshare.cpcd
> ;;;        ) INNER JOIN t_miminf
> ;;;         ON t_cpshare.mid = t_miminf.mid
> ;;;       ) INNER JOIN t_payinf
> ;;;        ON t_cpinf.payinfcd = t_payinf.payinfcd
> ;;;      ) INNER JOIN t_tidinf
> ;;;       ON (t_cidinf.tid = t_tidinf.tid)
> ;;;        AND (t_miminf.mid = t_tidinf.mid)
> ;;;     ) INNER JOIN t_paycid
> ;;;      ON t_miminf.mid = t_paycid.mid
> ;;;    ) INNER JOIN t_paycidgroup
> ;;;     ON (t_paycidgroup.cid = t_cidinf.cid)
> ;;;      AND (t_paycid.paycid = t_paycidgroup.paycid)
> ;;;    INNER JOIN t_hanroinf
> ;;;     ON (t_hanroinf.pid = t_contopen.pid)
> ;;;    INNER JOIN t_shimebi
> ;;;     ON (t_tidinf.kakincd = t_shimebi.kakincd)
> ;;;      AND (t_contopen.pid = t_shimebi.pid)
> ;;;    LEFT JOIN t_bill_detail
> ;;;     ON t_contopen.pid = t_bill_detail.pid
> ;;;      AND t_bill_detail.mid = t_miminf.mid
> ;;;      AND t_bill_detail.tid = t_tidinf.tid
> ;;;      AND t_bill_detail.cid = t_cidinf.cid
> ;;;      AND t_bill_detail.billterm = '200303'
> ;;;   WHERE
> ;;;    t_contopen.pid = 'ZZZ';
>
>   この形ならば、最初の方の INNER の () 群を取り去っても動きませんか?
>
>
> Kenji Sugita
>
>
>
>
>

---
T.Kan





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