The keyword
PARALLEL
can be combined with any comparison operator. However, it will take effect only for:- IN <array defined by literal or parameter >- IS NOT NULL- between <num1> and <num2>The number of worker threads is controlled by the xsql variable
parallel_workers
:SET parallel_workers=<N>
(By default, there are 8 worker threads.)
This variable is local for the current session. Its value can be set only before the first query containing
PARALLEL
is executed. Subsequent assignments are ignored.Parallel execution is implemented via the class
SqlAggregator
: several connections and threads are created and each connection is started in its own thread. The condition is split between the threads.This feature may be handy for processing of large sequences since it allows making use of many CPU cores.
Example
Let's simulate a long-running operation with a delay:
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: 21001Total time is 21 seconds, i.e. sum of all
sleep()
times.Now let's use parallel execution:
XSQL>select x, sleep(x*1000) from par where x parallel in [1,2,3,4,5,6]; ... Elapsed time: 6002 Max allocated: 59334Total time is 6 seconds, i.e. time of the longest sleep().
More examples
XSQL>select x, sleep(x*1000) from par where x parallel is not null; ... Elapsed time: 10001Here 9 computations were done with 8 worker threads. The first threads completed the first computation in 1 second and proceeded to the ninth computation. Total time is 10 seconds.
XSQL>select x, sleep(x*1000) from par where x parallel between 1 and 6; ... Elapsed time: 6001Total time is 6 seconds.