関西db勉強会ver : mariadb columnstore ベンチマークしちゃいませんか?
TRANSCRIPT
MariaDB ColumnStoreベンチマークしちゃいませんか?
JPMUG 代表 カワノ
ColumnStoreとは?
ColumnStoreの歴史
ColumnStoreとは?
チューニングレスで高い検索パフォーマンスを実現するDWH特化型データベース
ColumnStoreとは?
•分析/集計処理に最適なカラムストアエンジン
•MySQLとの互換性
•専用HW不要
•リニアにスケールアウト
アーキテクチャ
大規模並列処理
Clients
UserModule
PerformanceModule
ColumnStore DistributedData Storage
User sessions
MariaDBSQL Front End
Query Engine
Local Storage, SANEBS,HDFS…
アーキテクチャ
対称型マルチプロセッシング(SMP)
Clients
UserModule
PerformanceModule
ColumnStore DistributedData Storage
User sessionsMariaDBSQL Front End
Query Engine
Local Storage, SANEBS,HDFS…
CPU
アーキテクチャ
Extent Map
• 物理的なセグメントファイル内に存在する論理ブロック
• エクステント及び対応するブロックを管理
• データの抽出と配置は、エクステントマップにより高速で処理される
• リアルタイム解凍と圧縮
• バージョンバッファーファイル(UNDO)
アーキテクチャ
Extent Map
SELECT
COL – D
FROM
TABLE
WHERE
COL - D BETWEEN 110 AND 180
;
アーキテクチャ
Extent Map
SELECT
COL – D
FROM
TABLE
WHERE
COL - D BETWEEN 110 AND 180
;
リニアにスケールアウト
11
おまけ
Transaction
Engine Transactions XA
Columnstore YES NO
MyISAM NO NO
InnoDB YES YES
Transaction
ColumnStore vs InnoDB
sysbench# sysbench --test=oltp --db-driver=mysql --mysql-socket=/usr/local/mariadb/columnstore/mysql/lib/mysql/mysql.sock--num-threads=1 --max-requests=500 --max-time=0 --oltp-test-mode=complex --mysql-user=sbtest--mysql-password=sbtest --oltp-test-mode=nontrx --oltp-nontrx-mode=insert run
※ columnstoreは並列度が1じゃないとlockエラーするのでnum-threads=1で比較
TPC-H Benchmark
InnoDB vs ColumnStore
TPC-H Benchmark
検証環境
最小構成 検証環境
CPU 8 core Intel / AMD 8 core Intel (Core i7-4790K)
Memory 32GB 32GB
Storage 適切なRAID冗長構成を組んだローカルディスク、もしくはネットワーク接続ストレージ。
240GB(RAID0)
対応OS RHEL/CentOS v6, v7
Ubuntu 16.04 LTS
Debian v8
SUSE 12
CentOS Linux
release 7.3.1611(Core)
HammerDB Install
TPC-H Benchmark
HammerDB Install
•Release 2.23 for Linux 64-bit をダウンロード
•実行権限を付与した上でインストーラを実行
TPC-H Benchmark
HammerDB Install
実行権限付与
# chmod a+x HammerDB-2.23-Linux-x86-64-Install
#./HammerDB-2.23-Linux-x86-64-Install
…インストールウィザードで導入
TPC-H Benchmark
HammerDB 起動確認
起動
# cd /usr/local/HammerDB-2.23
# ./hammerora.tcl
起動時に下記エラーが出る場合
wish8.5: error while loading shared libraries: libXss.so.1: cannot open shared object file: No such file or directory
# yum install libXScrnSaver
TPC-H Benchmark
HammerDB 初期値設定
config.xml編集
# cd /usr/local/HammerDB-2.23
# vi config.xml
TPC-H Benchmark
HammerDB 初期値設定
<?xml version="1.0" encoding="utf-8"><hammerdb>
...<benchmark>
<rdbms>MySQL</rdbms><bm>TPC-H</bm>
</benchmark>...
</hammerdb>...<mysql>
...<tpch>
<schema><mysql_scale_fact>1</mysql_scale_fact><mysql_tpch_user>root</mysql_tpch_user><mysql_tpch_pass>root_password</mysql_tpch_pass><mysql_tpch_dbase>tpch</mysql_tpch_dbase><mysql_num_tpch_threads>1</mysql_num_tpch_threads><mysql_tpch_storage_engine>innodb</mysql_tpch_storage_engine>
</schema>...
</tpch>...
データベース作成
TPC-H Benchmark
InnoDBデータベース作成
MySQL Host 127.0.0.1
MySQL Port 3306
MySQL User root
MySQL User password rootのパスワード
MySQL Database tpch
Data Warehouse Storage engine innodb
Scale Factor 10
Virtual Users Build Schema 1
TPC-H Benchmark
InnoDBデータベース作成
TPC-H Benchmark
ColumnStore データベース作成
InnoDB用 TPC-H データベースおよびテーブル確認
# mcsmysql -u root -p -D tpch...MariaDB [tpch]> show tables;+----------------------+| Tables_in_tpch |+----------------------+| customer || lineitem || nation || orders || part || partsupp || region || supplier |+----------------------+
TPC-H Benchmark
ColumnStore データベース作成
全てのテーブルをCSV出力
MariaDB [tpch]> SELECT * FROM customer INTO OUTFILE '/usr/local/mariadb/columnstore/mysql/tpch/customer.csv’FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"';
…
TPC-H Benchmark
ColumnStore データベース作成
データベース作成
MariaDB [tpch]> CREATE DATABASE tpch_mcs CHARACTER SET utf8;Query OK, 1 row affected (0.00 sec)
MariaDB [tpch]> use tpch_mcs;Database changed
…
TPC-H Benchmark
ColumnStore データベース作成
テーブル作成
MariaDB [tpch_mcs]> CREATE TABLE nation (N_NATIONKEY INTEGER NOT NULL,N_NAME CHAR(25) NOT NULL,N_REGIONKEY INTEGER NOT NULL,N_COMMENT VARCHAR(152))
ENGINE=columnstore DEFAULT CHARSET=utf8;
…
※index等 columnstoreでエラーになる構文を削除
TPC-H Benchmark
ColumnStore CSVインポート
全のCSVファイルをインポート
# cpimport tpch_mcs customer '/usr/…/tpch/customer.csv' -s ',' -E '"'
…
DB TABLE File path option
データサイズ確認
TPC-H Benchmark
Table行数
Table_schema Table_name Rows
tpch lineitem 58,025,902
tpch orders 14,807,501
tpch partsupp 9,691,914
tpch part 1,980,115
tpch customer 1,485,848
tpch supplier 99,036
tpch nation 25
tpch region 5
Scale Factor = 10
Virtual Users Build Schema = 1
Scale Factor=1 で作成した場合lineitemの行数が600万行程度エクステントマップが効かないので 10 で作成
※
※
TPC-H Benchmark
データサイズ確認
InnoDB
MariaDB [tpch_mcs]> use tpch;...MariaDB [tpch]> SELECT
table_schema ,table_name ,engine ,table_rows AS tbl_rows ,avg_row_length AS rlen ,FORMAT( (data_length + index_length) / (1024*1024*1024), 2) AS All_GB , FORMAT( (data_length) / (1024*1024*1024), 2) AS Data_GB ,FORMAT( (index_length) / (1024*1024*1024), 2) AS Index_GBFROM information_schema.tables
WHERE TABLE_SCHEMA='tpch’ORDER BY (data_length + index_length) DESC;
TPC-H Benchmark
データサイズ確認
ColumnStore
MariaDB [tpch]> call columnstore_info.table_usage( NULL, NULL);
TPC-H Benchmark
データサイズ比較 (GB)
InnoDB ColumnStore
Table_schema Table_name Data Index Total Data Dict Total
tpch lineitem 7.83 7.55 15.38 3.03 1.94 4.97
tpch orders 1.84 0.59 2.42 0.61 1.38 1.99
tpch partsupp 1.93 0.19 2.11 0.22 1.00 1.22
tpch part 0.30 0.00 0.30 0.52 0.44 0.96
tpch customer 0.27 0.02 0.29 0.45 0.38 0.83
tpch supplier 0.02 0.00 0.02 0.01 0.13 0.14
tpch nation 0.01 0.00 0.01 0.01 0.01 0.01
tpch region 0.01 0.00 0.01 0.01 0.01 0.01
Total 20.54 10.13
TPC-H Benchmark
データサイズ比較 (GB)
InnoDBと比較してデータサイズが51%減少大幅なDisk I/O削減が期待できる
クエリ書き換え
TPC-H Benchmark
クエリ書き換え
Query # Error
Query 2 ERROR 1815 (HY000): Internal error: IDB-3012: Scalar filter and semi join are not from the same pair of tables.
Query 5 ERROR 1815 (HY000): Internal error: IDB-1003: Circular joins are not supported.
Query 17 ERROR 1815 (HY000): Internal error: IDB-3012: Scalar filter and semi join are not from the same pair of tables.
Query 19 ERROR 1815 (HY000): Internal error: IDB-1000: 'lineitem' and 'part' are not joined.
ColumnStoreで実行する場合クエリを書き換える必要がある
TPC-H Benchmark
Query 2
TPC-H Benchmark
Query 5
TPC-H Benchmark
Query 17
TPC-H Benchmark
Query 19
TPC-H Benchmark
hdb_tpch.tcl書き換え
hdb_tpch.tcl のクエリを書き換える
# cd /usr/local/HammerDB-2.23
# vi hdb_tpch.tcl
TPC-H Benchmark
hdb_tpch.tcl書き換え
#TPCH QUERY GENERATIONproc set_query { myposition } {global sqlset sql(1) "select l_returnflag, l_linestatus, sum(l_quantity)…set sql(2) "select s_acctbal, s_name, n_name, p_partkey, p_mfgr……set sql(5) "select n_name, sum(l_extendedprice * (1 - l_discount)) ……set sql(17) "select sum(l_extendedprice) / 7.0 as avg_yearly from ……set sql(19) "select sum(l_extendedprice * (1 - l_discount)) as revenue ……set sql(22) "select cntrycode, count(*) as numcust, sum(c_acctbal) as }
6,081 ~ 6,106 行目
TPC-H Benchmark
hdb_tpch.tcl download
JPMUG-KK/MariaDB
https://github.com/JPMUG-KK/MariaDB
my.cnf 編集
TPC-H Benchmark
my.cnf 編集
# cd /usr/local/mariadb/columnstore/mysql
# vi my.conf
…
# You can set .._buffer_pool_size up to 50 - 80 %# of RAM but beware of setting memory usage too highinnodb_buffer_pool_size = 20GB#innodb_additional_mem_pool_size = 20M# Set .._log_file_size to 25 % of buffer pool size#innodb_log_file_size = 100M#innodb_log_buffer_size = 8M#innodb_flush_log_at_trx_commit = 1#innodb_lock_wait_timeout = 50
InnoDBでベンチマーク時のみ有効にする
ベンチマーク実行
TPC-H Benchmark
ベンチマーク実行
MySQL Host 127.0.0.1
MySQL Port 3306
MySQL User root
MySQL User password rootのパスワード
MySQL Database tpch or tpch_mcs
Data Warehouse Storage engine innodb
Scale Factor 10
Virtual Users Build Schema 1
TPC-H Benchmark
ベンチマーク実行
TPC-H Benchmark
ベンチマーク実行
Virtual Users 1
User Delay(ms) 0
Repeat Delay(ms) 0
Iterations 1
Show Output Check
Log Output Temp Uncheck
TPC-H Benchmark
ベンチマーク実行
ベンチマーク結果
TPC-H Benchmark
ベンチマーク比較(sec)
Engine
Query
1 2 3 4 5 6 7 8 9 10 11
InnoDB 83.21 17.97 28.69 2.46 76.25 16.04 7.54 22.17 234.23 4.77 2.01
ColumnStore 7.74 1.38 1.87 7.86 2.82 0.63 8.29 1.81 8.02 2.32 0.39
Engine
Query
12 13 14 15 16 17 18 19 20 21 22
InnoDB 110.70 20.71 2.64 39.38 2.83 5.40 - 2.38 1.35 12.96 0.82
ColumnStore 1.43 4.02 1.05 1.36 1.37 12.48 6.69 3.45 3.36 12.32 4.67
TPC-H Benchmark
ベンチマーク比較
TPC-H Benchmark
ベンチマーク比較
TPC-H Benchmark
考察
• ColumnStoreの真価を発揮できているだろうか?• ColumnStoreの真価は並列処理とエクステントマップの有効活用
TPC-H Benchmark
実行計画を取得する
• EXPLAINでは有益な情報を得られない
•専用関数 calSetTrace(), calGetTrace() を使用する
TPC-H Benchmark
実行計画を取得する
MariaDB [tpc_mcs]> select calSetTrace(1);MariaDB [tpc_mcs]> select l_returnflag, l_linestatus, sum(l_quantity) as sum_qty, …
MariaDB [tpc_mcs]> select calGetTrace();
TPC-H Benchmark
実行計画を取得する
Desc Mode Table TableOID ReferencedColumns PIO LIO PBE Elapsed Rows
BPS PM lineitem 4042 (L_DISCOUNT, L_EXTENDEDPRICE, L_LINESTATUS, L_QUANTITY, L_RETURNFLAG, L_SHIPDATE, L_TAX)
136074 278562 0 7.451 488
TNS UM 7.354 4
Partition Blocks Eliminated• エクステントマップにより読み飛ばしたブロックサイズ• この値が0の場合、エクステントマップの恩恵を得られていない
Query 1 実行計画
TPC-H Benchmark
エクステントマップ確認
•調査対象のカラムOID取得
• editemプロセスからエクステントマップ情報を取得• 引数にカラムID必須
エクステントマップ確認
カラムOID取得
Select`schema`,`tablename`,`columnname`,`objectid`
Fromcalpontsys.syscolumn
Where`schema` = ‘対象スキーマ名’and `tablename` = ‘対象テーブル名’and `tablename` = ‘対象カラム名’
;
エクステントマップ確認
editemプロセスから情報取得
[myuser@srv1~]# /usr/local/mariadb/columnstore/bin/editem -o 4043
Col OID = 4043, NumExtents = 8, width = 45306368 - 5310463 (4096) min: 130551998, max: 130987966, seqNum: 1, state: valid, fbo: 0, DBRoot: 1, part#: 0, seg#: 0, HWM: 0; status: avail5468160 - 5472255 (4096) min: 130551998, max: 130987966, seqNum: 1, state: valid, fbo: 0, DBRoot: 1, part#: 0, seg#: 1, HWM: 0; status: unavail5621760 - 5625855 (4096) min: 130551998, max: 130987966, seqNum: 1, state: valid, fbo: 0, DBRoot: 1, part#: 0, seg#: 2, HWM: 0; status: unavail…
TPC-H Benchmark
エクステントマップ確認
state Num min max seqNum fbo DBRoot part# seg# HWM
valid 5306368 - 5310463 (4096) 130551998 130987966 1 0 1 0 0 0
valid 5468160 - 5472255 (4096) 130551998 130987966 1 0 1 0 1 0
valid 5621760 - 5625855 (4096) 130551998 130987966 1 0 1 0 2 0
valid 5775360 - 5779455 (4096) 130551998 130987966 1 0 1 0 3 0
valid 5928960 - 5933055 (4096) 130551998 130987966 1 4096 1 0 0 8191
valid 6074368 - 6078463 (4096) 130551998 130987966 1 4096 1 0 1 8191
valid 6219776 - 6223871 (4096) 130551998 130987966 1 4096 1 0 2 8191
valid 6365184 - 6369279 (4096) 130551998 130987966 1 4096 1 0 3 4725
各エクステントの MIN/MAX値 が同値=絞り込み不可
lineitem テーブル l_shipdateカラム エクステントマップ詳細
まとめ
TPC-H Benchmark
まとめ
•ColumnStoreはInnoDBと比較して7倍高速• ただし並列処理の恩恵のみ
TPC-H でベンチマークする場合エクステントマップの恩恵は得られない
• エクステントマップの恩恵を得られれば更に高速化できる余地はある
•Columnstore.xml•AllowDiskBasedJoin = Y
•my.cnf• infinidb_use_decimal_scale = 1• infinidb_decimal_scale = 3
TPC-H Benchmark
SF100~大きなデータサイズでの検証
Query22 が失敗する場合
Query1 が失敗する場合
TPC-H Benchmark
CPU使用率傾向の違い
InnoDB ColumnStore
おまけ
mariadb-columnstore-samples
Flight data source
• mariadb-corporation/mariadb-columnstore-samples• https://github.com/mariadb-corporation/mariadb-
columnstore-samples/tree/master/flights# このサンプルでは2016年のデータのみ
• 2013~2017 flight data• https://downloads.mariadb.com/ColumnStore/sampledata
/flights/
mariadb-columnstore-samples
Flight data summary
TableName Rows InnoDB ColumnStore
Flight 約2,300万 2.46GB 1.24GB
airports 342 0.06MB 9.55MB
airlines 17 0.02MB 2.25MB
ベンチマークしちゃいませんか?
Thank you so, so much!