[pgsql-jp: 25029] optimizerの動作
ARAI Shunichi
arai @ mellowtone.org
2002年 3月 1日 (金) 17:27:46 JST
新井です。
ちょっと細かいことで恐縮なのですが、気になってることがあります。
table foo (id1 integer, id2 integer)
table bar (id2 integer, updated timestamp)
というようなテーブルがあります。(全て索引付き)
SELECT updated FROM foo,bar WHERE id1=? AND foo.id2=bar.id2
ORDER BY updated DESC LIMIT 100;
そこで、上のようなクエリを発行します。
すると、foo.id1 = ?に一致するレコードが1件しかない場合と2件以上の
場合で、クエリプランが大きく変わります。
1件しかない場合、
Limit (cost=2779.06..2779.06 rows=100 width=377)
-> Sort (cost=2779.06..2779.06 rows=1130 width=377)
-> Nested Loop (cost=0.00..2721.75 rows=1130 width=377)
-> Seq Scan on foo ...
-> Index Scan using bar_id2_idx on bar ...
2件以上の場合、
Limit (cost=0.00..1278.44 rows=100 width=377)
-> Nested Loop (cost=0.00..63872.07 rows=4996 width=377)
-> Index Scan Backward using bar_updated_idx on bar ...
-> Seq Scan on foo (cost=0.00..1.60 rows=6 width=4)
となります。
とうぜん全件をソートしない後者のほうがずっと高速です。
実際にかなりの速度差が出てしまい、仕方なくenable_sortをオフにして
使っています。(すると、全て後者のようになり、高速に動作します。)
これは私のテーブル設計やクエリの立て方に問題があるのでしょうか?
それともオプティマイザの仕様であって、enable_sortをオフにして使えば
良いのでしょうか。
バージョンはpostgres 7.2です。
-----
新井 俊一
arai @ mellowtone.org
http://www.mellowtone.org/
pgsql-jp メーリングリストの案内