diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2019-02-20 20:53:08 -0500 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2019-02-20 20:53:08 -0500 |
commit | affee8b14c68d8ac8815406be39a68403c4a815e (patch) | |
tree | 716b6760543219ce1f0890d48473b6ce47d0ac4c /src | |
parent | ddad002dea73cf2ad08b0916d4d9eb84fc18edad (diff) | |
download | postgresql-affee8b14c68d8ac8815406be39a68403c4a815e.tar.gz postgresql-affee8b14c68d8ac8815406be39a68403c4a815e.zip |
Speed up match_eclasses_to_foreign_key_col() when there are many ECs.
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
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/optimizer/path/equivclass.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/src/backend/optimizer/path/equivclass.c b/src/backend/optimizer/path/equivclass.c index cc7f247347b..020ae085cab 100644 --- a/src/backend/optimizer/path/equivclass.c +++ b/src/backend/optimizer/path/equivclass.c @@ -2013,6 +2013,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); |