Sergey Spiridonov wrote: > I converted to dbmail_* by hand just yesterday also. I'm using > postgres, and for postgres explain differs:
This is for Postgres 7.4.2: > dbmail=# explain SELECT messageblk FROM dbmail_messageblks LEFT JOIN > dbmail_messages USING (physmessage_id) WHERE > dbmail_messages.message_idnr = '551047' ORDER BY messageblk_idnr; > QUERY PLAN > ------------------------------------------------------------------------------------------- > > > Sort (cost=71153.35..71246.10 rows=37101 width=758) > Sort Key: dbmail_messageblks.messageblk_idnr > -> Hash Join (cost=21564.50..36827.54 rows=37101 width=758) > Hash Cond: ("outer".physmessage_id = "inner".physmessage_id) > Filter: ("inner".message_idnr = 551047::bigint) > -> Seq Scan on dbmail_messageblks (cost=0.00..3764.01 > rows=37101 width=742) Ouch! A Seq Scan on 37000 rows? There should be an index I think? > -> Hash (cost=16381.40..16381.40 rows=702040 width=16) > -> Seq Scan on dbmail_messages (cost=0.00..16381.40 > rows=702040 width=16) > (8 rows) Sort (cost=35.95..35.97 rows=7 width=863) Sort Key: messageblks.messageblk_idnr -> Nested Loop (cost=0.00..35.85 rows=7 width=863) -> Index Scan using messages_pkey on messages (cost=0.00..4.77 rows=2 width=8) Index Cond: (message_idnr = 1::bigint) -> Index Scan using messageblks_physmessage_idx on messageblks (cost=0.00..15.50 rows=3 width=871) Index Cond: (messageblks.physmessage_id = "outer".physmessage_id) Completly different query plan. > dbmail=# explain SELECT messageblk FROM dbmail_messageblks, > dbmail_messages WHERE dbmail_messageblks.physmessage_id = > dbmail_messages.physmessage_id AND dbmail_messages.message_idnr = > '551047' ORDER BY messageblk_idnr; > QUERY PLAN > --------------------------------------------------------------------------------------------------------------------------- > > > Sort (cost=8.58..8.59 rows=1 width=750) > Sort Key: dbmail_messageblks.messageblk_idnr > -> Nested Loop (cost=0.00..8.57 rows=1 width=750) > -> Index Scan using dbmail_messages_pkey on dbmail_messages > (cost=0.00..3.08 rows=1 width=8) > Index Cond: (message_idnr = 551047::bigint) > -> Index Scan using dbmail_messageblks_physmessage_idx on > dbmail_messageblks (cost=0.00..5.45 rows=4 width=742) > Index Cond: (dbmail_messageblks.physmessage_id = > "outer".physmessage_id) > (7 rows) Sort (cost=35.95..35.97 rows=7 width=863) Sort Key: messageblks.messageblk_idnr -> Nested Loop (cost=0.00..35.85 rows=7 width=863) -> Index Scan using messages_pkey on messages (cost=0.00..4.77 rows=2 width=8) Index Cond: (message_idnr = 1::bigint) -> Index Scan using messageblks_physmessage_idx on messageblks (cost=0.00..15.50 rows=3 width=871) Index Cond: (messageblks.physmessage_id = "outer".physmessage_id) > Seems to be postgresql problem. This query is used in 3 places: > 2 times in dbmsgbuf.c and 1 time in dbsearch.c. I changed them and > till now everything works fine... Normally an explicit join is better for the query planer. Thomas -- http://www.tmueller.com for pgp key (95702B3B)