JDBCでパラレルクエリが効かない問題の対処

PostgreSQLはパラレルクエリをサポートします。

psqlコマンドで重いクエリを実行し、topコマンドで複数のpostgresプロセスが立ち上がっているのを見て、

よし。これでオーケーとJavaでプログラムを作成しましたが、

なぜか、Javaプログラム実行中、topコマンドを確認すると、postgresプロセスが一個しか立ち上がりませんでした。
いろいろググった結果、JDBCのホストに下記のようにpreferQueryMode=simpleパラメータを

付けなければならないことが分かりました。

jdbc:postgresql://localhost:5432/dukedb?preferQueryMode=simple

テストではワーカーを8(max_parallel_workers_per_gather=8)にを設定しましたが、速度はパラレルでない時より

約2倍ぐらい早くなりました。ワーカーの数(8)と同じく8倍早くなりませんでしたが、十分満足です。

PostgreSQLJDBCでデフォルトでサポートしてくれればいいのに。。なぜでしょうか。

パラレルに適していないシステムの場合、むしろオーバーヘッドで遅くなるからでしょうか。

とにかく対処方法が分かったので、ここにメモします。

原因はStatement.setFetchSizeメソッドを呼び出してDBのカーソルを利用したからでした。

PostgreSQLではカーソルを利用すると、パラレルクエリが効かないようです。

JDBCのホストにpreferQueryMode=simpleパラメータをつけると、パラレルに読み込むようになりますが、

今度はsetFetchSizeが効かなくなります

そうなると、メモリ不足になって落ちる恐れがあるので、注意が必要です。

preferQueryMode=simpleは忘れましょう。2021/02/11 追記。