人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PostgreSQLに関する質問です。テーブルAとテーブルBがあり、テーブルAに47800件、テーブルBに232879件レコードが入っています。
この時
explain analyze select a.name, b.code from table_a a left outer join table_b b on a.key = b.key limit 100;
とすると、
Limit (cost=0.00..1282.63 rows=100 width=126) (actual time=0.874..16107.458 rows=100 loops=1)
-> Nested Loop Left Join (cost=0.00..713884715.50 rows=55658081 width=126) (actual time=0.871..16107.138 rows=100 loops=1)
Join Filter: ((a.key)::text = (b.key)::text)
-> Seq Scan on table_a a (cost=0.00..2351.00 rows=47800 width=126) (actual time=0.008..0.082 rows=36 loops=1)
-> Seq Scan on talbe_b b (cost=0.00..12023.79 rows=232879 width=96) (actual time=0.015..275.220 rows=138650 loops=36)
という結果になりました。
この「rows=47800」は47800回分の結合を行っているという事でしょうか?
そうであればパフォーマンス向上の手段はありませんか?

●質問者: snaa1d_1
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:00 Key LOOP name ON
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● kn1967
●100ポイント ベストアンサー

table_a は rows=36 loops=1 とありますので

ループは1回(1回だからループとは言わないけど便宜上)

36レコードを利用。


talbe_b は rows=138650 loops=36 とありますので

ループは36回(table_aのrows分だけ実施されたという事)

138650 レコードを利用。


まず、

rows=55658081の部分が気になりますのでwhere条件を付加する等して

table_a の対象レコードを100以下に出来ないかを検討してみてください。


また、Index Scan ではなく Seq Scan ということは

indexが利用されていない(もしくは存在しない)模様ですが

まず table_b の key に indexを作成してEXPLAINを実施し

さらに table_a の key にも indexを作成して比較してみてください。

index はすでに付けてあるということであれば

keyフィールドを対象にしたwhere条件を付加してみてください。


URL必須という事なので、ひとまずマニュアルを・・・。

http://www.postgresql.jp/document/pg835doc/html/using-explain.ht...

◎質問者からの返答

ありがとうございます。

色々と私自身が誤解しているところもあったようです。。

長くなりそうなのでコメントにかきますね。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ