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

sugita @ sra.co.jp sugita @ sra.co.jp
2003年 3月 27日 (木) 20:04:29 JST


  杉田です。

From: "Tadashi Kanbayashi" <Tadashi.Kanbayashi @ toppan.co.jp>
Subject: [pgsql-jp: 29489] Re: INSERTの速度UP に関して
Date: Thu, 27 Mar 2003 19:43:00 +0900

;;; すいません。INSERTにではなく、
;;; INSERT文中のSELECT文が遅いようでした。
;;; そこで、一番時間がかかるケースで、
;;; SELECT文のみを抽出してEXPLAIN ANALYZEで実行計画を取得してみました。
;;; 
;;; SQLと、実行計画をそのままお伝えするのが良いと思いましたが、
;;; 長すぎるので、かなり雑な情報ですが、ポイントになりそうな情報を
;;; まずはお伝えします(これでは、わからないという話しかもしれませんがすいませ
;;; ん)。
;;; 
;;; (1)INDEX SCANが選ばれているか
;;;  →選ばれているようです(時間は要してません)。
;;; (2)Merge Joinの回数
;;;  →5回(約4000ミリ秒のものが4回と、約3800000ミリ秒のものが1回)ありま
;;; す。
;;; (3)Hash Joinの回数
;;;  →3回(約5000ミリ秒のものが3回)あります。

  4000 や 3800000 は、EXPLAIN ANALYZE の cost の値のことだと思います。これらの数値は、
秒でなくて、ディスクページアクセスに換算したコストです。

  "PostgreSQL ユーザガイド" の "Chapter 11. 性能に関するヒント" に、説明があり
ます。

;;; 以上より、テーブルを6個結合しているのですが、どうも、結合に関するとこで
;;; 時間がかかっているようです。
;;; 
;;; テーブル結合は、
;;; FROM(((((((INNER JOIN・・・・) INNER JOIN ・・・) INNER JOIN
;;;  ・・・) INNER JOIN・・・) INNER JOIN・・・) INNER JOIN・・・)
;;;     INNER JOIN・・・
;;; な感じで、複雑です(私が作ったものでないので余計に?です)。。。

  このようにすると PostgreSQL では、書いた通りに実行されます (実行させるように
できます)。こちらは、"PostgreSQL ユーザガイド" の "Chapter 11.3 明示的な JOIN 
でプランナを制御する" に説明があります。"実行させるように" しようとしたことが
合っていれば大丈夫ですが、食い違うと却って遅くなる場合もあります。

  JOIN を使わない書き方にして、プランナの最適化に任せてみるのを試してみたくな
ります。


Kenji Sugita                                      


     
     



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