"Andrew Janian" <ajanian@xxxxxxxxxxxxx> writes: > QUERY PLAN > Nested Loop IN Join (cost=0.00..34047.29 rows=1 width=526) > -> Index Scan using mfi_log_time on mb_fix_message (cost=0.00..22231.31 rows=2539 width=526) > Index Cond: ((msg_log_time > '2004-06-01 00:00:00'::timestamp without time zone) AND (msg_log_time < '2004-06-01 23:59:59.999'::timestamp without time zone)) > Filter: (((msg_message_type)::text = '8'::text) AND (((mb_raw_text)::text ~~ '%39=1%'::text) OR ((mb_raw_text)::text ~~ '%39=2%'::text))) > -> Index Scan using mfi_client_ordid on mb_fix_message (cost=0.00..445.56 rows=1 width=18) > Index Cond: (("outer".msg_client_order_id)::text = (mb_fix_message.msg_client_order_id)::text) > Filter: ((msg_log_time >= '2004-06-01 00:00:00'::timestamp without time zone) AND (msg_log_time < '2004-06-01 13:30:00'::timestamp without time zone) AND ((msg_message_type)::text = 'D'::text) OR ((msg_message_type)::text = 'G'::text)) AND ((mb_ord_type)::text = '1'::text)) > While running, this query produces 100% iowait usage on its processor and takes a ungodly amount of time (about an hour). This plan looks fairly reasonable if the rowcount estimates are accurate. Have you ANALYZEd the table lately? You might need to bump up the statistics target for the msg_log_time column to improve the quality of the estimates. It would be useful to see EXPLAIN ANALYZE results too (yes I know it'll take you an hour to get them...) regards, tom lane