Add a test case demonstrating an extremely slow join in XL, especially with the
authorPavan Deolasee <[email protected]>
Fri, 8 Jul 2016 05:29:53 +0000 (10:59 +0530)
committerPavan Deolasee <[email protected]>
Fri, 8 Jul 2016 05:29:53 +0000 (10:59 +0530)
inner side of a join doing repeated remote subquery scans

src/test/regress/expected/join.out
src/test/regress/sql/join.sql

index fafa5ec20030880334a09352c7f93467ef11a5b7..0740f4411c8a3dd8a8b8e30852ec21da39f0a7b4 100644 (file)
@@ -5546,3 +5546,43 @@ ERROR:  invalid reference to FROM-clause entry for table "xx1"
 LINE 1: ...xx1 using lateral (select * from int4_tbl where f1 = x1) ss;
                                                                 ^
 HINT:  There is an entry for table "xx1", but it cannot be referenced from this part of the query.
+-- demonstrate problem with extrememly slow join
+CREATE TABLE testr (a int, b int) DISTRIBUTE BY REPLICATION;
+INSERT INTO testr SELECT generate_series(1, 10000), generate_series(5001, 15000);
+INSERT INTO testh SELECT generate_series(1, 10000), generate_series(8001, 18000);CREATE TABLE testh (a int, b int);
+ERROR:  relation "testh" does not exist
+LINE 1: INSERT INTO testh SELECT generate_series(1, 10000), generate...
+                    ^
+set enable_mergejoin TO false;
+set enable_hashjoin TO false;
+EXPLAIN VERBOSE SELECT count(*) FROM testr WHERE NOT EXISTS (SELECT * FROM testh WHERE testr.b = testh.b);
+                                                         QUERY PLAN                                                         
+----------------------------------------------------------------------------------------------------------------------------
+ Aggregate  (cost=41632.20..41632.21 rows=1 width=0)
+   Output: pg_catalog.count(*)
+   ->  Remote Subquery Scan on all (datanode_1,datanode_2)  (cost=0.00..41629.38 rows=1130 width=0)
+         Output: count(*)
+         ->  Aggregate  (cost=0.00..41629.38 rows=1 width=0)
+               Output: count(*)
+               ->  Nested Loop Anti Join  (cost=0.00..41629.38 rows=1130 width=0)
+                     Join Filter: (testr.b = testh.b)
+                     ->  Remote Subquery Scan on all (datanode_1)  (cost=100.00..152.94 rows=2260 width=4)
+                           Output: testr.b
+                           Distribute results by H: b
+                           ->  Seq Scan on public.testr  (cost=0.00..32.60 rows=2260 width=4)
+                                 Output: testr.b
+                     ->  Materialize  (cost=100.00..164.24 rows=2260 width=4)
+                           Output: testh.b
+                           ->  Remote Subquery Scan on all (datanode_1,datanode_2)  (cost=100.00..152.94 rows=2260 width=4)
+                                 Output: testh.b
+                                 Distribute results by H: b
+                                 ->  Seq Scan on public.testh  (cost=0.00..32.60 rows=2260 width=4)
+                                       Output: testh.b
+(20 rows)
+
+SELECT count(*) FROM testr WHERE NOT EXISTS (SELECT * FROM testh WHERE testr.b = testh.b);
+ count 
+-------
+ 10000
+(1 row)
+
index 59c39c9f85a022ed301ba6f20b8ee755afded9e1..842479135513d49507fd783ac8fb7f11a2d7639d 100644 (file)
@@ -1749,3 +1749,12 @@ update xx1 set x2 = f1 from xx1, lateral (select * from int4_tbl where f1 = x1)
 delete from xx1 using (select * from int4_tbl where f1 = x1) ss;
 delete from xx1 using (select * from int4_tbl where f1 = xx1.x1) ss;
 delete from xx1 using lateral (select * from int4_tbl where f1 = x1) ss;
+
+-- demonstrate problem with extrememly slow join
+CREATE TABLE testr (a int, b int) DISTRIBUTE BY REPLICATION;
+INSERT INTO testr SELECT generate_series(1, 10000), generate_series(5001, 15000);
+INSERT INTO testh SELECT generate_series(1, 10000), generate_series(8001, 18000);CREATE TABLE testh (a int, b int);
+set enable_mergejoin TO false;
+set enable_hashjoin TO false;
+EXPLAIN VERBOSE SELECT count(*) FROM testr WHERE NOT EXISTS (SELECT * FROM testh WHERE testr.b = testh.b);
+SELECT count(*) FROM testr WHERE NOT EXISTS (SELECT * FROM testh WHERE testr.b = testh.b);