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倍早くなりませんでしたが、十分満足です。
PostgreSQLのJDBCでデフォルトでサポートしてくれればいいのに。。なぜでしょうか。
パラレルに適していないシステムの場合、むしろオーバーヘッドで遅くなるからでしょうか。
とにかく対処方法が分かったので、ここにメモします。
原因はStatement.setFetchSizeメソッドを呼び出してDBのカーソルを利用したからでした。
PostgreSQLではカーソルを利用すると、パラレルクエリが効かないようです。
JDBCのホストにpreferQueryMode=simpleパラメータをつけると、パラレルに読み込むようになりますが、
今度はsetFetchSizeが効かなくなります
そうなると、メモリ不足になって落ちる恐れがあるので、注意が必要です。
preferQueryMode=simpleは忘れましょう。2021/02/11 追記。