> On 18/01/2023 18:03 CET Dirschel, Steve <steve.dirschel@xxxxxxxxxxxxxxxxxx> wrote: > > The plan changes: > > Sort (cost=9382.94..9382.97 rows=12 width=169) > Sort Key: lmq1.priority DESC, lmq1.request_time > -> Bitmap Heap Scan on lm_queue lmq1 (cost=4572.59..9382.73 rows=12 width=169) > Recheck Cond: ((client_name)::text = 'WLCASES'::text) > Filter: ((NOT (alternatives: SubPlan 1 or hashed SubPlan 2)) OR (((process_type)::text = ANY ('{UNLOCK,"UNLOCK RERUN"}'::text[])) AND (lm_id = '0'::numeric) AND ((host_name)::text = 'WLLOADB'::text) AND (hold_flag = 'Y'::bpchar) AND ((host_name)::text = 'WLLOADB'::text) AND (status_code = '1'::numeric))) > -> Bitmap Index Scan on ix_lm_chl (cost=0.00..4572.58 rows=25 width=0) > Index Cond: ((client_name)::text = 'WLCASES'::text) > SubPlan 1 > -> Bitmap Heap Scan on lm_queue lmq2 (cost=164.44..188.42 rows=1 width=0) > Recheck Cond: ((lmq1.collection_name)::text = (collection_name)::text) > Filter: ((lm_id <> '0'::numeric) AND ((process_type)::text <> 'EXTRACT'::text)) > -> Bitmap Index Scan on ix_lm_cc (cost=0.00..164.44 rows=6 width=0) > Index Cond: ((collection_name)::text = (lmq1.collection_name)::text) > SubPlan 2 > -> Seq Scan on lm_queue lmq2_1 (cost=0.00..124999.49 rows=25 width=32) > Filter: ((lm_id <> '0'::numeric) AND ((process_type)::text <> 'EXTRACT'::text)) > > In the original plan above I believe the query drives off index ix_lm_chl > applying both client_name = WLCASES and host_name = WLLOADB to the index cond. > In the plan directly above I believe it also drives off index ix_lm_chl but it > is only applying client_name = WLCASES to the index cond. > > If AND’s are applied first then why wouldn’t the modified query apply both > client_name = WLCASES and host_name = WLLOADB to the index cond? Is it because > those are moved below the OR condition? Yes because those two conditions are combined with OR and that's handled by the bitmap scans in your second execution plan. See also: https://www.postgresql.org/docs/14/indexes-bitmap-scans.html -- Erik