Thread
-
get_actual_variable_range vs idx_scan/idx_tup_fetch, again
Marko Tiikkaja <marko@joh.to> — 2018-03-05T14:54:53Z
(Sorry for not continuing the thread in 54418D75.2000303@joh.to , but I don't have the original email anymore.) So I'm in the same pickle again. According to pg_stat_user_indexes an index is being used all the time. However, it's only being used by mergejoinscansel() to compare these two plans: => explain analyze select * from orders child join orders parent on (parent.orderid = child.parentorderid) where child.orderid = 1161771612; QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------ Nested Loop (cost=0.00..15.56 rows=1 width=2910) (actual time=0.401..0.402 rows=1 loops=1) -> Index Scan using orders_pkey on orders child (cost=0.00..7.78 rows=1 width=1455) (actual time=0.367..0.367 rows=1 loops=1) Index Cond: (orderid = 1161771612) -> Index Scan using orders_pkey on orders parent (cost=0.00..7.78 rows=1 width=1455) (actual time=0.027..0.028 rows=1 loops=1) Index Cond: (orderid = child.parentorderid) Total runtime: 0.852 ms (6 rows) => set enable_nestloop to false; set enable_hashjoin to false; SET SET => explain select * from orders child join orders parent on (parent.orderid = child.parentorderid) where child.orderid = 1161771612; QUERY PLAN --------------------------------------------------------------------------------------------------------- Merge Join (cost=1804805.57..97084775.33 rows=1 width=2910) Merge Cond: (parent.orderid = child.parentorderid) -> Index Scan using orders_pkey on orders parent (cost=0.00..96776686.40 rows=123232448 width=1455) -> Sort (cost=7.79..7.79 rows=1 width=1455) Sort Key: child.parentorderid -> Index Scan using orders_pkey on orders child (cost=0.00..7.78 rows=1 width=1455) Index Cond: (orderid = 1161771612) (7 rows) The merge join plan is pretty obviously shit and the fact that the planner got a better estimate for it by peeking through the index had zero effect. I think it would be really important to have a way to turn off get_actual_variable_range() for a specific index during runtime. Would a C level hook be acceptable for this? .m -
Re: get_actual_variable_range vs idx_scan/idx_tup_fetch, again
Tom Lane <tgl@sss.pgh.pa.us> — 2018-03-05T15:08:57Z
Marko Tiikkaja <marko@joh.to> writes: > So I'm in the same pickle again. According to pg_stat_user_indexes an > index is being used all the time. However, it's only being used by > mergejoinscansel() to compare these two plans: If it's not being used otherwise, could you drop it? > I think it would be really important to have a way to turn off > get_actual_variable_range() for a specific index during runtime. Would a C > level hook be acceptable for this? You haven't really made a case for why you (or anyone else) should care. As long as the planner makes the right choice, having investigated a wrong choice doesn't seem like a bug to me. regards, tom lane
-
Re: get_actual_variable_range vs idx_scan/idx_tup_fetch, again
Marko Tiikkaja <marko@joh.to> — 2018-03-05T15:12:59Z
On Mon, Mar 5, 2018 at 5:08 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote: > Marko Tiikkaja <marko@joh.to> writes: > > So I'm in the same pickle again. According to pg_stat_user_indexes an > > index is being used all the time. However, it's only being used by > > mergejoinscansel() to compare these two plans: > > If it's not being used otherwise, could you drop it? > Yes. I want to drop it, as I think it's useless, but it's hard to be 100% sure. > > I think it would be really important to have a way to turn off > > get_actual_variable_range() for a specific index during runtime. Would > a C > > level hook be acceptable for this? > > You haven't really made a case for why you (or anyone else) should care. > As long as the planner makes the right choice, having investigated a wrong > choice doesn't seem like a bug to me. > Because I'm certain the planner would make the right choice even without the index, and I want it gone. .m