LoginSignup
1
0

More than 3 years have passed since last update.

パラメータ設定が不適切だと、ruby-oci8 より go-oci8 の方が遅くなることもあるので要注意

Last updated at Posted at 2019-06-07

(この記事は 地平線に行く とのマルチポストです)

こんな感じの単純な 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プログラマーズ・ガイド

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0