データハブとしてのPostgreSQL
~9.3で進化した外部テーブル~

db tech showcase Tokyo 2013
2013-11-01
株式会社メトロシステムズ
花田 茂
© 2013 Metro Systems.
自己紹介(1)

氏名
花田 茂(はなだ しげる)

所属
株式会社メトロシステムズ

メール
hanada@metrosystems.co.jp

ブログ
http://d.hatena.ne.jp/s87/

Twitter
@s87
2
...
自己紹介(2)

経歴
1999年

メトロシステムズに入社、Oracleでシステム開発

2003年

PostgreSQLの運用ツール開発やコンサルティング

2010年

PostgreSQL本体開発に参加

2012年

カナダで開催さ...
アジェンダ

外部テーブルとは?
外部テーブルの進化
外部テーブルを使ったデータ統合
外部データラッパの紹介
外部データラッパの作り方

4

© 2013 Metro Systems.
外部テーブルとは?

PostgreSQLの外部にあるデータに通常のテーブルと同様
にSQL文でアクセスできる特殊なテーブルです。
(ビューに近い?)
SQL規格での名前は「FOREIGN TABLE」

外部テーブルを作成するには、外部データ...
そもそも外部データって?

PostgreSQLからアクセスできるもの全て
OSファイル
CSVファイル、JSONファイル、ログファイル、Etc.

リレーショナルデータベース
PostgreSQL、Oracle、MySQL、SQLite3、E...
外部テーブルの進化(1)

8.4(2009年)
SQL/MED基盤
外部データラッパ関連オブジェクトサポート
外部データラッパ、サーバ、ユーザマッピング

外部データの検索は未実装
dblinkやplproxyなどの外部モジュール用に管理情報...
外部テーブルの進化(2)

9.0(2010年)
***動きなし***

8

© 2013 Metro Systems.
外部テーブルの進化(3)

9.1(2011年)
外部テーブルサポート(検索のみ)
file_fdwの追加

MySQLでいう
CSVストレージエンジン
のようなもの

COPYコマンドがサポートするフォーマット
(CSV、タブ区切り、独自バイ...
外部テーブルの進化(4)

9.2(2012年)
外部テーブルの統計情報取得
外部データの内容に応じた実行計画を生成
【注意】ANALYZEコマンドにテーブル名を明示すること!

複数候補パス(よりよいアクセスパスを選択)
外部データへのアクセ...
外部テーブルの進化(5)

9.3(2013年)
書き込み可能な外部テーブル
トランザクションコマンドもハンドリング可能

postgres_fdwの追加

外部データが更新可能に!
外部のPostgreSQLのテーブルを
ローカルテーブルと
...
外部テーブルの進化(6)

9.4(現在開発中)
テーブル継承サポート
外部テーブルを子テーブルとして定義
パーティションキーによるシャーディングが可能に

リモートでの結合や集約
分析系クエリなどで負荷分散や転送量削減
検索
親テーブル

自...
外部テーブルのデモ

postgres_fdw
他のPostgreSQLサーバにアクセスできるFDW
9.1で外部テーブルと一緒に提案→却下
9.2でANALYZE対応などと一緒に提案→却下
9.3でようやくcontribに追加
長引いた原因は...
postgres_fdw(1)

まずはEXTENSIONを作成
自動的にFOREIGN DATA WRAPPERも作成

接続先サーバをSERVERで定義
オプション:host、port、dbnameなどのlibpqオプション

リモートユー...
postgres_fdw(2)

SERVERで定義したデータベースにUSER MAPPINGで定
義したユーザで接続
ローカルユーザとリモートユーザをマッピング
サーバ×ローカルユーザでリモートユーザを切り替え

table_nameオプショ...
postgres_fdw(3)

WHERE句をリモートで評価して転送量削減
MUTABLE/STABLEの演算子/関数
ユーザ定義の演算子/関数

他のテーブルやビューとの結合が可能
同じサーバの外部テーブル同士でも、結合はローカルに持っ
て...
postgres_fdw(4)

見積もりを正確にするには…
クエリ実行時にリモートの見積もりを取得

FOREIGN TABLEかSERVERのオプションで
use_remote_estimateをtrueに設定
クエリ実行時にEXPLAIN...
postgres_fdw(5)

リモート接続に関する注意点
ローカル接続が続いている限り、リモート接続は保持され
る→リモート側をシャットダウンするとき注意
同じサーバ上の外部テーブルへのクエリは同じ接続で実行
REPEATABLE READ...
postgres_fdw(6)

検索だけでなく、更新も可能
INSERT/UPDATE/DELETE

トランザクションも一部サポート
リモートトランザクションをロールバック可能
二相コミットは未サポート

19

© 2013 Metro ...
外部テーブルによるデータ統合(1)

ログデータ
ログをCSV形式で出力し、file_fdwで参照
ログをSQLで検索可能
ウィンドウ関数や集約関数などで統計処理も可能

20

© 2013 Metro Systems.
外部テーブルによるデータ統合(2)

別システムのマスタデータ流通
別システムのマスタテーブルを外部テーブルで参照
エクスポート/インポート不要でリアルタイムに変更に追従
9.3の新機能のマテリアライズド・ビューと組み合わせる
と、スナップショ...
外部テーブルによるデータ統合(3)

旧システムデータの活用
旧システムのデータを外部テーブル経由で参照すること
で、データ流通基盤を構築せずにデータ連携が可能
新旧システム間のデータ移行にも利用可能

22

© 2013 Metro Sys...
外部テーブルによるデータ統合(4)

簡易EAIサーバとしての利用
複数種類のデータソースをPostgreSQLを経由して一本化
異種データソース間の結合や中間表の作成なども使い慣れ
たSQL文だけで可能
最終結果はCOPYコマンドで簡単にCS...
サードパーティのFDW(1)

RDBMS
oracle_fdw(Zheng

Yang版)

http://pgxn.org/dist/odbc_fdw/

oracle_fdw(NTT版)
http://interdbconnect.sou...
サードパーティのFDW(2)

その他のデーターベース
couchdb_fdw
http://pgxn.org/dist/couchdb_fdw/

mongo_fdw
http://pgxn.org/dist/mongo_fdw/

redi...
サードパーティのFDW(3)

その他
multicorn_fdw
PythonでFDWを実装するフレームワーク
http://pgxn.org/dist/couchdb_fdw/

s3_fdw(Amazon S3)
http://pgxn....
外部データラッパの作り方

C言語関数
FDW API(コールバック関数)を実装し、それらの関数ポ
インタを持った構造体を返すハンドラ関数を実装
検索のみのサポートならば、7個の関数を実装すればOK!

SQL関数
ハンドラ関数のSQLラッパ関...
FDW API(1)

検索系
プランナ
GetForeignRelSize
テーブルサイズを見積もる

GetForeignPaths
アクセスパスを(最低一つ)生成する
ソートキーの異なるパスなどを複数生成できる
プランナが自動的に最適なパ...
FDW API(2)

検索系
エグゼキュータ
BeginForeignScan
スキャン開始時に一度だけ呼ばれる

IterateForeignScan
上位ノードが1行必要としたときに呼ばれる
HeapTuple(行データの内部表現)を生成...
FDW API(3)

検索用EXPLAIN
ExplainForeignScan
検索クエリのEXPLAINで呼ばれる
ForeignScanノードに表示する情報を追加する

VERBOSEモードのon/off判定も可能
ANALYZE
An...
FDW API(4)

更新系
リライタ/プランナ
AddForeignUpdateTargets
更新時に使用するキー情報をタプル定義に追加する
postgres_fdwではCTID(タプルID)を使用

PlanForeignModify
...
FDW API(5)

更新系
エグゼキュータ
BeginForeignModify
更新処理開始時に呼ばれる

ExecForeignInsert
ExecForeignUpdate(リモート更新実行)
ExecForeignDelete(リ...
FDW API(6)

更新用EXPLAIN
ExplainForeignModify
更新クエリのEXPLAINで呼ばれる

更新ノードに表示する情報を追加する
VERBOSEモードのon/off判定も可能

33

© 2013 Metro...
トランザクション管理

リモートトランザクションサポート
トランザクション終了時に呼ばれるコールバック関数を登
録しておき、そこでトランザクションコマンドを実行する

RegisterXactCallback
RegisterSubXactCa...
大変だな〜という人向けに

blackhole_fdw

Andrew Dunstan氏が公開
https://bitbucket.org/adunstan/blackhole_fdw

APIに対応する関数を持つが、何もしない→検索しても0
...
FDW関連の情報源

PostgreSQL wiki
http://wiki.postgresql.org/wiki/SQL/MED

PGXN
http://pgxn.org

36

© 2013 Metro Systems.
おわりに

ご清聴ありがとうございました。

37

© 2013 Metro Systems.
お知らせ

PostgreSQL入門トレーニング
2013年からOSS-DB Silverに対応したトレーニングコースを
提供しています。
http://www.metrosystems.co.jp/education/

商用データベースの構...
Upcoming SlideShare
Loading in...5
×

[D26] データハブとしてのPostgreSQL~9.3で進化した外部テーブル~ by Shigeru Hanada

2,075

Published on

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,075
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
29
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

[D26] データハブとしてのPostgreSQL~9.3で進化した外部テーブル~ by Shigeru Hanada

  1. 1. データハブとしてのPostgreSQL ~9.3で進化した外部テーブル~ db tech showcase Tokyo 2013 2013-11-01 株式会社メトロシステムズ 花田 茂 © 2013 Metro Systems.
  2. 2. 自己紹介(1) 氏名 花田 茂(はなだ しげる) 所属 株式会社メトロシステムズ メール hanada@metrosystems.co.jp ブログ http://d.hatena.ne.jp/s87/ Twitter @s87 2 © 2013 Metro Systems.
  3. 3. 自己紹介(2) 経歴 1999年 メトロシステムズに入社、Oracleでシステム開発 2003年 PostgreSQLの運用ツール開発やコンサルティング 2010年 PostgreSQL本体開発に参加 2012年 カナダで開催されたPostgreSQL開発者会議に参加 2013年 OSS-DB Silver/Gold取得 現在 ドキュメント翻訳や日本語MLなどでも活動中 3 © 2013 Metro Systems.
  4. 4. アジェンダ 外部テーブルとは? 外部テーブルの進化 外部テーブルを使ったデータ統合 外部データラッパの紹介 外部データラッパの作り方 4 © 2013 Metro Systems.
  5. 5. 外部テーブルとは? PostgreSQLの外部にあるデータに通常のテーブルと同様 にSQL文でアクセスできる特殊なテーブルです。 (ビューに近い?) SQL規格での名前は「FOREIGN TABLE」 外部テーブルを作成するには、外部データの種類に応じ た「外部データラッパ」(FDW:Foreign Data Wrapper) が必要です。 SQL PostgreSQLサーバ 外部 テーブル テーブル PostgreSQL クライアント 検索 結果 外部 データ データ ファイル ラッパ 外部 データ 5 © 2013 Metro Systems.
  6. 6. そもそも外部データって? PostgreSQLからアクセスできるもの全て OSファイル CSVファイル、JSONファイル、ログファイル、Etc. リレーショナルデータベース PostgreSQL、Oracle、MySQL、SQLite3、Etc. NoSQLデータベース Hadoop、Redis、Mongo、Neo4J、Etc. Webサービス twitter、RESTアプリケーション、Etc. その他 Amazon S3、コマンド実行結果、Etc. 6 © 2013 Metro Systems.
  7. 7. 外部テーブルの進化(1) 8.4(2009年) SQL/MED基盤 外部データラッパ関連オブジェクトサポート 外部データラッパ、サーバ、ユーザマッピング 外部データの検索は未実装 dblinkやplproxyなどの外部モジュール用に管理情報のコンテナ を提供 postgres=> SELECT dblink_connect('con', 'host=foo,dbname=bar'); ... postgres=> SELECT * FROM dblink('con', 'SELECT id, name FROM remote_table WHERE col = ''value'' ORDER BY key') AS t (id int, name text); クエリを文字列で渡す →シンタックスチェックなし 結果の列型定義を 明示する必要がある 7 © 2013 Metro Systems.
  8. 8. 外部テーブルの進化(2) 9.0(2010年) ***動きなし*** 8 © 2013 Metro Systems.
  9. 9. 外部テーブルの進化(3) 9.1(2011年) 外部テーブルサポート(検索のみ) file_fdwの追加 MySQLでいう CSVストレージエンジン のようなもの COPYコマンドがサポートするフォーマット (CSV、タブ区切り、独自バイナリ) のファイルをロード不要で参照可能に! 外部PostgreSQLは(標準では)未対応 外部データの更新は未実装 9 © 2013 Metro Systems.
  10. 10. 外部テーブルの進化(4) 9.2(2012年) 外部テーブルの統計情報取得 外部データの内容に応じた実行計画を生成 【注意】ANALYZEコマンドにテーブル名を明示すること! 複数候補パス(よりよいアクセスパスを選択) 外部データへのアクセス方法が複数ある場合に、最適な方法を PostgreSQLのプランナが選択 列単位のFDWオプション 外部データの統計情報の取得や 複数候補パスサポートにより、 よりよい実行計画を選択可能に 外部データの更新は未実装 10 © 2013 Metro Systems.
  11. 11. 外部テーブルの進化(5) 9.3(2013年) 書き込み可能な外部テーブル トランザクションコマンドもハンドリング可能 postgres_fdwの追加 外部データが更新可能に! 外部のPostgreSQLのテーブルを ローカルテーブルと 同様に参照/更新可能 二相コミットは未実装 11 © 2013 Metro Systems.
  12. 12. 外部テーブルの進化(6) 9.4(現在開発中) テーブル継承サポート 外部テーブルを子テーブルとして定義 パーティションキーによるシャーディングが可能に リモートでの結合や集約 分析系クエリなどで負荷分散や転送量削減 検索 親テーブル 自動的に 結果をマージ 外部 テーブル 外部 テーブル 外部 テーブル 外部 データ 外部 データ 外部 データ 結果 12 © 2013 Metro Systems.
  13. 13. 外部テーブルのデモ postgres_fdw 他のPostgreSQLサーバにアクセスできるFDW 9.1で外部テーブルと一緒に提案→却下 9.2でANALYZE対応などと一緒に提案→却下 9.3でようやくcontribに追加 長引いた原因はネーミング? pgsql_fdw → postgresql_fdw → postgres_fdw 13 © 2013 Metro Systems.
  14. 14. postgres_fdw(1) まずはEXTENSIONを作成 自動的にFOREIGN DATA WRAPPERも作成 接続先サーバをSERVERで定義 オプション:host、port、dbnameなどのlibpqオプション リモートユーザをUSER MAPPINGで定義 オプション:user、password 外部データ構造をFOREIGN TABLEで定義 オプション:table_name 14 © 2013 Metro Systems.
  15. 15. postgres_fdw(2) SERVERで定義したデータベースにUSER MAPPINGで定 義したユーザで接続 ローカルユーザとリモートユーザをマッピング サーバ×ローカルユーザでリモートユーザを切り替え table_nameオプションで指定したテーブルに対する SELECT文を生成してクエリを実行 リモートと別の名前で外部テーブルを定義可能 取得した結果をローカルのPostgreSQL内で処理し、クラ イアントに返却 EXPLAIN VERBOSEでリモートクエリを表示 15 © 2013 Metro Systems.
  16. 16. postgres_fdw(3) WHERE句をリモートで評価して転送量削減 MUTABLE/STABLEの演算子/関数 ユーザ定義の演算子/関数 他のテーブルやビューとの結合が可能 同じサーバの外部テーブル同士でも、結合はローカルに持っ てきてから→大量データの場合は要注意 ORDER BYやLIMIT/OFFSETはローカル評価 頑張ればORDER BYはリモート評価できそうです 16 © 2013 Metro Systems.
  17. 17. postgres_fdw(4) 見積もりを正確にするには… クエリ実行時にリモートの見積もりを取得 FOREIGN TABLEかSERVERのオプションで use_remote_estimateをtrueに設定 クエリ実行時にEXPLAINをリモートで実行し、その見積もりで ローカルの実行計画を作成 ANALYZEしてローカルに統計情報を保持 テーブル名を明示する必要がある(対象を指定しない場合は外 部テーブルをスキップ) 17 © 2013 Metro Systems.
  18. 18. postgres_fdw(5) リモート接続に関する注意点 ローカル接続が続いている限り、リモート接続は保持され る→リモート側をシャットダウンするとき注意 同じサーバ上の外部テーブルへのクエリは同じ接続で実行 REPEATABLE READまたはSERIALIZABLEの分離レベルを使用 18 © 2013 Metro Systems.
  19. 19. postgres_fdw(6) 検索だけでなく、更新も可能 INSERT/UPDATE/DELETE トランザクションも一部サポート リモートトランザクションをロールバック可能 二相コミットは未サポート 19 © 2013 Metro Systems.
  20. 20. 外部テーブルによるデータ統合(1) ログデータ ログをCSV形式で出力し、file_fdwで参照 ログをSQLで検索可能 ウィンドウ関数や集約関数などで統計処理も可能 20 © 2013 Metro Systems.
  21. 21. 外部テーブルによるデータ統合(2) 別システムのマスタデータ流通 別システムのマスタテーブルを外部テーブルで参照 エクスポート/インポート不要でリアルタイムに変更に追従 9.3の新機能のマテリアライズド・ビューと組み合わせる と、スナップショット取得も可能 21 © 2013 Metro Systems.
  22. 22. 外部テーブルによるデータ統合(3) 旧システムデータの活用 旧システムのデータを外部テーブル経由で参照すること で、データ流通基盤を構築せずにデータ連携が可能 新旧システム間のデータ移行にも利用可能 22 © 2013 Metro Systems.
  23. 23. 外部テーブルによるデータ統合(4) 簡易EAIサーバとしての利用 複数種類のデータソースをPostgreSQLを経由して一本化 異種データソース間の結合や中間表の作成なども使い慣れ たSQL文だけで可能 最終結果はCOPYコマンドで簡単にCSV化可能 23 © 2013 Metro Systems.
  24. 24. サードパーティのFDW(1) RDBMS oracle_fdw(Zheng Yang版) http://pgxn.org/dist/odbc_fdw/ oracle_fdw(NTT版) http://interdbconnect.sourceforge.net mysql_fdw http://pgxn.org/dist/mysql_fdw/ odbc_fdw http://pgxn.org/dist/odbc_fdw/ jdbc_fdw http://pgxn.org/dist/jdbc_fdw/ 24 © 2013 Metro Systems.
  25. 25. サードパーティのFDW(2) その他のデーターベース couchdb_fdw http://pgxn.org/dist/couchdb_fdw/ mongo_fdw http://pgxn.org/dist/mongo_fdw/ redis_fdw http://pgxn.org/dist/redis_fdw/ ldap_fdw http://pgxn.org/dist/ldap_fdw/ neo4j_fdw https://github.com/nuko-yokohama/neo4j_fdw hadoop_fdw http://www.bigsql.org/se/hadoopfdw/ 25 © 2013 Metro Systems.
  26. 26. サードパーティのFDW(3) その他 multicorn_fdw PythonでFDWを実装するフレームワーク http://pgxn.org/dist/couchdb_fdw/ s3_fdw(Amazon S3) http://pgxn.org/dist/s3_fdw/ twitter_fdw(Twitter) http://pgxn.org/dist/twitter_fdw/ www_fdw(REST) https://github.com/cyga/www_fdw 26 © 2013 Metro Systems.
  27. 27. 外部データラッパの作り方 C言語関数 FDW API(コールバック関数)を実装し、それらの関数ポ インタを持った構造体を返すハンドラ関数を実装 検索のみのサポートならば、7個の関数を実装すればOK! SQL関数 ハンドラ関数のSQLラッパ関数を実装 オプションを検査するバリデータ関数を実装(必要に応 じて) EXTENSION 全体をEXTENSIONとしてパッケージ 詳細は http://www.postgresql.org/docs/9.3/static/fdwhandler.html 27 © 2013 Metro Systems.
  28. 28. FDW API(1) 検索系 プランナ GetForeignRelSize テーブルサイズを見積もる GetForeignPaths アクセスパスを(最低一つ)生成する ソートキーの異なるパスなどを複数生成できる プランナが自動的に最適なパスを選択してくれる GetForeignPlan プランナが決定したアクセスパスに沿ったForeignScanプランノー ドを生成する FDW独自の情報をGetForeignPathsから受け取れる 28 © 2013 Metro Systems.
  29. 29. FDW API(2) 検索系 エグゼキュータ BeginForeignScan スキャン開始時に一度だけ呼ばれる IterateForeignScan 上位ノードが1行必要としたときに呼ばれる HeapTuple(行データの内部表現)を生成して返す ReScanForeignScan スキャン位置を先頭に戻してほしいときに呼ばれる NestedLoopのインナー側の場合など スキャン結果を捨ててしまった場合は、リモートから再取得する EndForeignScan(検索終了) スキャン終了時に呼ばれる クリーンアップなど クエリがエラー終了すると呼ばれないので要注意 29 © 2013 Metro Systems.
  30. 30. FDW API(3) 検索用EXPLAIN ExplainForeignScan 検索クエリのEXPLAINで呼ばれる ForeignScanノードに表示する情報を追加する VERBOSEモードのon/off判定も可能 ANALYZE AnalyzeForeignTable ANALYZE可否を判断し、可能ならばサンプル収集関数を返す AcquireSampleRows リモートデータからサンプル行を取得する 30 © 2013 Metro Systems.
  31. 31. FDW API(4) 更新系 リライタ/プランナ AddForeignUpdateTargets 更新時に使用するキー情報をタプル定義に追加する postgres_fdwではCTID(タプルID)を使用 PlanForeignModify 更新処理に必要な情報をプライベート領域に保存する postgres_fdwでは更新用SQL分を生成 31 © 2013 Metro Systems.
  32. 32. FDW API(5) 更新系 エグゼキュータ BeginForeignModify 更新処理開始時に呼ばれる ExecForeignInsert ExecForeignUpdate(リモート更新実行) ExecForeignDelete(リモート削除実行) 挿入/更新/削除一件ごとに一回呼ばれる リモート側にデータを挿入/更新/削除する EndForeignModify(更新終了) 更新処理終了時に呼ばれる 32 © 2013 Metro Systems.
  33. 33. FDW API(6) 更新用EXPLAIN ExplainForeignModify 更新クエリのEXPLAINで呼ばれる 更新ノードに表示する情報を追加する VERBOSEモードのon/off判定も可能 33 © 2013 Metro Systems.
  34. 34. トランザクション管理 リモートトランザクションサポート トランザクション終了時に呼ばれるコールバック関数を登 録しておき、そこでトランザクションコマンドを実行する RegisterXactCallback RegisterSubXactCallback ローカルのCOMMIT/ROLLBACKの直前に呼ばれるので、 このコールバックで例外が発生するとローカルトランザク ションもABORTする 34 © 2013 Metro Systems.
  35. 35. 大変だな〜という人向けに blackhole_fdw Andrew Dunstan氏が公開 https://bitbucket.org/adunstan/blackhole_fdw APIに対応する関数を持つが、何もしない→検索しても0 件、更新は空振り FDWのひな形として利用可能 35 © 2013 Metro Systems.
  36. 36. FDW関連の情報源 PostgreSQL wiki http://wiki.postgresql.org/wiki/SQL/MED PGXN http://pgxn.org 36 © 2013 Metro Systems.
  37. 37. おわりに ご清聴ありがとうございました。 37 © 2013 Metro Systems.
  38. 38. お知らせ PostgreSQL入門トレーニング 2013年からOSS-DB Silverに対応したトレーニングコースを 提供しています。 http://www.metrosystems.co.jp/education/ 商用データベースの構築・運用で培ったノウハウを盛り込 んだ独自テキストを使用し、商用製品とPostgreSQLを対比 しながらハンズオン環境で基本的な使い方を習得できま す! 11/21・22の二日間は、初回につき特別に無料で開催いたし ます。お問い合わせはseminar@metrosystems.co.jpまで! 38 © 2013 Metro Systems.
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×