PostgreSQL ããã¼ã¹ã¨ããã«ã©ã ã¹ãã¢æ©æ§ã®å®ç¾æ¤è¨
Transcription
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 [email protected] isp.nec.co.jp