pg_nosql_benchmark

昨年、PostgreSQL 9.4-betaバージョンの頃から、なんとなくJSONB型を追ってきたわけですが、最近はライバル(?)であるMongoDBとの比較なんかもやってまして、今日はちょっとしたベンチマークで性能を比較してみましたよっと。

pg_nosql_benchmark

このベンチマーク、昨年にEnterpriseDB社がGithub上で公開したベンチマークです。
GitHub - EnterpriseDB/pg_nosql_benchmark: A tool which can be used to benchmark PostgreSQL (JSONB) and MongoDB (BSON)

で、このベンチマーク結果を公開してるわけですが、ホントにそんなに差があるのかと、若干疑問は持っていたわけです。
なので、件数的には小スケールではあるけど、手元にあるVM環境でも、このベンチマークを使って測定してみましたよ。

pg_nosql_benchmarkの概要
  • 実は単なるbashスクリプトだよ。
  • psqlとmongoシェルを叩くスクリプトだよ。
  • シングルタスクで動くベンチマークだよ。
    • だからレスポンスは測定できるけど、マルチクライアントからのアクセスによるスループットはこれでは測定できないよ。
  • 測定内容
    • JSONデータのバルクロード。PostgreSQLならCOPY文、MongoDBならmongoimportを使っているよ。
    • JSONデータのINSERT。PostgreSQLならINSERT文、MongoDBなら、db.コレクション名.insert()を使っているよ。
    • ロードしたデータの検索。PostgreSQLならSELECT文、MongoDBなら、db.コレクション名.find()を使っているよ。
    • update性能やtruncate相当の性能は測定してないよ。
      • updateはPostgreSQLの苦手な部分だから、測定しなきゃとは思うけど。
    • データサイズも測定しているよ。
    • クラスタ構成に関しては、今後の課題みたいだよ。
      • MongoDBの場合、クラスタ構成が簡易に簡易に組めるのが売りの一つだと思うので、この測定がMongoDBの能力をフルに発揮出来ているのかというと、ちょい微妙な気もする。
  • PostgreSQLの場合、JSONBカラムを一つだけもつテーブルを定義し、JSONBカラムに対してGINインデックスを設定しているみたいだよ。
  • ダウンロードしたシェルはそのままでは動作しないよ。
    • PostgreSQLやMongoDBへの接続情報は少なくとも修正が必要なはず。
  • 文書数は pg_nosql_benchmark シェルスクリプト内の json_rows という変数を修正して変動可能だよ。
    • つーか、それくらはパラメータ指定にしてほしかった気が・・・
    • MongoDBの場合は、ユーザ追加が必要。手順はドキュメントには書いてあるけど。

測定環境

  • 例によって、いつも使っているLet's note上に構築したVMWareCentOS 7.0。
  • ディスクはSSD
  • 測定したバージョン
  • PostgreSQLのチューニングはほとんどしてない。
    • shared_buffers, checkpoint_segmentsくらいは変更しても良かったかなー。
  • MongoDBのチューニング?何それ?というか、レスポンス測定に効くようなパラメータってあるのかなー?
  • VM上のディスク容量にかなり制約がある・・・

今回の測定

  • json_rows のパラメータのみを変更
  • 文書数は10000, 50000, 100000, 200000, 300000の5パターン。
    • ホントは1000000まで測定したかったけど、ディスク容量の制約ががが
    • 400000の測定も試したけど、 "no lefrt device" とかwww

測定結果

あくまでも参考値として捉えてください。

  • 基本的にどの測定結果も文書数に応じて線形な性能値なので、あまり面白い結果ではない。
バルクロード


INSERT


  • PostgreSQLのほうが3.9〜4.4倍程度高速。
SELECT

  • PostgreSQLのほうが、おおよそ2.5倍程度高速。
Data Size

  • PostgreSQLよりもMongoDBのほうが、おおよそ3倍程度データサイズが大きい

所感

  • バルクロードとINSERTに関しては、EDBのレポートとそんなに変わりない印象かな。
  • SELECTの結果についてはEDBのレポートほど大きな差はついてない。これはCPUスペックの差なのかな・・・?
  • 年末に、シンプルな文書モデル(階層なし、配列なし)で測定したときには、INSERT性能にあまり大きな差はなかった。
    • つまり、文書の複雑度に応じて、MongoDBのINSERT(推測ではバルクロードも)性能にかなり影響があるのかも・・・。