この時
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回分の結合を行っているという事でしょうか?
そうであればパフォーマンス向上の手段はありませんか?
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...
ありがとうございます。
色々と私自身が誤解しているところもあったようです。。
長くなりそうなのでコメントにかきますね。