From e8be8ffaf0d627a853814ec6105d9d719b500de9 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 11 Mar 2000 23:53:41 +0000 Subject: [PATCH] Further tweaking of logic that decides when to materialize an uncorrelated subplan: do it if subplan has subplans itself, and always do it if the subplan is an indexscan. (I originally set it to materialize an indexscan only if the indexqual is fairly selective, but I dunno what I was thinking ... an unselective indexscan is still expensive ...) --- src/backend/optimizer/plan/subselect.c | 39 +++++++++++++--------------------- 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c index eea5b332cf..a5df56d920 100644 --- a/src/backend/optimizer/plan/subselect.c +++ b/src/backend/optimizer/plan/subselect.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/subselect.c,v 1.29 2000/03/02 04:08:16 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/subselect.c,v 1.30 2000/03/11 23:53:41 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -302,8 +302,8 @@ make_subplan(SubLink *slink) * the top of an uncorrelated/undirect correlated subplan, which lets * us do the work of evaluating the subplan only once. We do this * if the subplan's top plan node is anything more complicated than - * a sequential or index scan, and we do it even for those plan types - * if the qual appears selective enough to eliminate many tuples. + * a plain sequential scan, and we do it even for seqscan if the + * qual appears selective enough to eliminate many tuples. */ if (node->parParam == NIL) { @@ -312,28 +312,19 @@ make_subplan(SubLink *slink) switch (nodeTag(plan)) { case T_SeqScan: - { - Selectivity qualsel; - - qualsel = clauselist_selectivity(subquery, plan->qual, 0); - /* Is 10% selectivity a good threshold?? */ - use_material = qualsel < 0.10; - break; - } - case T_IndexScan: - { - List *indxqual = ((IndexScan *) plan)->indxqualorig; - Selectivity qualsel; - - qualsel = clauselist_selectivity(subquery, plan->qual, 0); - qualsel *= clauselist_selectivity(subquery, indxqual, 0); - /* Note: if index is lossy, we just double-counted the - * index selectivity. Worth fixing? - */ - /* Is 10% selectivity a good threshold?? */ - use_material = qualsel < 0.10; + if (plan->initPlan || plan->subPlan) + use_material = true; + else + { + Selectivity qualsel; + + qualsel = clauselist_selectivity(subquery, + plan->qual, + 0); + /* Is 10% selectivity a good threshold?? */ + use_material = qualsel < 0.10; + } break; - } case T_Material: case T_Sort: /* Don't add another Material node if there's one already, -- 2.11.0