为什么 Query_parallelism 会影响两个 UUID 列之间的连接结果
Why Query_parallelism affects the result of a join between two UUID columns
我运行在ignite 2.10.0上进行了以下测试
我用 query_parallelism=1 创建了 2 个表,但没有关联键。
当我加入以下 2 个表时,我得到了预期的结果。
0: jdbc:ignite:thin://localhost:10800> SELECT "id" AS "_A_id", "source_id" AS "_A_source_id" FROM PUBLIC."source_ml_blue";
+--------------------------------------+--------------------------------------+
| _A_id | _A_source_id |
+--------------------------------------+--------------------------------------+
| 86c068cd-da89-11eb-a185-3da86c6c6bb3 | 86c068cc-da89-11eb-a185-3da86c6c6bb3 |
+--------------------------------------+--------------------------------------+
1 row selected (0.004 seconds)
0: jdbc:ignite:thin://localhost:10800> SELECT "id" AS "_B_id", "flx_src_ip_text" AS "_B_src_ip" FROM PUBLIC."source_nprobe_tcp_blue";
+--------------------------------------+-----------+
| _B_id | _B_src_ip |
+--------------------------------------+-----------+
| 86c068cc-da89-11eb-a185-3da86c6c6bb3 | 1.1.1.1 |
+--------------------------------------+-----------+
1 row selected (0.003 seconds)
0: jdbc:ignite:thin://localhost:10800> SELECT _A."id" AS "_A_id", _A."source_id" AS "_A_source_id", _B."id" AS "_B_id", _B."flx_src_ip_text" AS "_B_src_ip" FROM PUBLIC."source_ml_blue" AS "_A" INNER JOIN PUBLIC."source_nprobe_tcp_blue" AS "_B" ON "_A"."source_id"="_B"."id";
+--------------------------------------+--------------------------------------+--------------------------------------+-----------+
| _A_id | _A_source_id | _B_id | _B_src_ip |
+--------------------------------------+--------------------------------------+--------------------------------------+-----------+
| 86c068cd-da89-11eb-a185-3da86c6c6bb3 | 86c068cc-da89-11eb-a185-3da86c6c6bb3 | 86c068cc-da89-11eb-a185-3da86c6c6bb3 | 1.1.1.1 |
+--------------------------------------+--------------------------------------+--------------------------------------+-----------+
1 row selected (0.005 seconds)
如果我删除并创建具有 query_parallelism = 8 的相同表,我不会出现 SQL 错误(2 个表的并行度相等)但是连接的结果是空的。
知道我为什么会出现这种行为吗?
问题来自 SQL 客户端:它必须了解并行性。
在 DBeaver 上,我必须在连接属性中启用 ignite.jdbc.distributedJoins 才能使请求正常工作。
您观察到此行为是因为对并行查询执行进行了优化。您的记录很可能落入不同的分区(由不同的线程处理)。如果您增加两个表中的记录数,您将看到此连接的一个子集。
这里最优雅的选择是让 "_A"."source_id"
和 "_B"."id"
为 affinity keys。 ignite.jdbc.distributedJoins
很可能会影响集群安装的性能。亲和力搭配将使匹配 "_A"."source_id"
和 "_B"."id"
的项目驻留在同一分区中,以避免跨分区交互(对于集群环境,它会导致额外的网络跃点)。
我运行在ignite 2.10.0上进行了以下测试
我用 query_parallelism=1 创建了 2 个表,但没有关联键。 当我加入以下 2 个表时,我得到了预期的结果。
0: jdbc:ignite:thin://localhost:10800> SELECT "id" AS "_A_id", "source_id" AS "_A_source_id" FROM PUBLIC."source_ml_blue";
+--------------------------------------+--------------------------------------+
| _A_id | _A_source_id |
+--------------------------------------+--------------------------------------+
| 86c068cd-da89-11eb-a185-3da86c6c6bb3 | 86c068cc-da89-11eb-a185-3da86c6c6bb3 |
+--------------------------------------+--------------------------------------+
1 row selected (0.004 seconds)
0: jdbc:ignite:thin://localhost:10800> SELECT "id" AS "_B_id", "flx_src_ip_text" AS "_B_src_ip" FROM PUBLIC."source_nprobe_tcp_blue";
+--------------------------------------+-----------+
| _B_id | _B_src_ip |
+--------------------------------------+-----------+
| 86c068cc-da89-11eb-a185-3da86c6c6bb3 | 1.1.1.1 |
+--------------------------------------+-----------+
1 row selected (0.003 seconds)
0: jdbc:ignite:thin://localhost:10800> SELECT _A."id" AS "_A_id", _A."source_id" AS "_A_source_id", _B."id" AS "_B_id", _B."flx_src_ip_text" AS "_B_src_ip" FROM PUBLIC."source_ml_blue" AS "_A" INNER JOIN PUBLIC."source_nprobe_tcp_blue" AS "_B" ON "_A"."source_id"="_B"."id";
+--------------------------------------+--------------------------------------+--------------------------------------+-----------+
| _A_id | _A_source_id | _B_id | _B_src_ip |
+--------------------------------------+--------------------------------------+--------------------------------------+-----------+
| 86c068cd-da89-11eb-a185-3da86c6c6bb3 | 86c068cc-da89-11eb-a185-3da86c6c6bb3 | 86c068cc-da89-11eb-a185-3da86c6c6bb3 | 1.1.1.1 |
+--------------------------------------+--------------------------------------+--------------------------------------+-----------+
1 row selected (0.005 seconds)
如果我删除并创建具有 query_parallelism = 8 的相同表,我不会出现 SQL 错误(2 个表的并行度相等)但是连接的结果是空的。
知道我为什么会出现这种行为吗?
问题来自 SQL 客户端:它必须了解并行性。
在 DBeaver 上,我必须在连接属性中启用 ignite.jdbc.distributedJoins 才能使请求正常工作。
您观察到此行为是因为对并行查询执行进行了优化。您的记录很可能落入不同的分区(由不同的线程处理)。如果您增加两个表中的记录数,您将看到此连接的一个子集。
这里最优雅的选择是让 "_A"."source_id"
和 "_B"."id"
为 affinity keys。 ignite.jdbc.distributedJoins
很可能会影响集群安装的性能。亲和力搭配将使匹配 "_A"."source_id"
和 "_B"."id"
的项目驻留在同一分区中,以避免跨分区交互(对于集群环境,它会导致额外的网络跃点)。