]> granicus.if.org Git - postgresql/commitdiff
Optimize query for information_schema.constraint_column_usage
authorPeter Eisentraut <peter_e@gmx.net>
Sat, 18 Feb 2017 00:32:15 +0000 (19:32 -0500)
committerPeter Eisentraut <peter_e@gmx.net>
Sat, 18 Feb 2017 00:32:15 +0000 (19:32 -0500)
The way the old query was written prevented some join optimizations
because the join conditions were hidden inside a CASE expression.  With
a large number of constraints, the query became unreasonably slow.  The
new query performs much better.

From: Alexey Bashtanov <bashtanov@imap.cc>
Reviewed-by: Ashutosh Bapat <ashutosh.bapat@enterprisedb.com>
src/backend/catalog/information_schema.sql

index 9a53003ecff84e00e27768d38a2440524d837cec..51795cd6dededd31213c68da820fe04d0c6ef9f3 100644 (file)
@@ -801,8 +801,8 @@ CREATE VIEW constraint_column_usage AS
           WHERE nr.oid = r.relnamespace
             AND r.oid = a.attrelid
             AND nc.oid = c.connamespace
-            AND (CASE WHEN c.contype = 'f' THEN r.oid = c.confrelid AND a.attnum = ANY (c.confkey)
-                      ELSE r.oid = c.conrelid AND a.attnum = ANY (c.conkey) END)
+            AND r.oid = CASE c.contype WHEN 'f' THEN c.confrelid ELSE c.conrelid END
+            AND a.attnum = ANY (CASE c.contype WHEN 'f' THEN c.confkey ELSE c.conkey END)
             AND NOT a.attisdropped
             AND c.contype IN ('p', 'u', 'f')
             AND r.relkind IN ('r', 'P')