]> granicus.if.org Git - postgresql/commitdiff
Speed up match_eclasses_to_foreign_key_col() when there are many ECs.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 21 Feb 2019 01:53:08 +0000 (20:53 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 21 Feb 2019 01:53:17 +0000 (20:53 -0500)
Check ec_relids before bothering to iterate through the EC members.
On a perhaps extreme, but still real-world, query in which
match_eclasses_to_foreign_key_col() accounts for the bulk of the
planner's runtime, this saves nearly 40% of the runtime.  It's a bit
of a stopgap fix, but it's simple enough to be back-patched to 9.6
where this code came in; so let's do that.

David Rowley

Discussion: https://postgr.es/m/6970.1545327857@sss.pgh.pa.us

src/backend/optimizer/path/equivclass.c

index 23792508b7b036500efa9e9ccedea668d33f13e1..61b5b119b003b5335b0431d7ed305b974feec2f8 100644 (file)
@@ -2052,6 +2052,14 @@ match_eclasses_to_foreign_key_col(PlannerInfo *root,
                        continue;
                /* Note: it seems okay to match to "broken" eclasses here */
 
+               /*
+                * If eclass visibly doesn't have members for both rels, there's no
+                * need to grovel through the members.
+                */
+               if (!bms_is_member(var1varno, ec->ec_relids) ||
+                       !bms_is_member(var2varno, ec->ec_relids))
+                       continue;
+
                foreach(lc2, ec->ec_members)
                {
                        EquivalenceMember *em = (EquivalenceMember *) lfirst(lc2);