20150530 pgunconf-ycsb-jsonb
TRANSCRIPT
YCSB とは
Yahoo! Cloud Service Benchmark の略
いろんな NoSQL 系に対応したベンチマーク
https://github.com/brianfrankcooper/YCSB
YCSB とは対応している DB
PNUTS 、 BigTable 、 HBase 、Hypertable 、 Azure 、 Cassandra 、
CouchDB 、 Voldemort 、 MongoDB 、OrientDB 、 Infinispan 、 Dynomite 、
Redis 、 GemFire 、 GigaSpaces XAP 、 DynamoDB 、 JDBC
YCSB JSONB 対応版JDBC 版テーブル定義CREATE TABLE usertable (ycsb_key text, field1 text, field2 text, field3 text, field4 text, field5 text, field6 text, field7 text, field8 text, field9 text, field10 text);CREATE INDEX ycsb_key_idx ON usertable (ycsb_key);
JSONB 版テーブル定義CREATE TABLE usertable(data jsonb);CREATE INDEX ycsb_pk_idx ON usertable USING btree ((data->'YCSB_KEY'));
YCSB JSONB 対応版JDBC 版挿入 SQLINSERT INTO usertable VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
JSONB 版挿入 SQLINSERT INTO usertable VALUES(json_build_object('YCSB_KEY', ?, 'FIELD1', ?, 'FIELD2', ?, 'FIELD3', ?, 'FIELD4', ?, 'FIELD5', ?, 'FIELD6', ?, 'FIELD7', ?, 'FIELD8', ?, 'FIELD9', ?, 'FIILD10', ?)::jsonb)
9.5-develだとjsonb_build_object()があるので、 JSONBへの
キャストは不要
YCSB JSONB 対応版JDBC 版更新 SQLUPDATE usertable SET FIELD1 = ? WHERE YCSB_KEY = ?
JSONB 版更新 SQLUPDATE usertable SET data = json_build_object('YCSB_KEY', data->>'YCSB_KEY', 'FIELD1', ?, 'FIELD2', data->>'FIELD2', 'FIELD3', data->>'FIELD03', 'FIELD4', data->>'FIELD4', 'FIELD5', data->>'FIELD5', 'FIELD6', data->>'FIELD6', 'FIELD7', data->>'FIELD7', 'FIELD8', data->>'FIELD8', 'FIELD9', data->>'FIELD9', 'FIELD10', data->>'FIELD10')::jsonbWHERE data->>'YCSB_KEY' = ?
9.5-devel だとjsonb_build_object() があるので、 JSONB への
キャストは不要
見ただけでうんざりしますよね。
YCSB JSONB 対応版JDBC 版更新 SQLUPDATE usertable SET FIELD1 = ? WHERE YCSB_KEY = ?
PostgreSQL 9.5 JSONB 版更新 SQLUPDATE usertable SET data = data || json_build_object('FIELD1', ?)WHERE data->>'YCSB_KEY' = ?
まだ試してないけどめっさスッキリ書けるはず
参考
YCSB JSONB 対応版JDBC 版参照 SQLSELECT * FROM usertableWHERE YCSB_KEY = ?
JSONB 版参照 SQLSELECT * FROM usertableWHERE data->>'YCSB_KEY' = ?
MongoDB 比較まとめ
今回は、一言でいうと測定環境がPostgreSQL + JSONB に
かなり不利かも( CPU 数が少ないので並列性の優位がでない)
でも、更新はやっぱり遅いね・・・参照はほぼ互角かな。
MongoDB 比較課題
・ CPU リソース等きちんと確認せねば。⇒JSONB が CPU 結構使う疑惑
・コア数が多いマシンで試したい。⇒PostgreSQL が有利になるはず?
⇒AWS EC2 使うか・・・・シャード環境での確認
⇒MongoDB シャードとの比較⇒PostgreSQL は? pgpool? pg_shard?
MongoDB 比較測定環境 2
m3.2xlarge on-demandCPU 数 8 、メモリ 30GB
( 面倒だったので CL-SV 同居 )
測定のためにラーメン一杯分くらいのコストがかかったよ!
MongoDB 比較ロード処理
0 5 10 15 20 250
2000
4000
6000
8000
10000
12000
14000
16000
YCSB load Throughput
PostgreSQL 9.4
MongoDB 3.0
number of concurrency
Th
rou
gh
pu
t(o
ps
/se
c)
MongoDB 比較更新と参照
0 5 10 15 20 250
5000
10000
15000
20000
25000
YCSB load Workload-a Throughput
PostgreSQL 9.4
MongoDB 3.0
number of concurrency
Th
rou
gh
pu
t(o
ps
/se
c)
10000(opt/sec)程度になるはずなのに・・・
MongoDB 比較参照のみ
0 5 10 15 20 250
10000
20000
30000
40000
50000
60000
YCSB workload-c Throughput
PostgreSQL 9.4
MongoDB 3.0
number of concurrency
Th
rou
gh
pu
t(o
ps
/se
c)
MongoDB 比較まとめ
PostgreSQL は CPU 数がないとスループットだせないね。
逆に言えば MongoDB は CPU 数が多いマシンで動かしても嬉しくない。
⇒ その代わりシャードで書き込み分散?
MongoDB 比較
YCSB 修正の課題・ YCSB 対応版の修正方法がやっつけすぎ。
まだ公開できるレベルじゃない。・今回は直接 JDBC 版直したので、
きちんと JSONB 版として作成しなおしたい。・ INSERT の SQL と UPDATEの SQL は本当にこれでいいのだろうか・・・
⇒9.5 で改善できるかも