暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

AntDB 数据库分布式功能-FQS增强14

tocata 2024-09-02
45
多表 join 的其他情况
# 测试用表和数据请参加附录
# 2张按hash分布的表,join的条件是分片键,没有排序,join的类型是内连接、左连接、全连接,不带WHERE条件
antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_hash1 t1 inner join fqs_test_hash2 t2 on (t1.id = t2.id);
                                                        QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0, DN1, DN2
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_hash1 t1 JOIN public.fqs_test_hash2 t2 ON ((t1.id = t2.id)))
(5 rows)

antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_hash1 t1 left outer join fqs_test_hash2 t2 on (t1.id = t2.id);
                                                          QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0, DN1, DN2
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_hash1 t1 LEFT JOIN public.fqs_test_hash2 t2 ON ((t1.id = t2.id)))
(5 rows)

antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_hash1 t1 FULL OUTER JOIN fqs_test_hash2 t2 on (t1.id = t2.id);
                                                          QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0, DN1, DN2
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_hash1 t1 FULL JOIN public.fqs_test_hash2 t2 ON ((t1.id = t2.id)))
(5 rows)


# 1张按hash分布的表,1张复制表,join的条件是分片键,没有排序,join的类型是内连接、左连接,不带WHERE条件
antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_hash1 t1 inner join fqs_test_repl1 t2 on (t1.id = t2.id);
                                                        QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0, DN1, DN2
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_hash1 t1 JOIN public.fqs_test_repl1 t2 ON ((t1.id = t2.id)))
(5 rows)

antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_hash1 t1 left outer join fqs_test_repl1 t2 on (t1.id = t2.id);
                                                          QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0, DN1, DN2
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_hash1 t1 LEFT JOIN public.fqs_test_repl1 t2 ON ((t1.id = t2.id)))
(5 rows)

# 2张取mod分布的表,join的条件是分片键,没有排序,join的类型是内连接、左连接、全连接,不带WHERE条件
antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_mod1 t1 inner join fqs_test_mod2 t2 on (t1.id = t2.id);
                                                       QUERY PLAN
------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0, DN1, DN2
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_mod1 t1 JOIN public.fqs_test_mod2 t2 ON ((t1.id = t2.id)))
(5 rows)

antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_mod1 t1 left outer join fqs_test_mod2 t2 on (t1.id = t2.id);
                                                         QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0, DN1, DN2
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_mod1 t1 LEFT JOIN public.fqs_test_mod2 t2 ON ((t1.id = t2.id)))
(5 rows)

antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_mod1 t1 FULL OUTER JOIN fqs_test_mod2 t2 on (t1.id = t2.id);
                                                         QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0, DN1, DN2
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_mod1 t1 FULL JOIN public.fqs_test_mod2 t2 ON ((t1.id = t2.id)))
(5 rows)

# 1张取mod分布的表,1张复制表,join的条件是分片键,没有排序,join的类型是内连接、左连接,不带WHERE条件
antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_mod1 t1 inner join fqs_test_repl1 t2 on (t1.id = t2.id);
                                                       QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0, DN1, DN2
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_mod1 t1 JOIN public.fqs_test_repl1 t2 ON ((t1.id = t2.id)))
(5 rows)

antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_mod1 t1 left outer join fqs_test_repl1 t2 on (t1.id = t2.id);
                                                          QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0, DN1, DN2
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_mod1 t1 LEFT JOIN public.fqs_test_repl1 t2 ON ((t1.id = t2.id)))
(5 rows)

# 1张复制表,一张按hash分布的表,join的条件是分片键,没有排序,join的类型是内连接,不带WHERE条件
antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_repl1 t1 inner join fqs_test_hash1 t2 on (t1.id = t2.id);
                                                        QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0, DN1, DN2
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_repl1 t1 JOIN public.fqs_test_hash1 t2 ON ((t1.id = t2.id)))
(5 rows)

# 1张复制表,一张取mod分布的表,join的条件是分片键,没有排序,join的类型是内连接,不带WHERE条件
antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_repl1 t1 inner join fqs_test_mod1 t2 on (t1.id = t2.id);
                                                       QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0, DN1, DN2
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_repl1 t1 JOIN public.fqs_test_mod1 t2 ON ((t1.id = t2.id)))
(5 rows)

# 2张复制表,join的条件是随意,join的类型是内连接、左连接、全连接,可以带排序
antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_repl1 t1 inner join fqs_test_repl2 t2 on (t1.id = t2.id);
                                                        QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Node/s: DN1
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_repl1 t1 JOIN public.fqs_test_repl2 t2 ON ((t1.id = t2.id)))
(4 rows)

antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_repl1 t1 left outer join fqs_test_repl2 t2 on (t1.id = t2.id);
                                                          QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Node/s: DN1
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_repl1 t1 LEFT JOIN public.fqs_test_repl2 t2 ON ((t1.id = t2.id)))
(4 rows)

antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_repl1 t1 FULL OUTER JOIN fqs_test_repl2 t2 on (t1.id = t2.id);
                                                          QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Node/s: DN1
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_repl1 t1 FULL JOIN public.fqs_test_repl2 t2 ON ((t1.id = t2.id)))
(4 rows)

# 1张复制表,1张按random分布的表,join的条件是随意,join的类型是内连接,不带排序
antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_repl1 t1 inner join fqs_test_random1 t2 on (t1.id = t2.id);
                                                         QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0, DN1, DN2
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_repl1 t1 JOIN public.fqs_test_random1 t2 ON ((t1.id = t2.id)))
(5 rows)

# 1张按random分布的表,1张复制表,join的条件是随意,join的类型是内连接、左连接,不带排序
antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_random1 t1 inner join fqs_test_repl1 t2 on (t1.id = t2.id);
                                                         QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0, DN1, DN2
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_random1 t1 JOIN public.fqs_test_repl1 t2 ON ((t1.id = t2.id)))
(5 rows)

antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_random1 t1 left outer join fqs_test_repl1 t2 on (t1.id = t2.id);
                                                           QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0, DN1, DN2
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_random1 t1 LEFT JOIN public.fqs_test_repl1 t2 ON ((t1.id = t2.id)))
(5 rows)

# 1张hash表,1张hash表,join条件是分片键,join的类型是内连接、左连接、全连接,
# WHERE的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的
antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_hash1 t1 inner join fqs_test_hash2 t2 on (t1.id = t2.id) WHERE t1.id =3;
                                                                 QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_hash1 t1 JOIN public.fqs_test_hash2 t2 ON ((t1.id = t2.id))) WHERE (t1.id = 3)
(5 rows)

antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_hash1 t1 left outer join fqs_test_hash2 t2 on (t1.id = t2.id) WHERE t1.id =3;
                                                                   QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_hash1 t1 LEFT JOIN public.fqs_test_hash2 t2 ON ((t1.id = t2.id))) WHERE (t1.id = 3)
(5 rows)

antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_hash1 t1 FULL OUTER JOIN fqs_test_hash2 t2 on (t1.id = t2.id) WHERE t1.id =3;
                                                                   QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_hash1 t1 FULL JOIN public.fqs_test_hash2 t2 ON ((t1.id = t2.id))) WHERE (t1.id = 3)
(5 rows)

antdb=# prepare s_table_join1(int) as SELECT t1.id, t1.name FROM fqs_test_hash1 t1 inner join fqs_test_hash2 t2 on (t1.id = t2.id) WHERE t1.id = $1;
PREPARE
antdb=# EXPLAIN verbose execute s_table_join1(3);
                                                                 QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Node expr: $1
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_hash1 t1 JOIN public.fqs_test_hash2 t2 ON ((t1.id = t2.id))) WHERE (t1.id = $1)
(4 rows)

antdb=# prepare s_table_join2(int) as SELECT t1.id, t1.name FROM fqs_test_hash1 t1 left outer join fqs_test_hash2 t2 on (t1.id = t2.id) WHERE t1.id = $1;
PREPARE
antdb=# EXPLAIN verbose execute s_table_join2(3);
                                                                    QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Node expr: $1
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_hash1 t1 LEFT JOIN public.fqs_test_hash2 t2 ON ((t1.id = t2.id))) WHERE (t1.id = $1)
(4 rows)

antdb=# prepare s_table_join3(int) as SELECT t1.id, t1.name FROM fqs_test_hash1 t1 FULL OUTER JOIN fqs_test_hash2 t2 on (t1.id = t2.id) WHERE t1.id = $1;
PREPARE
antdb=# EXPLAIN verbose execute s_table_join3(3);
                                                                    QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Node expr: $1
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_hash1 t1 FULL JOIN public.fqs_test_hash2 t2 ON ((t1.id = t2.id))) WHERE (t1.id = $1)
(4 rows)

# 1张hash表,1张复制表,join条件是分片键,join的类型是内连接、左连接,
# WHERE的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的
antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_hash1 t1 inner join fqs_test_repl1 t2 on (t1.id = t2.id) WHERE t1.id =3;
                                                                 QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_hash1 t1 JOIN public.fqs_test_repl1 t2 ON ((t1.id = t2.id))) WHERE (t1.id = 3)
(5 rows)

antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_hash1 t1 left outer join fqs_test_repl1 t2 on (t1.id = t2.id) WHERE t1.id =3;
                                                                   QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_hash1 t1 LEFT JOIN public.fqs_test_repl1 t2 ON ((t1.id = t2.id))) WHERE (t1.id = 3)
(5 rows)

antdb=# prepare s_table_join7(int) as SELECT t1.id, t1.name FROM fqs_test_hash1 t1 inner join fqs_test_repl1 t2 on (t1.id = t2.id) WHERE t1.id = $1;
PREPARE
antdb=# EXPLAIN verbose execute s_table_join7(3);
                                                                 QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Node expr: $1
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_hash1 t1 JOIN public.fqs_test_repl1 t2 ON ((t1.id = t2.id))) WHERE (t1.id = $1)
(4 rows)

antdb=# prepare s_table_join8(int) as SELECT t1.id, t1.name FROM fqs_test_hash1 t1 left outer join fqs_test_repl1 t2 on (t1.id = t2.id) WHERE t1.id = $1;
PREPARE
antdb=# EXPLAIN verbose execute s_table_join8(3);
                                                                    QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Node expr: $1
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_hash1 t1 LEFT JOIN public.fqs_test_repl1 t2 ON ((t1.id = t2.id))) WHERE (t1.id = $1)
(4 rows)


# 1张取mod分布的表,1张取mod分布的表,join条件是分片键,join的类型是内连接、左连接、全连接,
# WHERE的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的
antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_mod1 t1 inner join fqs_test_mod2 t2 on (t1.id = t2.id) WHERE t1.id =3;
                                                                QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_mod1 t1 JOIN public.fqs_test_mod2 t2 ON ((t1.id = t2.id))) WHERE (t1.id = 3)
(5 rows)

antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_mod1 t1 left outer join fqs_test_mod2 t2 on (t1.id = t2.id) WHERE t1.id =3;
                                                                  QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_mod1 t1 LEFT JOIN public.fqs_test_mod2 t2 ON ((t1.id = t2.id))) WHERE (t1.id = 3)
(5 rows)

antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_mod1 t1 FULL OUTER JOIN fqs_test_mod2 t2 on (t1.id = t2.id) WHERE t1.id =3;
                                                                  QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_mod1 t1 FULL JOIN public.fqs_test_mod2 t2 ON ((t1.id = t2.id))) WHERE (t1.id = 3)
(5 rows)

antdb=# prepare s_table_join16(int) as SELECT t1.id, t1.name FROM fqs_test_mod1 t1 inner join fqs_test_mod2 t2 on (t1.id = t2.id) WHERE t1.id = $1;
PREPARE
antdb=# EXPLAIN verbose execute s_table_join16(3);
                                                                QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Node expr: $1
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_mod1 t1 JOIN public.fqs_test_mod2 t2 ON ((t1.id = t2.id))) WHERE (t1.id = $1)
(4 rows)

antdb=# prepare s_table_join17(int) as SELECT t1.id, t1.name FROM fqs_test_mod1 t1 left outer join fqs_test_mod2 t2 on (t1.id = t2.id) WHERE t1.id = $1;
PREPARE
antdb=# EXPLAIN verbose execute s_table_join17(3);
                                                                   QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Node expr: $1
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_mod1 t1 LEFT JOIN public.fqs_test_mod2 t2 ON ((t1.id = t2.id))) WHERE (t1.id = $1)
(4 rows)

antdb=# prepare s_table_join18(int) as SELECT t1.id, t1.name FROM fqs_test_mod1 t1 FULL OUTER JOIN fqs_test_mod2 t2 on (t1.id = t2.id) WHERE t1.id = $1;
PREPARE
antdb=# EXPLAIN verbose execute s_table_join18(3);
                                                                   QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Node expr: $1
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_mod1 t1 FULL JOIN public.fqs_test_mod2 t2 ON ((t1.id = t2.id))) WHERE (t1.id = $1)
(4 rows)

# 1张取mod分布的表,1张复制表,join条件是分片键,join的类型是内连接、左连接,
# WHERE的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的
antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_mod1 t1 inner join fqs_test_repl1 t2 on (t1.id = t2.id) WHERE t1.id =3;
                                                                QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_mod1 t1 JOIN public.fqs_test_repl1 t2 ON ((t1.id = t2.id))) WHERE (t1.id = 3)
(5 rows)

antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_mod1 t1 left outer join fqs_test_repl1 t2 on (t1.id = t2.id) WHERE t1.id =3;
                                                                   QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_mod1 t1 LEFT JOIN public.fqs_test_repl1 t2 ON ((t1.id = t2.id))) WHERE (t1.id = 3)
(5 rows)

antdb=# prepare s_table_join19(int) as SELECT t1.id, t1.name FROM fqs_test_mod1 t1 inner join fqs_test_repl1 t2 on (t1.id = t2.id) WHERE t1.id = $1;
PREPARE
antdb=# EXPLAIN verbose execute s_table_join19(3);
                                                                 QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Node expr: $1
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_mod1 t1 JOIN public.fqs_test_repl1 t2 ON ((t1.id = t2.id))) WHERE (t1.id = $1)
(4 rows)

antdb=# prepare s_table_join20(int) as SELECT t1.id, t1.name FROM fqs_test_mod1 t1 left outer join fqs_test_repl1 t2 on (t1.id = t2.id) WHERE t1.id = $1;
PREPARE
antdb=# EXPLAIN verbose execute s_table_join20(3);
                                                                   QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Node expr: $1
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_mod1 t1 LEFT JOIN public.fqs_test_repl1 t2 ON ((t1.id = t2.id))) WHERE (t1.id = $1)
(4 rows)


# 1张复制表,1张按hash分布的表,join条件是分片键,join的类型是内连接,
# WHERE的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的
antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_repl1 t1 inner join fqs_test_hash1 t2 on (t1.id = t2.id) WHERE t1.id =3;
                                                                 QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0, DN1, DN2
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_repl1 t1 JOIN public.fqs_test_hash1 t2 ON ((t1.id = t2.id))) WHERE (t1.id = 3)
(5 rows)

antdb=# prepare s_table_join25(int) as SELECT t1.id, t1.name FROM fqs_test_repl1 t1 inner join fqs_test_hash1 t2 on (t1.id = t2.id) WHERE t1.id = $1;
PREPARE
antdb=# EXPLAIN verbose execute s_table_join25(3);
                                                                 QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0, DN1, DN2
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_repl1 t1 JOIN public.fqs_test_hash1 t2 ON ((t1.id = t2.id))) WHERE (t1.id = $1)
(5 rows)


# 1张复制表,1张取mod分布的表,join条件是分片键,join的类型是内连接,
# WHERE的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的
antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_repl1 t1 inner join fqs_test_mod1 t2 on (t1.id = t2.id) WHERE t1.id =3;
                                                                QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0, DN1, DN2
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_repl1 t1 JOIN public.fqs_test_mod1 t2 ON ((t1.id = t2.id))) WHERE (t1.id = 3)
(5 rows)

antdb=# prepare s_table_join28(int) as SELECT t1.id, t1.name FROM fqs_test_repl1 t1 inner join fqs_test_mod1 t2 on (t1.id = t2.id) WHERE t1.id = $1;
PREPARE
antdb=# EXPLAIN verbose execute s_table_join28(3);
                                                                 QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0, DN1, DN2
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_repl1 t1 JOIN public.fqs_test_mod1 t2 ON ((t1.id = t2.id))) WHERE (t1.id = $1)
(5 rows)


# 1张复制表,1张复制表,join条件是分片键,join的类型是内连接、左连接、全连接,
# WHERE的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,带/不带排序的
antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_repl1 t1 inner join fqs_test_repl2 t2 on (t1.id = t2.id) WHERE t1.id =3;
                                                                 QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Node/s: DN1
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_repl1 t1 JOIN public.fqs_test_repl2 t2 ON ((t1.id = t2.id))) WHERE (t1.id = 3)
(4 rows)

antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_repl1 t1 left outer join fqs_test_repl2 t2 on (t1.id = t2.id) WHERE t1.id =3;
                                                                   QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Node/s: DN1
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_repl1 t1 LEFT JOIN public.fqs_test_repl2 t2 ON ((t1.id = t2.id))) WHERE (t1.id = 3)
(4 rows)

antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_repl1 t1 FULL OUTER JOIN fqs_test_repl2 t2 on (t1.id = t2.id) WHERE t1.id =3;
                                                                   QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Node/s: DN1
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_repl1 t1 FULL JOIN public.fqs_test_repl2 t2 ON ((t1.id = t2.id))) WHERE (t1.id = 3)
(4 rows)

antdb=# prepare s_table_join31(int) as SELECT t1.id, t1.name FROM fqs_test_repl1 t1 inner join fqs_test_repl2 t2 on (t1.id = t2.id) WHERE t1.id = $1;
PREPARE
antdb=# EXPLAIN verbose execute s_table_join31(3);
                                                                 QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Node/s: DN1
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_repl1 t1 JOIN public.fqs_test_repl2 t2 ON ((t1.id = t2.id))) WHERE (t1.id = $1)
(4 rows)

antdb=# prepare s_table_join32(int) as SELECT t1.id, t1.name FROM fqs_test_repl1 t1 left outer join fqs_test_repl2 t2 on (t1.id = t2.id) WHERE t1.id = $1;
PREPARE
antdb=# EXPLAIN verbose execute s_table_join32(3);
                                                                    QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Node/s: DN1
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_repl1 t1 LEFT JOIN public.fqs_test_repl2 t2 ON ((t1.id = t2.id))) WHERE (t1.id = $1)
(4 rows)

antdb=# prepare s_table_join33(int) as SELECT t1.id, t1.name FROM fqs_test_repl1 t1 FULL OUTER JOIN fqs_test_repl2 t2 on (t1.id = t2.id) WHERE t1.id = $1;
PREPARE
antdb=# EXPLAIN verbose execute s_table_join33(3);
                                                                    QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Node/s: DN1
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_repl1 t1 FULL JOIN public.fqs_test_repl2 t2 ON ((t1.id = t2.id))) WHERE (t1.id = $1)
(4 rows)


# 1张复制表,1张按random分布的表,join条件是分片键,join的类型是内连接,
# WHERE的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的
antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_repl1 t1 inner join fqs_test_random1 t2 on (t1.id = t2.id) WHERE t1.id =3;
                                                                  QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0, DN1, DN2
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_repl1 t1 JOIN public.fqs_test_random1 t2 ON ((t1.id = t2.id))) WHERE (t1.id = 3)
(5 rows)

antdb=# prepare s_table_join34(int) as SELECT t1.id, t1.name FROM fqs_test_repl1 t1 inner join fqs_test_random1 t2 on (t1.id = t2.id) WHERE t1.id = $1;
PREPARE
antdb=# EXPLAIN verbose execute s_table_join34(3);
                                                                  QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0, DN1, DN2
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_repl1 t1 JOIN public.fqs_test_random1 t2 ON ((t1.id = t2.id))) WHERE (t1.id = $1)
(5 rows)


# 1张按random分布的表,1张复制表,join条件是分片键,join的类型是内连接、左连接,
# WHERE的条件是分片键或非分片键“=”条件且参数是静态或动态绑定变量的,不带排序的
antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_random1 t1 inner join fqs_test_repl1 t2 on (t1.id = t2.id) WHERE t1.id =3;
                                                                  QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0, DN1, DN2
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_random1 t1 JOIN public.fqs_test_repl1 t2 ON ((t1.id = t2.id))) WHERE (t1.id = 3)
(5 rows)

antdb=# EXPLAIN verbose SELECT t1.id, t1.name FROM fqs_test_random1 t1 left outer join fqs_test_repl1 t2 on (t1.id = t2.id) WHERE t1.id =3;
                                                                    QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0, DN1, DN2
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_random1 t1 LEFT JOIN public.fqs_test_repl1 t2 ON ((t1.id = t2.id))) WHERE (t1.id = 3)
(5 rows)

antdb=# prepare s_table_join43(int) as SELECT t1.id, t1.name FROM fqs_test_random1 t1 inner join fqs_test_repl1 t2 on (t1.id = t2.id) WHERE t1.id = $1;
PREPARE
antdb=# EXPLAIN verbose execute s_table_join43(3);
                                                                  QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0, DN1, DN2
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_random1 t1 JOIN public.fqs_test_repl1 t2 ON ((t1.id = t2.id))) WHERE (t1.id = $1)
(5 rows)

antdb=# prepare s_table_join44(int) as SELECT t1.id, t1.name FROM fqs_test_random1 t1 left outer join fqs_test_repl1 t2 on (t1.id = t2.id) WHERE t1.id = $1;
PREPARE
antdb=# EXPLAIN verbose execute s_table_join44(3);
                                                                     QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------
 Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
   Output: t1.id, t1.name
   Primary node/s: DN0
   Node/s: DN0, DN1, DN2
   Remote query: SELECT t1.id, t1.name FROM (public.fqs_test_random1 t1 LEFT JOIN public.fqs_test_repl1 t2 ON ((t1.id = t2.id))) WHERE (t1.id = $1)
(5 rows)
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论