Hi, On 2019-06-18 06:11:54 -0700, AminPG Jaffer wrote: > We recently upgraded one of the instances from 9.6.3 to 9.6.12 and seeing > following issue that occurs for few cases. > > We recently upgraded one of the instances from 9.6.3 to 9.6.12 and seeing > following issue that occurs for few cases. > > I have tried running analyze on the table with different values from 1000 - > 5000 but it doesn't seem to help the issue. There is some skew in a_id > but the combination index i_tc_adid_tid btree (a_id, id) makes the index > unique as it includes primary key. > > Is there an explanation why it is using incorrect index? > > SQL: > SELECT count(*) FROM tc WHERE ((tc.a_id = $1)) AND ((tc.m_id = $2)) AND > ((tc.ag_id is not null)) AND ((tc.id in ($3))) AND ((tc.pt in ($4, $5, $6))) > > Indexes on the table: > i_tc_adid_tid btree (a_id, id) > pk_id PRIMARY KEY, btree (id) > i_agi_tc_tcn btree (ag_id, tname) ---> index that gets used Are those indexes used for other queries? Any chance they've been recently created? SELECT indexrelid::regclass, xmin, indcheckxmin, indisvalid, indisready, indislive, txid_current(), txid_current_snapshot() FROM pg_index WHERE indrelid = 'tc'::regclass; might tell us. On 2019-06-18 17:07:55 -0400, Tom Lane wrote: > I'm pretty baffled. I tried to duplicate the problem with some dummy > data (as attached) and could not. In my hands, it wants to use the > i_tc_adid_tid index, or if I drop that then the pkey index, and any > other possible plan is orders of magnitude more expensive than those. > Another far-fetched theory is that the theoretically-better indexes > are so badly bloated as to discourage the planner from using them. > You could eliminate that one by checking the index sizes with "\di+". > > Are you perhaps running with non-default values for any planner cost > parameters? Or it's not a stock build of Postgres? > > If you could find a way to adjust the attached example so that it > produces the same misbehavior you see with live data, that would be > very interesting ... Amin, might be worth to see what the query plan is if you disable that index. I assume it's too big to quickly drop (based on the ? Something like: BEGIN; LOCK tc; UPDATE pg_index SET indisvalid = false WHERE indexrelid = 'name_of_index'::regclass AND indisvalid; EXPLAIN yourquery; ROLLBACK; might allow to test that without actually dropping the index. But that of course requires superuser access. Greetings, Andres Freund