> > Oy. Those are outright horrid, even without any consideration of > pre-preparing them. We know the OID of the table we want to dump, > we should be doing "FROM pg_class WHERE oid = whatever" and lose > the join to pg_namespace altogether. The explicit casts to regclass > are quite expensive too to fetch information that pg_dump already > has. It already knows the server version, too. >
+1 Earlier versions had prepared statements, but those were removed to keep things simple. Easy enough to revive. > > Moreover, the first of these shouldn't be a separate query at all. > I objected to fetching pg_statistic content for all tables at once, > but relpages/reltuples/relallvisible is a pretty small amount of > new info. We should just collect those fields as part of getTables' > main query of pg_class (which, indeed, is already fetching relpages). > +1 > On the second one, if we want to go through the pg_stats view then > we can't rely on table OID, but I don't see why we need the joins > to anything else. "WHERE s.schemaname = 'x' AND s.tablename = 'y'" > seems sufficient. > +1 > > I wonder whether we ought to issue different queries depending on > whether we're superuser. The pg_stats view is rather expensive > because of its security restrictions, and if we're superuser we > could just look directly at pg_statistic. Maybe those checks are > fast enough not to matter, but ... That could lead to a rather complicated query that has to replicate the guts of pg_stats for every server-specific version of pg_stats, specifically the CASE statements that transform the stakindN/stanumbersN/stavaluesN to mcv, correlation, etc, so I'd like to avoid that if possible.