query does not return after increasing range in 'between' clause

From: Dennis <dennisr(at)visi(dot)com>
To: "pgsql-general(at)postgresql(dot)org" <pgsql-general(at)postgresql(dot)org>
Subject: query does not return after increasing range in 'between' clause
Date: 2014-08-27 18:02:28
Message-ID: E283F669-5717-4CD5-A716-9F6809D285CA@visi.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Hi, I am having bad luck with a query that should return zero rows but actually never returns (completes execution.)

When I broaden the ‘between’ clause range from " period.orderno between 1447 and 1450" to " period.orderno between 1446 and 1450” the query plan changes and the query never completes execution at least in the 30 to 40 minutes I have been willing to wait. I do see the query cost going up in the new plan but it seems odd that the execution time seems to increase to infinity.

Query plan that returns in milli-seconds, with "period.orderno between 1447 and 1450”:
QUERY PLAN
---------------------------------------------------------------------------------------------------------------
Nested Loop (cost=1.43..37834893.51 rows=560 width=221)
-> Nested Loop (cost=1.15..37834721.59 rows=509 width=186)
-> Nested Loop (cost=0.72..37672374.44 rows=343460 width=57)
-> Index Scan using pk_nb_periods on nb_periods period (cost=0.15..21.37 rows=3 width=8)
Filter: ((orderno >= 1447) AND (orderno <= 1450))
-> Index Scan using wk_f_p_idx on t_week_f fact (cost=0.57..12555979.74 rows=147129 width=49)
Index Cond: (period = period.period)
Filter: (store_tag = ANY ('{100,4480}'::integer[]))
-> Index Scan using pk_nb_products on nb_products product (cost=0.42..0.46 rows=1 width=144)
Index Cond: ((product_key)::text = (fact.upc)::text)
Filter: (((lvl)::text = 'UPC'::text) AND (category_tag = 'GRBYFD'::bpchar))
-> Index Scan using pk_nb_markets on nb_markets market (cost=0.28..0.30 rows=1 width=35)
Index Cond: (mkt_tag = fact.store_tag)
(13 rows)

Query plan that never completes with "period.orderno between 1446 and 1450”:
QUERY PLAN
----------------------------------------------------------------------------------------------------------------
Nested Loop (cost=1.43..40275248.26 rows=746 width=221)
-> Nested Loop (cost=1.15..40275019.26 rows=678 width=186)
Join Filter: (fact.period = period.period)
-> Nested Loop (cost=1.00..40271833.48 rows=52740 width=178)
-> Index Scan using prd_cat_idx on nb_products product (cost=0.42..4447.78 rows=900 width=144)
Index Cond: (category_tag = 'GRBYFD'::bpchar)
Filter: ((lvl)::text = 'UPC'::text)
-> Index Scan using wk_f_u_idx on t_week_f fact (cost=0.57..44736.52 rows=502 width=49)
Index Cond: ((upc)::text = (product.product_key)::text)
Filter: (store_tag = ANY ('{100,4480}'::integer[]))
-> Materialize (cost=0.15..21.39 rows=4 width=8)
-> Index Scan using pk_nb_periods on nb_periods period (cost=0.15..21.37 rows=4 width=8)
Filter: ((orderno >= 1446) AND (orderno <= 1450))
-> Index Scan using pk_nb_markets on nb_markets market (cost=0.28..0.30 rows=1 width=35)
Index Cond: (mkt_tag = fact.store_tag)
(15 rows)

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Adrian Klaver 2014-08-27 18:18:09 Re: query does not return after increasing range in 'between' clause
Previous Message David G Johnston 2014-08-27 17:23:22 Re: Deletion