TrinoにおけるPostgreSQLのVARCHAR/CHAR型に対する範囲検索のプッシュダウンについて

TrinoはJDBC経由で様々なデータベースに接続できるのですが、PostgreSQLコネクタで以前はサポートされていたVARCHAR/CHAR型のカラムに対する範囲検索(<、<=、>、>=)のプッシュダウンがTrino 353以降廃止されていました。これはTrinoとPostgreSQLのCOLLATIONの違いが原因で、カラムの値によっては検索結果が期待したものにならないケースがあるためです。

github.com

そこで、以下のように明示的にCOLLATIONを指定してプッシュダウンする修正をTrino 365で取り込んでもらいました。

github.com

しかし、このプッシュダウンはオプションとなっており、Trinoのデフォルト設定では無効になっています。有効にするにはTrinoに以下の設定を追加する必要があります。

postgresql.experimental.enable-string-pushdown-with-collate=true

というのもPostgreSQL側でインデックスが張られていてもPostgreSQL側のCOLLATIONでインデックスが作成されているとプッシュダウンした場合にそのインデックスを利用することができないからという理由のようです(Trinoが指定するCOLLATIONでインデックスを作っておく必要がある)。個人的にはどっちにしろフルスキャンするんだからPostgreSQL→Trino間の転送量が減る分インデックスが使えなくてもプッシュダウンした方がマシなのではという気がしないでもないですが…。

実際にこのプッシュダウンが嬉しいケースは限られるかなと思いますが、もしTrinoからレコード数の多いPostgreSQLのテーブルのVARCHAR/CHAR型のカラムに対して範囲検索をしたいという場合はこのオプションの有効にすると速くなるのではないかと思います。前述のようにTrino用にインデックスを作っておくとより効果的です。

なお、最近のTrinoではJDBCコネクタでのプッシュダウンの強化(LIKE検索など)なども進められているようなので、PostgreSQLなどTrinoからJDBCコネクタ経由で接続可能なデータベースの検索パフォーマンスのさらなる向上が期待できそうです。