非互換
FUJITSU Enterprise Postgres 11では、外部テーブルの外部結合時において、PostgreSQL側からOracle側へプッシュダウンするよう変更します。
Oracle query側では各外部テーブルの抽出のみ実施し、外部結合はPostgreSQL側で実施します。
[例]
=# EXPLAIN SELECT a.c1, a.c2, b.c3 FROM ft1 a LEFT OUTER JOIN ft2 b ON a.c1 = b.c1 AND substr(a.c2, -1,1) = 'd';
QUERY PLAN
-----------------------------------------------------------------------------------------------------
Hash Left Join (cost=30012.50..40215.00 rows=1000 width=66)
Hash Cond: (a.c1 = b.c1)
Join Filter: (substr((a.c2)::text, '-1'::integer, 1) = 'd'::text)
-> Foreign Scan on ft1 a (cost=10000.00..20000.00 rows=1000 width=62)
Oracle query: SELECT /*7543493300debf649a78c5dbe11c9be4*/ r1."C1", r1."C2" FROM "T1" r1
-> Hash (cost=20000.00..20000.00 rows=1000 width=8)
-> Foreign Scan on ft2 b (cost=10000.00..20000.00 rows=1000 width=8)
Oracle query: SELECT /*afb5375733f8fc53a93d0df585c01b9f*/ r2."C1", r2."C3" FROM "T2" r2
(8 行)
=# SELECT a.c1, a.c2, b.c3 FROM ft1 a LEFT OUTER join ft2 b ON a.c1 = b.c1 AND substr(a.c2, -1,1) = 'd';
c1 | c2 | c3 ----+------+---- 1 | abcd | 2 | efgh | 3 | ijkl | (3 行)
Oracle query側で外部結合と抽出を実施します。
[例]
=# EXPLAIN SELECT a.c1, a.c2, b.c3 FROM ft1 a LEFT OUTER JOIN ft2 b ON a.c1 = b.c1 AND substr(a.c2, -1,1) = 'd';
QUERY PLAN
-----------------------------------------------------------------------------------------------------
Foreign Scan (cost=10000.00..20000.00 rows=1000 width=66)
Oracle query: SELECT /*5e03719c069bac004e84a38149e37775*/ r1."C1", r1."C2", r2."C3" FROM ("T1" r1 LEFT JOIN "T2" r2 ON (substr(r1."C2", -1, 1) = 'd') AND (r1."C1" = r2."C1"))
(2 行)
=# SELECT a.c1, a.c2, b.c3 FROM ft1 a LEFT OUTER JOIN ft2 b ON a.c1 = b.c1 AND substr(a.c2, -1,1) = 'd';
c1 | c2 | c3 ----+------+------ 1 | abcd | 1000 2 | efgh | 3 | ijkl | (3 行)
対処方法
Oracleにプッシュダウンさせない場合、プッシュダウンさせない箇所の処理に共通テーブル式を使用して記述してください。