(この記事は 地平線に行く とのマルチポストです)
こんな感じの単純な SQL を Ruby と Go それぞれで流したら、なぜか Go の方が遅くなりました。
特に text
が長いと遅い…。
SELECT
id
, text
FROM
example
使っているライブラリは、ruby-oci8, go-oci8。
原因
原因は、それぞれのライブラリのパラメータのデフォルト値が異なるためでした。
ライブラリ | prefetch_rows | prefetch_memory |
---|---|---|
ruby-oci8 | 100 | 0 |
go-oci8 | 0 | 4,096 |
ruby-oci8 だと、メモリ使用量に関係なく 100 行をプリフェッチ。
go-oci8 だと、行数に関係なく 4,096 bytes をプリフェッチ。
なので、go-oci8 の方はメモリ使用量は安定して低いのですが、取ってくるデータが多いと何度も細かくフェッチするので遅くなります。
対策
ruby-oci8 と同じ値を接続文字列 (DSN) で設定すれば大丈夫です。
scott/tiger@localhost?prefetch_rows=100&prefetch_memory=0
もしくは、下記のドキュメントを読んでチューニングしてみるといいかも。
プリフェッチ・カウントの設定について - Oracle® Call Interfaceプログラマーズ・ガイド