On Mon, Oct 9, 2023 at 5:48 PM Ashutosh Bapat <ashutosh.bapat....@gmail.com> wrote:
> postgres@312571=# explain (analyze, costs off) select * from pg_class > t1 where oid = 1 and oid = 2; > QUERY PLAN > --------------------------------------------------------------------------- > Result (actual time=0.002..0.003 rows=0 loops=1) > One-Time Filter: false > -> Index Scan using pg_class_oid_index on pg_class t1 (never executed) > Index Cond: (oid = '1'::oid) > Planning Time: 0.176 ms > Execution Time: 0.052 ms > (6 rows) > > You will see that the scan node was never executed. Hence there's no > execution time benefit if we remove the scan plan. Yeah, the constant-FALSE is a pseudoconstant qual and will result in a gating Result node atop the scan node. So this optimization about detecting constant-FALSE restriction clauses and marking the rel as dummy if there is one is not likely to benefit execution time. AFAICS it can help save some planning efforts, because once a base rel is marked dummy, we won't bother building access paths for it. Also a dummy input rel can save efforts when we generate paths for joinrel, see how we cope with dummy rels in populate_joinrel_with_paths(). > Where do we produce the single baserestrictinfo mentioned in the > comments? Is it before the planning proper starts? Do you mean the const-folding? It happens in the preprocessing phase, specifically in eval_const_expressions(). > get_gating_quals does what you are doing much earlier in the query > processing. Your code would just duplicate that. Hm, I don't think so. get_gating_quals is called in createplan.c, where we've selected the best path, while the optimization with my code happens much earlier, when we set size estimates for a base relation. Neither of these two is a duplicate of the other. I think the theory here is that it's always a win to mark a rel as dummy if possible as early as we can. Thanks Richard