PostgreSQL をベースとしたカラムストア機構の実現検討

DEIM Forum 2015 E4-2
PostgreSQL をベースとしたカラムストア機構の実現検討
中村 実† 田原 司睦†
宇治橋 善史† 橋田 拓志† 河場 基行† 原田 リリアン†
†富士通研究所 ICT システム研究所 〒211-8588 川崎市中原区上小田中 4-1-1
E-mail: †{nminoru, tabaru, ujibashi, hashida.takushi, kawaba, harada.lilian}@jp.fujitsu.com
あらまし 近年、トランザクション処理と高速分析処理を兼ね備えた OLXP の必要性が高まっている。我々は
OSS の RDBMS である PostgreSQL 9.4 をベースとして、OLXP システムを実現するための設計・開発を行っている。
我々のシステムではテーブルに Column Store Index(CSI)と呼ぶ独自インデックスを付与することで列形式の複製テ
ーブルを生成し、スキャン・ソート・集計処理を高速化する。ユーザは行形式テーブル、列形式テーブルの参照を
意識する必要がなく、実行時に自動的に選択される。本発表では PostgreSQL ベースの OLXP システム実現に向けた
拡張機能について概要を説明する。
キーワード カラムナー,ベクター処理,PostgreSQL,OLXP
1.
はじめに
リレーショナルデータベースマネージメントシス
それぞれが分離したシステムと 同程度の性能を出すこ
とは困難である。
テ ム (RDBMS)に お い て 、一 件 あ た り の デ ー タ 量 は 比 較
的小さいが挿入・更新・削除の操作が短期間 に大量に
我 々 は OSS の RDBMS で あ る PostgreSQL 9.4[5]を ベ
発 生 す る オ ン ラ イ ン ト ラ ン ザ ク シ ョ ン 処 理 (Online
ー ス と し た OLXP シ ス テ ム の 開 発 を ス タ ー ト し た
Transaction Processing、OLTP)の ワ ー ク ロ ー ド と 、す で
[6][7][8]。 PostgreSQL を 選 択 し た 理 由 は 、 PostgreSQL
に蓄積されたデータを広範囲に読み込み複雑な統計処
が OLTP RDBMS と し て PowerGres Plus や Symfoware
理 を 行 う オ ン ラ イ ン 解 析 処 理 (Online Analytical
Server V12 な ど の 実 績 が あ る た め で あ る 。我 々 の OLXP
Processing, OLAP)の ワ ー ク ロ ー ド の 2 種 類 が あ る こ と
シ ス テ ム は 、 特 に 従 来 と 同 程 度 の OLTP 性 能 を 実 現 し
が 知 ら れ て い る 。 そ し て RDBMS の 構 成 方 法 と し て 、
た 上 で 、 OLAP 性 能 を 向 上 さ せ る こ と を 目 標 と す る 。
OLTP ワ ー ク ロ ー ド に 特 化 す る 場 合 、 デ ー タ ス ト ア を
さらに以下のような機能要件を設けて設計を行ってい
行形式で格納すると効率よく処理できることが知られ
る。
て い る 。 一 方 、 OLAP に お い て は 蓄 積 さ れ た デ ー タ の
中で特定のカラムに注目して分析することが多く、同
1.
既存の行形式テーブルに対するインデックス
じカラムを固めて格納する列形式が向いていることが
と し て 列 形 式 テ ー ブ ル を 実 現 す る 。こ れ に よ り
知られている。
行
形
式
テ
ー
ブ
ル
に
対
す
る
し か し OLTP&行 形 式 デ ー タ ス ト ア と OLAP&列 形 式
INSERT/DELETE/UPDATE 操 作 を 捕 捉 す る こ と
データストアは相反する性質を持っている ため、一つ
が 可 能 に な る 。た だ し イ ン デ ッ ク ス と し て 実 装
の RDBMS で 処 理 す る こ と は 困 難 で あ る 。 そ の た め
す る た め 、同 じ デ ー タ を 行 形 式 と 列 形 式 で 二 重
別 々 の シ ス テ ム を 用 意 し て OLTP シ ス テ ム か ら OLAP
に保持することになる。
シ ス テ ム へ ETL(Extract Transform Load)ツ ー ル な ど を
2.
用いて一定間隔でデータをロードするという使い方が
処理の負荷が高い時は反映を遅延させること
一般的であった。
し か し 近 年 、 ビ ジ ネ ス の 世 界 で は OLTP シ ス テ ム の
列 形 式 テ ー ブ ル へ の 反 映 を 非 同 期 に 行 い 、OLTP
で OLTP 性 能 の 低 下 を 防 ぐ 。
3.
行形式テーブルに対してアクセスするか列形
持 つ デ ー タ を リ ア ル タ イ ム に 分 析 で き る RDBMS の 存
式テーブルにアクセスするかをコスト評価に
在 が 必 要 と さ れ る よ う に な っ て き た 。こ の よ う な OLTP
よ っ て 自 動 的 に 切 り 替 え る 。ユ ー ザ ー は ア ク セ
と OLAP が 混 在 し た ワ ー ク ロ ー ド は OLXP と 呼 ば れ [4]、
ス す る テ ー ブ ル を 意 識 す る 必 要 が な い 。こ の 実
OLAP ワ ー ク ロ ー ド を 効 率 的 に 処 理 可 能 な デ ー タ ベ ー
現のために列形式テーブルに対するアクセス
ス は OLXP シ ス テ ム と 呼 ぶ こ と が で き る 。こ の よ う な
が PostgreSQL と 完 全 に 互 換 な MVCC を 実 現 す
OLXP シ ス テ ム は 研 究 レ ベ ル ・ 商 業 レ ベ ル の 両 方 で 発
表 さ れ て い る (SAP HANA[1],Oracle Database 12c[2],
HyPer[3])。 し か し OLXP シ ス テ ム は 、 OLTP と OLAP
る必要がある。
4.
列形式データをベクター処理することでプラ
ンツリーの実行に対するオーバーヘッドを削
減し高速化する。
5.
マルチコアを利用しクエリーを並列処理する。
6.
列 形 式 テ ー ブ ル の 圧 縮 す る こ と で 、使 用 デ ィ ス
ク 量 を 減 ら す 。ま た 圧 縮 に よ り デ ィ ス ク か ら 読
み 込 み 時 の I/O 量 を 減 ら す こ と で 高 速 化 す る 。
我 々 は こ れ ら の 目 標 を 満 た す OLXP シ ス テ ム を
PostgreSQL 本 体 か ら 分 離 し た エ ク ス テ ン シ ョ ン と し
て 実 現 す る よ う に 設 計 し た 。 こ れ を Column Store
Index(CSI)と 名 付 け た 。
なお現在の設計では、更新を含まない参照のみのク
エリーの中でテーブルスキャン、ソート、集約
(Aggregation) を 高 速 化 の 対 象 と す る 。 テ ー ブ ル 結 合
(Join)は 今 後 の 課 題 と し て い る 。
ト ラ ン ザ ク シ ョ ン 分 離 レ ベ ル は READ COMMITTED
と REPEATABLE READ の み カ ラ ム ス ト ア を 用 い た 高
速 実 行 を 試 み 、 SERIALIZABLE で は オ リ ジ ナ ル の
PostgreSQL で 動 作 す る 。
2.
DBMS デ ー モ ン プ ロ セ ス
(postmaster) を 中 心 と し た 複 数 の プ ロ セ ス で 構 成 さ れ
る 。 ク ラ イ ア ン ト が ソ ケ ッ ト 経 由 で postmaster へ 接 続
す る と 、 postmaster は 自 身 を fork し て バ ッ ク エ ン ド プ
ロセスを作成する。以降はクライアントとバックエン
ドプロセス間でセッションを確立し、バックエンドプ
ロセスがクライアントからのクエリーを処理する。
PostgreSQL は マ ル チ ス レ ッ ド に 対 応 し て お ら ず 、各 セ
ッションのクエリーは一部の処理を除いてシングルプ
ロセスで逐次処理される。
PostgreSQL の デ ー タ ベ ー ス は フ ァ イ ル シ ス テ ム 上
に 記 録 さ れ る 。1 つ の テ ー ブ ル は 1GB 単 位 で 分 割 さ れ
た フ ァ イ ル 群 と し て 構 成 さ れ る 。PostgreSQL は こ の フ
ァ イ ル 群 を Relation を 呼 ぶ 。 テ ー ブ ル 以 外 に イ ン デ ッ
ク ス や ビ ュ ー も relation と し て 記 録 さ れ る 。 例 え ば
CREATE INDEX に よ っ て イ ン デ ッ ク ス を 作 成 す る と 、
Index Relation が 1 つ 新 規 に 作 成 さ れ る こ と に な る 。
PostgreSQL は 共 有 メ モ リ 上 に 共 有 バ ッ フ ァ を 持 ち 、
relation を 8KB を 単 位 の ブ ロ ッ ク で ロ ー ド し て 、 や は
り 8KB 単 位 の ペ ー ジ に マ ッ プ す る 。 共 有 バ ッ フ ァ は
PostgreSQL の プ ロ セ ス 間 で 共 有 さ れ て い る 。 Relation
上で連続したページが共有バッファ上で連続したペー
ジに割り当てられる保証はない。
3.
Column Store Index の 設 計
3.1.
CREATE INDEX indexname ON tablename USING csi (a,
b, c);
PostgreSQL の CREATE INDEX 文 が 持 つ USING 句 は
nbtree や hash な ど イ ン デ ッ ク ス 内 部 の ア ル ゴ リ ズ ム を
指 定 す る が 、 こ れ と 並 列 に "csi"キ ー ワ ー ド を 追 加 し て
CSI を カ ス タ ム イ ン デ ッ ク ス と し て 追 加 す る 。ON 句 で
カラムストアを設けるテーブル名を指定し、 その後に
ON 句 で 指 定 し た テ ー ブ ル の 中 の カ ラ ム 名 を a, b, c の
ように列挙する。ここで指定するカラム名のリストは
オ リ ジ ナ ル の PostgreSQL で は イ ン デ ッ ク ス の ソ ー ト
キ ー と な る が 、 CSI で は 列 形 式 デ ー タ へ 変 換 す る カ ラ
ムを指定する効果のみでカラムの並び順にも意味はな
い。
既 成 の テ ー ブ ル に 対 し て CREATE INDEX を 実 行 す
ると、テーブルにすでに格納されているデータを一括
でカラムストアに格納する。
い っ た ん CSI イ ン デ ッ ク ス を 作 成 し た 後 に 、
PostgreSQL
PostgreSQL 9.4 は
う に CREATE INDEX 文 を 実 行 す る 。
利用方法
我 々 は CSI を PostgreSQL の イ ン デ ッ ク ス の 一 つ と し
て 実 現 す る 。 ユ ー ザ ー が CSI を 使 う 場 合 は 、 以 下 の よ
INSERT/UPDATE 文 を 実 行 す る と 、 PostgreSQL は イ ン
デ ッ ク ス 毎 に 設 定 さ れ た コ ー ル バ ッ ク (aminsert) を 呼
び 出 す 。こ の コ ー ル バ ッ ク を CSI イ ン デ ッ ク ス で も 捕
捉 す る 。 一 方 、 PostgreSQL は テ ー ブ ル 中 の タ プ ル が
DELETE さ れ た 場 合 、 そ の 削 除 契 機 を イ ン デ ッ ク ス に
は 通 知 し な い 。 CSI は こ の 機 能 の 不 足 を 補 う た め に 、
タ プ ル 削 除 の 契 機 で も コ ー ル バ ッ ク (amdelete) が 呼 び
出 さ れ る よ う に PostgreSQL 本 体 側 に 変 更 を 加 え て い
る。
3.2.
ストレージ構成
カラムストアは追記的なデータ挿入に適している
が 、 OLTP の よ う に DELETE/UPDATE 文 が ラ ン ダ ム な
位置に発生するワークロードでは効率が低下する。そ
の た め 過 去 列 形 式 RDBMS で は 、 列 形 式 ス ト ア の 前 段
と し て Write-Optimized-Storage(WOS)[9]あ る い は Delta
Store な ど と 呼 ば れ る 行 形 式 格 納 の キ ャ ッ シ ュ を 設 け 、
短期的な更新は行形式で貯めるのが一般的である。そ
し て WOS へ 一 定 量 の デ ー タ が 貯 ま っ た 後 に 非 同 期 な
タイミングで列形式に変換しストレージへ反映する。
こ の 時 、 WOS
に 対 し て 列 形 式 ス ト ア を
Read-Optimized-Storage(ROS)と 呼 ぶ 。
CSI で も WOS と ROS の 二 つ の ス ト ア を 設 け る 。 ま
た CSI が WOS か ら ROS へ 反 映 す る こ と を WOS→ ROS
変 換 と 呼 ぶ こ と に す る 。 CSI の WOS と ROS を 構 成 の
イ メ ー ジ は Figure 1 の よ う に な る 。
3.4.
Read-Optimized-Store(ROS)
CSI の カ ラ ム ス ト ア で あ る ROS は 、 最 大 262,144 行
を 1 つ に ま と め た エ ク ス テ ン ト (extent)単 位 で 管 理 す る 。
こ れ は 一 定 量 の 行 を ま と め て 処 理 す る こ と で ROS の
管理オーバーヘッドを減らし、同時に読み出しを効率
化 す る た め で あ る 。 WOS→ ROS 変 換 は 、 Data WOS が
1 エクステントを構成するために必要な数だけ貯まっ
た 時 に 変 換 を 開 始 す る 。 WOS に は TID の み が 記 録 さ
れ て い る の で 、ROS へ 格 納 す る カ ラ ム デ ー タ は イ ン デ
ックス元となるテーブルからフェッチする。
Figure 1 WOS と ROS の 構 成
エクステントのデータは圧縮が可能な場合に は、列
単位で圧縮を行う。圧縮方式は固定サイズの列には ラ
WOS と ROS は PostgreSQL の relation と し て デ ィ ス
ク に 記 録 す る 。 ROS は 列 ご と に 別 個 の relation を 作 成
ンレングス圧縮を、可変サイズの列には辞書圧縮を行
う。
し て 、 別 々 に デ ィ ス ク に 書 き 出 す 。 Relation を 利 用 し
ま た WOS→ ROS 変 換 で は 、 Whiteout WOS に の み 存
て い る た め WOS と ROS は PostgreSQL の 他 の テ ー ブ ル
在 す る TID に 対 応 す る 行 を ROS か ら 削 除 す る 必 要 が
と 同 様 に Write-Ahead-Logging(WAL)ロ グ を 生 成 す る こ
ある。しかしエクステントの一部行だけが削除された
とができ、システムダウン時には自動的にリカバリー
場合に既存のエクステントを再作成するのはコストが
される。
高 い の で 、 削 除 行 を 示 す delete vector を 導 入 す る 。
CSI は カ ス タ ム イ ン デ ッ ク ス と し て 機 能 す る が 、
ROS に 格 納 す る デ ー タ は ソ ー ト を せ ず に 追 記 順 に 書
き 込 ん で い る 。ROS に 対 す る イ ン デ ッ ク ス や プ ロ ジ ェ
クションを追加するのは今後の課題とする。
3.5.
MVCC
CSI は OLXP を サ ポ ー ト す る た め 、WOS→ ROS 変 換
中 も 含 め て 、 オ リ ジ ナ ル の PostgreSQL に 準 拠 し た
MVCC を 実 施 す る [7]。CSI が MVCC を 守 る た め に は 以
3.3.
Write-Optimized-Store(WOS)
下の 2 つの条件を守る必要がある。
CSI は 本 来 の テ ー ブ ル と カ ラ ム ス ト ア を 二 重 に 保 持
す る た め 、 WOS は テ ー ブ ル 内 の ROS へ 反 映 し て い な
1.
INSERT し た ト ラ ン ザ ク シ ョ ン が ロ ー ル バ ッ ク
い 箇 所 を 記 録 す る だ け の 装 置 と な る 。 OLTP 性 能 を 低
し た 場 合 そ の 行 は INSERT さ れ な か っ た こ と に
下 さ せ な い た め に 、WOS は で き る だ け 処 理 の オ ー バ ー
な る 。 DELETE し た ト ラ ン ザ ク シ ョ ン が ロ ー ル
ヘッドを小さくする必要がある。
バ ッ ク し た 場 合 、そ の 行 は DELETE し な か っ た
PostgreSQL は テ ー ブ ル 内 の 行 (タ プ ル )の 位 置 を 記 録
す る Tuple-ID(TID)と 呼 ぶ 情 報 を 持 つ 。 TID は 32 ビ ッ
ことになる。
2.
WOS→ ROS 変 換 中 に カ ラ ム ス ト ア へ の 参 照 を
ト の ペ ー ジ 番 号 と 16 ビ ッ ト の ペ ー ジ 内 ア イ テ ム 番 号
し た 場 合 で も 、 挿 入 さ れ た 行 が Data WOS と
が 対 に な っ た 48 ビ ッ ト の 識 別 子 で あ る 。 WOS は こ の
ROS で 二 重 に 出 現 す る こ と は 許 さ れ な い 。ま た
TID だ け を 記 録 し 、 タ プ ル 内 の カ ラ ム デ ー タ は 保 持 し
削 除 さ れ た 行 の 情 報 が Whiteout WOS か ら 消 え
な い 設 計 と し た 。 こ れ に よ り INSERT/DELETE に 対 す
delete vector に 出 現 せ ず 削 除 さ れ て な い よ う に
るオーバーヘッドが最小限になる。
見えることも許されない。
CSI の WOS は タ プ ル の 挿 入 を 記 録 す る Data WOS と
タ プ ル の 削 除 を 記 録 す る Whiteout WOS の 二 種 類 を 設
PostgreSQL は テ ー ブ ル 内 に あ る 各 行 が 生 成 ト ラ ン
け る 。イ ン デ ッ ク ス へ 挿 入 (aminsert)が 行 わ れ た 場 合 は 、
ザ ク シ ョ ン ID(Xmin) と 削 除 ト ラ ン ザ ク シ ョ ン
Data WOS 内 に 挿 入 し た 行 の TID を 追 記 す る 。 行 の 削
ID(Xmax)の 情 報 を 持 っ て お り 、テ ー ブ ル ス キ ャ ン の 際
除 が 行 わ れ た 場 合 (amdelete)は 、 Whiteout WOS 内 に 削
には現在のトランザクション情報と照合して「可視な
除 し た 行 の TID を 追 記 す る 。 WOS→ ROS 変 換 時 に は 、
(visible)」な 行 だ け を 読 む 。こ れ が MVCC 制 御 で あ る 。
Data WOS と Whiteout WOS の 両 方 に 存 在 す る TID は 削
CSI は 1 を 守 る た め に 、 Data WOS と Whiteout WOS
除 し 、Data WOS ま た は Whiteout WOS に の み 存 在 す る
に は テ ー ブ ル と 同 様 に Xmin/Xmax の 情 報 を 記 録 す る
TID を ROS へ 移 動 す る 。
(Figure 2)。そ の 上 で WOS→ ROS 変 換 時 に は 、Data WOS
内 の TID は ト ラ ン ザ ク シ ョ ン の 可 視 性 を チ ェ ッ ク し 、
TID を 挿 入 し た ト ラ ン ザ ク シ ョ ン が コ ミ ッ ト 済 か つ 他
の 全 て の ト ラ ン ザ ク シ ョ ン か ら 見 て 可 視 状 態 な TID だ
とが可能になる。
け を ROS に 移 動 さ せ る 。同 様 に Whiteout WOS 内 の TID
も全てのトランザクションから見て可視状態となり削
3.6.
プランの書き換え
除 さ れ た と 判 定 で き る 場 合 に の み ROS の delete vector
CSI は あ る ク エ リ ー が カ ラ ム ス ト ア を 用 い て ア ク セ
へ 反 映 す る 。こ の た め ROS は ロ ー ル バ ッ ク が 起 き て も
スした方が高速であるとコスト評価した場合に限り、
巻 き 戻 す 必 要 の な い デ ー タ だ け を ROS へ 移 動 す る こ
プランを書き換える。プランの書き換えには
とができる。
PostgreSQL 9.5 か ら 導 入 さ れ る Custom Scan API を バ ッ
ク ポ ー ト し て 使 用 し て い る [10]。
プ ラ ン の 書 き 換 え の 対 象 と す る の は 、 SeqScan ノ ー
ド 、Agg ノ ー ド 、Sort ノ ー ド と す る 。こ れ ら を Custom
Scan API を 派 生 さ せ た CSI Scan ノ ー ド 、 CSI Agg ノ ー
ド 、 CSI Sort ノ ー ド に 置 換 す る 。
Figure 2 WOS の ト ラ ン ザ ク シ ョ ン 情 報
次 に 2.を 守 る た め 、 ク エ リ ー の 開 始 時 点 の WOS と
ROS の ス ナ ッ プ シ ョ ッ ト が 読 め る よ う に す る 。 WOS
は相対的に容量が小さいため、クエリー開始時点に
WOS 内 の 可 視 な TID の 行 デ ー タ を テ ー ブ ル か ら 読 み
込み、メモリ上で一時的に列形式データに変換する。
Figure 3 プ ラ ン の 書 き 換 え 位 置
我 々 は こ の デ ー タ 構 造 を Local ROS と 名 付 け た 。Local
ROS の 作 成 と WOS→ ROS の 変 換 は 排 他 的 に 行 っ て お
り 、 プ ラ ン 実 行 中 は Local ROS の み を 参 照 す る こ と で
PostgreSQL は planner の フ ェ ー ズ で 複 数 の ア ク セ ス
ク エ リ ー 開 始 時 点 の WOS の ス ナ ッ プ シ ョ ッ ト を 見 る
パスを提案し、最もコストが小さいものを採用する。
ことができる。
この際、インデックスごとにアクセスパスが生成され
一 方 、ROS は 巨 大 な た め ク エ リ ー 実 行 前 に ス ナ ッ プ
る の で 、 CSI イ ン デ ッ ク ス に 対 し て も ア ク セ ス パ ス を
シ ョ ッ ト を 保 存 す る こ と も 、 ク エ リ ー 実 行 中 に WOS
提 出 す る 機 会 が あ る 。 た だ し CSI は pg_hint_plan な ど
→ ROS 変 換 を 停 止 さ せ る こ と も 実 用 的 で は な い 。そ こ
のプランを書き換える他のエクステンションと併用す
でエクステント単位にトランザクション情報を記録す
ることを想定している。アクセスパスを使ったプラン
る こ と で 、二 段 目 の MVCC を 導 入 す る 。我 々 は エ ク ス
の書き換えは他のエクステンションと干渉する危険性
テ ン ト 生 成 時 の ト ラ ン ザ ク シ ョ ン ID を Xgen、 エ ク ス
が あ る 。そ こ で CSI は 常 に 最 悪 値 と な る コ ス ト を 提 出
テ ン ト 無 効 化 時 の ト ラ ン ザ ク シ ョ ン ID を Xdel と 名 付
し て ア ク セ ス パ ス と し て の 採 用 を 回 避 し 、 PostgreSQL
け た 。 そ の 上 で WOS→ ROS 変 換 自 体 を 独 立 し た ト ラ
本 来 の planner に プ ラ ン を 確 定 さ せ る 。 そ の プ ラ ン ツ
ン ザ ク シ ョ ン で 行 い 、 ト ラ ン ザ ク シ ョ ン ID を エ ク ス
リ ー 中 に SeqScan ノ ー ド 、 Agg ノ ー ド 、 Sort ノ ー ド が
テ ン ト の Xgen に 記 録 す る 。ま た delete vector に 記 録 さ
あ れ ば 、再 度 コ ス ト 評 価 を 行 い CSI ノ ー ド へ の 書 き 換
れる削除された行の数が閾値を越えた エクステントは
え を 実 施 す る (Figure 3)。
生きている行だけを取り出してエクステントを再作成
するが、処理後に不要になった古いエクステントの
Xdel に は ト ラ ン ザ ク シ ョ ン ID を 記 録 す る 。CSI は ROS
3.7.
プラン実行
書 き 換 え た プ ラ ン は ROS と WOS を 組 み 合 わ せ た デ
を 更 新 し た 最 後 の ト ラ ン ザ ク シ ョ ン ID を 記 録 し お り 、
ータセットを参照して実行する必要がある。そのため
ク エ リ ー 開 始 時 に そ の ト ラ ン ザ ク シ ョ ン ID を 読 み 込
に プ ラ ン 実 行 に 先 立 っ て Local ROS を 作 成 す る 。Local
み ク エ リ ー 実 行 中 は 「 Xgen ≦ ク エ リ ー 開 始 時 点 で 最
ROS は Data WOS に 登 録 さ れ た TID の 行 デ ー タ を テ ー
後 に ROS を 更 新 し た ト ラ ン ザ ク シ ョ ン ID < Xdel」
ブ ル か ら 参 照 し 、ROS と 同 様 の 列 形 式 デ ー タ に 変 換 す
が成立するエクステントのみをフェッチすることで、
る 。 ま た Whiteout WOS 内 の TID も 読 み 込 み 、 ソ ー ト
ク エ リ ー 開 始 時 の ROS の ス ナ ッ プ シ ョ ッ ト を 読 む こ
し て メ モ リ 上 に 削 除 リ ス ト と し て 記 録 す る 。ROS か ら
読 み 込 ん だ デ ー タ は 、 delete vector と ソ ー ト 済 み 削 除
を 読 み 込 み 、 こ れ を ベ ク タ ー (vector)と し 、 expression
リ ス ト を マ ー ジ し て 削 除 さ れ た 行 を 決 定 す る (Figure
tree の 各 ノ ー ド は 1 行 単 位 で は な く ベ ク タ ー 単 位 で 処
4)。
理 を 実 行 す る (Figure 6)。
Figure 4 プ ラ ン 実 行 の カ ラ ム ス ト ア ス キ ャ
ンのイメージ
Figure 6 ベ ク タ ー 処 理 の イ メ ー ジ
Local ROS を 作 成 す る こ と で CSI の 実 行 エ ン ジ ン は
列 形 式 の み に 対 応 す れ ば よ い 。 し か し Local ROS を ク
3.9.
並列実行
エリー毎に作成し、毎回破棄しているのはオーバーヘ
CSI は 可 能 な 場 合 に は ク エ リ ー の 並 列 実 行 を 実 現 す
ッ ド が か か る 。た だ し こ の オ ー バ ー ヘ ッ ド は 、WOS→
る 。 こ れ に は PostgreSQL 9.4 か ら 導 入 さ れ た Dynamic
ROS 変 換 が 定 期 的 に 行 わ れ WOS は 一 定 量 に 抑 え ら れ
Background Worker を 利 用 し て 行 う 。
るので、実際の運用では無視できると考えられる。
並列実行は、カラムストアをエクステント単位に分
割し、それぞれの並列ワーカーが別々のエクステント
3.8.
ベクター処理
を処理する。並列ワーカーが行う処理のアルゴリズム
PostgreSQL の 各 プ ラ ン は 選 択 リ ス ト や WHERE 句 を
は、元のプランで選択されたアルゴリズムと同じもの
処 理 す る た め に expression tree を 持 つ 。 プ ラ ン 実 行 時
を利用する。例えばハッシュ・アグリゲーションが選
に は こ の expression tree を 走 査 し な が ら 処 理 す る こ と
択された場合は、並列ワーカーはハッシュ・アグリゲ
で 演 算 を 行 う 。 例 え ば (A* 3) + B と い う 句 に 対 し て
ーションを行い、バックエンドプロセス は結果を統合
PostgreSQL は Figure 5 の よ う な expression tree を 作 成
して上位プランノードに返却する。
する。
並列実行には並列ワーカー間のデータ共有が必要
と な る 。 PostgreSQL 9.4 は Dynamic Background Worker
と 伴 に Dynamic Shared Memory(DSM)と い う 共 有 メ モ
リ 機 構 が 導 入 さ れ た 。 し か し DSM は 同 一 の メ モ リ 実
体を共有する機構であっても、プロセス間ではマッピ
ングする位置が異なり、ポインタを含んだデータをそ
のまま転送することができない。
そ こ で 我 々 は DSM に 替 わ る 機 構 と し て 、 Shared
Memory Context(SMC)機 構 を 開 発 し た [8]。SMC は バ ッ
ク エ ン ド プ ロ セ ス と 並 列 処 理 を 行 う Dynamic
Background Worker 間 で 共 有 さ れ る 共 有 メ モ リ だ が 、関
連するプロセス間で同一のメモリアドレスにマッピン
グする。
Figure 5 PostgreSQL の expression tree
ま た SMC は PostgreSQL の Memory Context 機 構 の イ
ン タ ー フ ェ イ ス と 合 致 さ せ て い る 。 こ の た め SMC は
し か し こ の よ う な expression tree の 走 査 は 条 件 分 岐
既 存 の PostgreSQL の ル ー チ ン を そ の ま ま 呼 び 出 し 、ル
ミ ス を 大 量 に 発 生 さ せ 、性 能 低 下 の 要 因 と な っ て い る 。
ーチン内で新規に割り付けられるメモリを共有メモリ
そ こ で CSI で は カ ラ ム ス ト ア か ら 128 行 単 位 で デ ー タ
に割り当てることが可能になっている。このため
PostgreSQL の 提 供 す る プ ラ ン ツ リ ー や ハ ッ シ ュ テ ー
ブ ル な ど を そ の ま ま 共 有 す る こ と が で き る (Figure 7)。
Figure 7 SMC の 利 用 イ メ ー ジ
4.
まとめ
PostgreSQL を ベ ー ス に OLTP 処 理 を 低 下 さ せ ず に
OLAP 処 理 を 高 速 化 す る OLXP シ ス テ ム を 開 発 す る た
め 、 列 形 式 格 納 の イ ン デ ッ ク ス を 実 現 す る CSI の 設
計 ・ 実 装 を 進 め て い る 。本 稿 で は CSI の 基 本 な 設 計 を
述べた。
今 後 は 実 装 を 進 め OLAP の 性 能 向 上 率 、 OLTP と
OLAP 混 在 時 の 性 能 の 評 価 を 実 施 す る 。 ま た テ ー ブ ル
結合についても設計・実装を行う。
参
考
文
献
[1] V. Sikka, F. Färber, W. Lehner, S. K. Cha, T. Peh, and
C. Bornhövd, "Efficient Transaction Processing in
SAP HANA Database: The End of a Column Store
Myth", Proc. SIGMOD, 2012.
[2] Oracle
Database
In-Memory,
Oracle,
http://www.oracle.com/technetwork/database/in -mem
ory/overview/twp-oracle-database-in-memory-22456
33.html
[3] Florian Funke, Alfons Kemper, and Thomas Neumann,
"Compacting
Transactional
Data
in
Hybrid
OLTP&OLAP Database", Proc. VLDB, 2012.
[4] Hasso Plattner,"The Impact of Columnar In -Memory
Databases on Enterprise Systems ", Proc. VLDB,
2014.
[5] PostgreSQL, http://www.postgresql.org/
[6] 田 原 司 睦 他 ,カ ラ ム ナ デ ー タ を サ ポ ー ト す る た め
の PostgreSQL 拡 張 ,第 77 回 日 本 情 報 処 理 学 会 全 国
大会
[7] 橋 田 拓 志 他 ,PostgreSQL ベ ー ス の カ ラ ム ナ 機 構 へ
の ト ラ ン ザ ク シ ョ ン 実 現 検 討 ,第 77 回 日 本 情 報 処
理学会全国大会
[8] 宇 治 橋 善 史 他 ,PostgreSQL ベ ー ス の 並 列 処 理 向 け
の 共 有 メ モ リ 機 構 の 設 計 ,第 77 回 日 本 情 報 処 理 学
会全国大会
[9] Mike Stonebraker, et al., "C-store: a column-oriented
DBMS", Proc. VLDB, 2005.
[10] 海 外 浩 平 氏 の カ ス タ ム プ ラ ン の パ ッ チ ,
http://www.postgresql.org/message-id/9A28C8860F7
77E439AA12E8AEA7694F8F8F6BA@BPXM15GP.g
isp.nec.co.jp