并行查询执行
关键字“PARALLEL”可与任何比较运算符结合使用。然而,它仅对以下情况生效:
- IN <array defined by literal or parameter >
- IS NOT NULL
- between <num1> and <num2>
工作线程的数量由 xsql 变量 parallel_workers 控制:
SET parallel_workers=<N>
(默认情况下,有 8 个工作线程。)
此变量在当前会话中是局部变量。其值只能在执行第一个包含 PARALLEL 的查询之前进行设置。后续的赋值将被忽略。
并行执行是通过 SqlAggregator 类实现的:创建了多个连接和线程,每个连接都在其自己的线程中启动。条件在各个线程之间进行拆分。
此功能在处理长序列时可能很有用,因为它可以利用多个 CPU 内核。
示例
示例1
让我们模拟一个带有延迟的长时间运行的操作:
xsql -trace
create table par(x int, y int);
INSERT INTO par VALUES (1,1), (2,2), (3,3), (4,4), (5,5), (6,6), (7,7), (8,8), (9,9);
XSQL>select x, sleep(x*1000) from par where x in [1,2,3,4,5,6];
...
Selected records: 6
Elapsed time: 21001
总时长为 21 秒,即所有 sleep() 调用时间的总和。 现在让我们使用并行执行:
XSQL>select x, sleep(x*1000) from par where x parallel in [1,2,3,4,5,6];
...
Elapsed time: 6002
Max allocated: 59334
总时长为 6 秒,即最长的 sleep() 所花费的时间。
示例2
XSQL>select x, sleep(x*1000) from par where x parallel is not null;
...
Elapsed time: 10001
这里使用 8 个工作线程完成了 9 次计算。第一个线程在 1 秒内完成了第一次计算,然后继续进行第九次计算。总耗时为 10 秒。
XSQL>select x, sleep(x*1000) from par where x parallel between 1 and 6;
...
Elapsed time: 6001
总时长为 6 秒。