Re: Propose RC1 for Friday ...

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To:
Cc: "Ross J(dot) Reedstrom" <reedstrm(at)rice(dot)edu>, Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us>, "Marc G(dot) Fournier" <scrappy(at)hub(dot)org>, pgsql-hackers(at)postgresql(dot)org
Subject: Re: Propose RC1 for Friday ...
Date: 2002-11-14 18:33:05
Message-ID: 10919.1037298785@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

I said:
> Well, we could define it as a bug ;-) --- that is, a performance regression.
> I'd be happier about adding a dozen lines of code to sort quals by
> whether or not they contain a subplan than about flip-flopping on the
> original patch. That would actually solve the class of problem you
> exhibited, whereas the other is just a band-aid that happens to work for
> your particular example.

The attached patch does the above. I think it's a very low-risk change,
but am tossing it out on the list to see if anyone objects to applying
it in the 7.3 branch. (I intend to put it in 7.4devel in any case.)

regards, tom lane

*** src/backend/optimizer/plan/createplan.c.orig Wed Nov 6 17:31:24 2002
--- src/backend/optimizer/plan/createplan.c Thu Nov 14 13:18:04 2002
***************
*** 70,75 ****
--- 70,76 ----
IndexOptInfo *index,
Oid *opclass);
static List *switch_outer(List *clauses);
+ static List *order_qual_clauses(Query *root, List *clauses);
static void copy_path_costsize(Plan *dest, Path *src);
static void copy_plan_costsize(Plan *dest, Plan *src);
static SeqScan *make_seqscan(List *qptlist, List *qpqual, Index scanrelid);
***************
*** 182,187 ****
--- 183,191 ----
*/
scan_clauses = get_actual_clauses(best_path->parent->baserestrictinfo);

+ /* Sort clauses into best execution order */
+ scan_clauses = order_qual_clauses(root, scan_clauses);
+
switch (best_path->pathtype)
{
case T_SeqScan:
***************
*** 359,364 ****
--- 363,369 ----
{
Result *plan;
List *tlist;
+ List *constclauses;
Plan *subplan;

if (best_path->path.parent)
***************
*** 371,377 ****
else
subplan = NULL;

! plan = make_result(tlist, (Node *) best_path->constantqual, subplan);

return plan;
}
--- 376,384 ----
else
subplan = NULL;

! constclauses = order_qual_clauses(root, best_path->constantqual);
!
! plan = make_result(tlist, (Node *) constclauses, subplan);

return plan;
}
***************
*** 1210,1215 ****
--- 1217,1259 ----
t_list = lappend(t_list, clause);
}
return t_list;
+ }
+
+ /*
+ * order_qual_clauses
+ * Given a list of qual clauses that will all be evaluated at the same
+ * plan node, sort the list into the order we want to check the quals
+ * in at runtime.
+ *
+ * Ideally the order should be driven by a combination of execution cost and
+ * selectivity, but unfortunately we have so little information about
+ * execution cost of operators that it's really hard to do anything smart.
+ * For now, we just move any quals that contain SubPlan references (but not
+ * InitPlan references) to the end of the list.
+ */
+ static List *
+ order_qual_clauses(Query *root, List *clauses)
+ {
+ List *nosubplans;
+ List *withsubplans;
+ List *l;
+
+ /* No need to work hard if the query is subselect-free */
+ if (!root->hasSubLinks)
+ return clauses;
+
+ nosubplans = withsubplans = NIL;
+ foreach(l, clauses)
+ {
+ Node *clause = lfirst(l);
+
+ if (contain_subplans(clause))
+ withsubplans = lappend(withsubplans, clause);
+ else
+ nosubplans = lappend(nosubplans, clause);
+ }
+
+ return nconc(nosubplans, withsubplans);
}

/*

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Bruce Momjian 2002-11-14 18:39:23 Re: RC1?
Previous Message Patrick Welche 2002-11-14 18:13:56 Re: RC1?