SlideShare a Scribd company logo
1 of 32
Download to read offline
Copyright 2013 Metro Systems. 1
9.3で進化した外部テーブル
第26回 しくみ+アプリケーション勉強会
2013年6月8日
株式会社メトロシステムズ
花田 茂
Copyright 2013 Metro Systems. 2
自己紹介
●
氏名
– 花田 茂(はなだ しげる)
●
所属
– 株式会社メトロシステムズ
●
メールアドレス
– shigeru.hanada@gmail.com
●
Twitter
– @s87
●
ブログ
– http://d.hatena.ne.jp/s87/
Copyright 2013 Metro Systems. 3
アジェンダ
●
外部テーブルとは?
●
外部テーブルの進化
●
外部データラッパの紹介
●
外部データラッパの作り方
Copyright 2013 Metro Systems. 4
外部テーブルとは?
●
PostgreSQLの外部にあるデータに通常の
テーブルと同様にSQL文でアクセスできる特
殊なテーブルです。(ビューに近い?)
– SQLでは「FOREIGN TABLE」
●
外部テーブルを作成するには、外部データの
種類に応じた「外部データラッパ」(FDW:
Foreign Data Wrapper)が必要です。
Copyright 2013 Metro Systems. 5
そもそも外部データって?
●
PostgreSQLからアクセスできるもの全て
– OSファイル
●
CSVファイル、JSONファイル、ログファイル、Etc.
– リレーショナルデータベース
●
PostgreSQL、Oracle、MySQL、SQLite3、Etc.
– NoSQLデータベース
●
Hadoop、Redis、Mongo、Neo4J、Etc.
– Webサービス
●
twitter、RESTアプリケーション、Etc.
– その他
●
Amazon S3、コマンド実行結果、Etc.
Copyright 2013 Metro Systems. 6
外部テーブルの進化(1)
●
8.4
– SQL/MED基盤
●
外部データの検索は未実装
●
dblinkやplproxyなどの外部モジュール用に管理情報
のコンテナを提供
– postgresql_fdw_validatorがdblink用に存在
●
これの後方互換性維持のために「postgresql_fdw」
という名前が使えないという事態になるとは…
Copyright 2013 Metro Systems. 7
外部テーブルの進化(2)
●
9.0
– ***動きなし***
Copyright 2013 Metro Systems. 8
外部テーブルの進化(3)
●
9.1
– 外部テーブルサポート(検索のみ)
– file_fdwの追加
– SERVER、USER MAPPING、FOREIGN
TABLE構文の追加
Copyright 2013 Metro Systems. 9
外部テーブルの進化(4)
●
9.2
– 外部テーブルへのANALYZE
– 複数候補パス(よりよいアクセスパスを選択)
– 列単位のFDWオプション
Copyright 2013 Metro Systems. 10
外部テーブルの進化(5)
●
9.3
– 書き込み可能な外部テーブル
●
トランザクションコマンドもハンドリング可能
– postgres_fdwの追加
Copyright 2013 Metro Systems. 11
さっそくデモ
●
postgres_fdw
– 他のPostgreSQLサーバにアクセスできるFDW
– 9.1で外部テーブルと一緒に提案→却下
– 9.2でANALYZE対応などと一緒に提案→却下
– 9.3でようやくcontribに追加
●
長引いた原因はネーミング?
●
pgsql_fdw → postgresql_fdw → postgres_fdw
Copyright 2013 Metro Systems. 12
postgres_fdw(1)
●
まずはEXTENSIONを作成
– 自動的にFOREIGN DATA WRAPPERも作成
●
接続先サーバをSERVERで定義
– オプション:host、port、dbnameなどのlibpqオプ
ション
●
リモートユーザをUSER MAPPINGで定義
– オプション:user、password
●
外部データ構造をFOREIGN TABLEで定義
– オプション:table_name
Copyright 2013 Metro Systems. 13
postgres_fdw(2)
●
SERVERで定義したデータベースにUSER
MAPPINGで定義したユーザで接続
– ローカルユーザとリモートユーザをマッピング
– サーバ×ローカルユーザでリモートユーザを切り替え
●
table_nameオプションで指定したテーブルに対する
SELECT文を生成してクエリを実行
– リモートと別の名前で外部テーブルを定義可能
●
取得した結果をローカルのPostgreSQL内で処理し、
クライアントに返却
– EXPLAIN VERBOSEでリモートクエリを表示
Copyright 2013 Metro Systems. 14
postgres_fdw(3)
●
WHERE句をリモートで評価して転送量削減
– MUTABLE/STABLEの演算子/関数
– ユーザ定義の演算子/関数
●
他のテーブルやビューとの結合が可能
– 同じサーバの外部テーブル同士でも、結合はローカルに持って
きてから→大量データの場合は要注意
●
ORDER BYやLIMIT/OFFSETはローカル評価
– 頑張ればORDER BYはリモート評価できそうです
Copyright 2013 Metro Systems. 15
postgres_fdw(4)
●
EXPLAIN結果でおかしい点があったんです
が、気づきましたか?
Copyright 2013 Metro Systems. 16
postgres_fdw(5)
●
見積もりを正確にするには…
– クエリ実行時にリモートの見積もりを取得
●
FOREIGN TABLEかSERVERのオプションで
use_remote_estimateをtrueに設定
●
クエリ実行時にEXPLAINをリモートで実行し、その
見積もりでローカルの実行計画を作成
– ANALYZEしてローカルに統計情報を保持
●
テーブル名を明示する必要がある(対象を指定しない場
合は外部テーブルをスキップ)
Copyright 2013 Metro Systems. 17
postgres_fdw(6)
●
リモート接続に関する注意点
– ローカル接続が続いている限り、リモート接続は
保持される→リモート側をシャットダウンすると
き注意
– 同じサーバ上の外部テーブルへのクエリは同じ接
続で実行
●
REPEATABLE READまたはSERIALIZABLEの分離
レベルを使用
Copyright 2013 Metro Systems. 18
postgres_fdw(7)
●
検索だけでなく、更新も可能
– INSERT/UPDATE/DELETE
●
トランザクションも一部サポート
– リモートトランザクションをロールバック可能
– 二相コミットは未サポート
Copyright 2013 Metro Systems. 19
サードパーティの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/
Copyright 2013 Metro Systems. 20
サードパーティの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/
●
https://github.com/pg-redis-fdw/redis_fdw
– ldap_fdw
●
http://pgxn.org/dist/ldap_fdw/
– neo4j_fdw
●
https://github.com/nuko-yokohama/neo4j_fdw
Copyright 2013 Metro Systems. 21
サードパーティの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
Copyright 2013 Metro Systems. 22
外部データラッパの作り方
●
C言語関数
– FDW API(コールバック関数)を実装し、それらの関数ポインタを持っ
た構造体を返すハンドラ関数を実装
– 検索のみならば7個の関数でOK
●
SQL関数
– ハンドラ関数のSQLラッパ関数を実装
– オプションを検査するバリデータ関数を実装(必要に応じて)
●
EXTENSION
– 全体をEXTENSIONとしてパッケージ
●
詳細は
– http://www.postgresql.org/docs/9.3/static/fdwhandler.html
Copyright 2013 Metro Systems. 23
FDW API(1)
●
検索系
– プランナ
●
GetForeignRelSize
– テーブルサイズを見積もる
●
GetForeignPaths
– アクセスパスを(最低一つ)生成する
– ソートキーの異なるパスなどを複数生成できる
– プランナが自動的に最適なパスを選択してくれる
●
GetForeignPlan
– プランナが決定したアクセスパスに沿ったForeignScanプラン
ノードを生成する
– FDW独自の情報をGetForeignPathsから受け取れる
Copyright 2013 Metro Systems. 24
FDW API(2)
●
検索系
– エグゼキュータ
●
BeginForeignScan
– スキャン開始時に一度だけ呼ばれる
●
IterateForeignScan
– 上位ノードが1行必要としたときに呼ばれる
– HeapTuple(行データの内部表現)を生成して返す
●
ReScanForeignScan
– スキャン位置を先頭に戻してほしいときに呼ばれる
– NestedLoopのインナー側の場合など
– スキャン結果を捨ててしまった場合は、リモートから再取得する
●
EndForeignScan(検索終了)
– スキャン終了時に呼ばれる
– クリーンアップなど
– クエリがエラー終了すると呼ばれないので要注意
Copyright 2013 Metro Systems. 25
FDW API(3)
●
検索用EXPLAIN
– ExplainForeignScan
●
検索クエリのEXPLAINで呼ばれる
●
ForeignScanノードに表示する情報を追加する
●
VERBOSEモードのon/of判定も可能
●
ANALYZE
– AnalyzeForeignTable
ANALYZE可否を判断し、可能ならばサンプル収集関数を返す
– AcquireSampleRows
●
リモートデータからサンプル行を取得する
Copyright 2013 Metro Systems. 26
FDW API(4)
●
更新系
– リライタ/プランナ
●
AddForeignUpdateTargets
– 更新時に使用するキー情報をタプル定義に追加する
– postgres_fdwではCTID(タプルID)を使用
●
PlanForeignModify
– 更新処理に必要な情報をプライベート領域に保存する
– postgres_fdwでは更新用SQL分を生成
Copyright 2013 Metro Systems. 27
FDW API(5)
●
更新系
– エグゼキュータ
●
BeginForeignModify
– 更新処理開始時に呼ばれる
●
ExecForeignInsert
●
ExecForeignUpdate(リモート更新実行)
●
ExecForeignDelete(リモート削除実行)
– 挿入/更新/削除一件ごとに一回呼ばれる
– リモート側にデータを挿入/更新/削除する
●
EndForeignModify(更新終了)
– 更新処理終了時に呼ばれる
Copyright 2013 Metro Systems. 28
FDW API(6)
●
更新用EXPLAIN
– ExplainForeignModify
●
更新クエリのEXPLAINで呼ばれる
●
更新ノードに表示する情報を追加する
●
VERBOSEモードのon/of判定も可能
Copyright 2013 Metro Systems. 29
トランザクション管理
●
リモートトランザクションサポート
– トランザクション終了時に呼ばれるコールバック関数を登
録しておき、そこでトランザクションコマンドを実行する
●
RegisterXactCallback
●
RegisterSubXactCallback
– ローカルのCOMMIT/ROLLBACKの直前に呼ばれるの
で、このコールバックで例外が発生するとローカルトラン
ザクションもABORTする
Copyright 2013 Metro Systems. 30
大変だな〜という人向けに
●
blackhole_fdw
– Andrew Dunstan氏が公開
●
https://bitbucket.org/adunstan/blackhole_fdw
– APIに対応する関数を持つが、何もしない→検索
しても0件、更新は空振り
– FDWのひな形として利用可能
Copyright 2013 Metro Systems. 31
FDW関連の情報源
●
PostgreSQL wiki
– http://wiki.postgresql.org/wiki/SQL/MED
●
PGXN
– http://pgxn.org
Copyright 2013 Metro Systems. 32
おわりに
●
ご清聴ありがとうございました。

More Related Content

What's hot

OSC沖縄2014_JPUG資料
OSC沖縄2014_JPUG資料OSC沖縄2014_JPUG資料
OSC沖縄2014_JPUG資料
kasaharatt
 
Dbts2012 unconference wttrw_yazekatsu_publish
Dbts2012 unconference wttrw_yazekatsu_publishDbts2012 unconference wttrw_yazekatsu_publish
Dbts2012 unconference wttrw_yazekatsu_publish
Yohei Azekatsu
 
明日から使えるPostgre sql運用管理テクニック(監視編)
明日から使えるPostgre sql運用管理テクニック(監視編)明日から使えるPostgre sql運用管理テクニック(監視編)
明日から使えるPostgre sql運用管理テクニック(監視編)
kasaharatt
 
Postgre sql9.3 newlockmode_and_etc
Postgre sql9.3 newlockmode_and_etcPostgre sql9.3 newlockmode_and_etc
Postgre sql9.3 newlockmode_and_etc
kasaharatt
 

What's hot (20)

OSS-DB Goldへの第一歩~実践!運用管理~
OSS-DB Goldへの第一歩~実践!運用管理~OSS-DB Goldへの第一歩~実践!運用管理~
OSS-DB Goldへの第一歩~実践!運用管理~
 
pg_bigmを用いた全文検索のしくみ(前編)
pg_bigmを用いた全文検索のしくみ(前編)pg_bigmを用いた全文検索のしくみ(前編)
pg_bigmを用いた全文検索のしくみ(前編)
 
PostgreSQL監査
PostgreSQL監査PostgreSQL監査
PostgreSQL監査
 
PostgreSQL 9.5 新機能紹介
PostgreSQL 9.5 新機能紹介PostgreSQL 9.5 新機能紹介
PostgreSQL 9.5 新機能紹介
 
PostgreSQL 9.2 新機能 - OSC 2012 Kansai@Kyoto
PostgreSQL 9.2 新機能 - OSC 2012 Kansai@KyotoPostgreSQL 9.2 新機能 - OSC 2012 Kansai@Kyoto
PostgreSQL 9.2 新機能 - OSC 2012 Kansai@Kyoto
 
OSC沖縄2014_JPUG資料
OSC沖縄2014_JPUG資料OSC沖縄2014_JPUG資料
OSC沖縄2014_JPUG資料
 
PostgreSQL10徹底解説
PostgreSQL10徹底解説PostgreSQL10徹底解説
PostgreSQL10徹底解説
 
PostgreSQLバックアップの基本
PostgreSQLバックアップの基本PostgreSQLバックアップの基本
PostgreSQLバックアップの基本
 
Postgre sql9.3新機能紹介
Postgre sql9.3新機能紹介Postgre sql9.3新機能紹介
Postgre sql9.3新機能紹介
 
まずやっとくPostgreSQLチューニング
まずやっとくPostgreSQLチューニングまずやっとくPostgreSQLチューニング
まずやっとくPostgreSQLチューニング
 
Dbts2012 unconference wttrw_yazekatsu_publish
Dbts2012 unconference wttrw_yazekatsu_publishDbts2012 unconference wttrw_yazekatsu_publish
Dbts2012 unconference wttrw_yazekatsu_publish
 
「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisited「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisited
 
明日から使えるPostgre sql運用管理テクニック(監視編)
明日から使えるPostgre sql運用管理テクニック(監視編)明日から使えるPostgre sql運用管理テクニック(監視編)
明日から使えるPostgre sql運用管理テクニック(監視編)
 
PostreSQL監査
PostreSQL監査PostreSQL監査
PostreSQL監査
 
Postgre sql9.3 newlockmode_and_etc
Postgre sql9.3 newlockmode_and_etcPostgre sql9.3 newlockmode_and_etc
Postgre sql9.3 newlockmode_and_etc
 
PostgreSQLではじめるOSS開発@OSC 2014 Hiroshima
PostgreSQLではじめるOSS開発@OSC 2014 HiroshimaPostgreSQLではじめるOSS開発@OSC 2014 Hiroshima
PostgreSQLではじめるOSS開発@OSC 2014 Hiroshima
 
いまさら聞けないPostgreSQL運用管理
いまさら聞けないPostgreSQL運用管理いまさら聞けないPostgreSQL運用管理
いまさら聞けないPostgreSQL運用管理
 
PostgreSQL9.3新機能紹介
PostgreSQL9.3新機能紹介PostgreSQL9.3新機能紹介
PostgreSQL9.3新機能紹介
 
perfを使ったPostgreSQLの解析(後編)
perfを使ったPostgreSQLの解析(後編)perfを使ったPostgreSQLの解析(後編)
perfを使ったPostgreSQLの解析(後編)
 
Hackers Champloo 2016 postgresql-9.6
Hackers Champloo 2016 postgresql-9.6Hackers Champloo 2016 postgresql-9.6
Hackers Champloo 2016 postgresql-9.6
 

Viewers also liked

今注目のSpark SQL、知っておきたいその性能とは 20151209 OSC Enterprise
今注目のSpark SQL、知っておきたいその性能とは 20151209 OSC Enterprise今注目のSpark SQL、知っておきたいその性能とは 20151209 OSC Enterprise
今注目のSpark SQL、知っておきたいその性能とは 20151209 OSC Enterprise
YusukeKuramata
 

Viewers also liked (17)

Foreign Data Wrapper Enhancements
Foreign Data Wrapper EnhancementsForeign Data Wrapper Enhancements
Foreign Data Wrapper Enhancements
 
PostgreSQL 9.6 新機能紹介
PostgreSQL 9.6 新機能紹介PostgreSQL 9.6 新機能紹介
PostgreSQL 9.6 新機能紹介
 
Postgresql Federation
Postgresql FederationPostgresql Federation
Postgresql Federation
 
PostgreSQL UPDATEs 2016年5月 - OSC群馬
PostgreSQL UPDATEs 2016年5月 - OSC群馬PostgreSQL UPDATEs 2016年5月 - OSC群馬
PostgreSQL UPDATEs 2016年5月 - OSC群馬
 
Extending PostgreSQL - PgDay 2012 Japan
Extending PostgreSQL - PgDay 2012 JapanExtending PostgreSQL - PgDay 2012 Japan
Extending PostgreSQL - PgDay 2012 Japan
 
PostgreSQL開発ことはじめ - 第27回しくみ+アプリケーション勉強会
PostgreSQL開発ことはじめ - 第27回しくみ+アプリケーション勉強会PostgreSQL開発ことはじめ - 第27回しくみ+アプリケーション勉強会
PostgreSQL開発ことはじめ - 第27回しくみ+アプリケーション勉強会
 
オープンソース・データベースの最新事情
オープンソース・データベースの最新事情オープンソース・データベースの最新事情
オープンソース・データベースの最新事情
 
Postgre sql update_20170310
Postgre sql update_20170310Postgre sql update_20170310
Postgre sql update_20170310
 
Postgres Toolkitのご紹介
Postgres Toolkitのご紹介Postgres Toolkitのご紹介
Postgres Toolkitのご紹介
 
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
 
今注目のSpark SQL、知っておきたいその性能とは 20151209 OSC Enterprise
今注目のSpark SQL、知っておきたいその性能とは 20151209 OSC Enterprise今注目のSpark SQL、知っておきたいその性能とは 20151209 OSC Enterprise
今注目のSpark SQL、知っておきたいその性能とは 20151209 OSC Enterprise
 
Kubernetesを触ってみた
Kubernetesを触ってみたKubernetesを触ってみた
Kubernetesを触ってみた
 
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012
 
Leveraging Hadoop in your PostgreSQL Environment
Leveraging Hadoop in your PostgreSQL EnvironmentLeveraging Hadoop in your PostgreSQL Environment
Leveraging Hadoop in your PostgreSQL Environment
 
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
 
Fluentd vs. Logstash for OpenStack Log Management
Fluentd vs. Logstash for OpenStack Log ManagementFluentd vs. Logstash for OpenStack Log Management
Fluentd vs. Logstash for OpenStack Log Management
 
PostgreSQLによるデータ分析ことはじめ
PostgreSQLによるデータ分析ことはじめPostgreSQLによるデータ分析ことはじめ
PostgreSQLによるデータ分析ことはじめ
 

Similar to 9.3で進化した外部テーブル

Osc10do linux nextstep
Osc10do linux nextstepOsc10do linux nextstep
Osc10do linux nextstep
smokey monkey
 
D22 目覚めよDBエンジニア 〜世界最速カラムナーデータベースは本物だ!〜 by Koji Shinkubo
D22 目覚めよDBエンジニア 〜世界最速カラムナーデータベースは本物だ!〜 by Koji ShinkuboD22 目覚めよDBエンジニア 〜世界最速カラムナーデータベースは本物だ!〜 by Koji Shinkubo
D22 目覚めよDBエンジニア 〜世界最速カラムナーデータベースは本物だ!〜 by Koji Shinkubo
Insight Technology, Inc.
 

Similar to 9.3で進化した外部テーブル (20)

PostgreSQLでスケールアウト
PostgreSQLでスケールアウトPostgreSQLでスケールアウト
PostgreSQLでスケールアウト
 
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
 
Fpga online seminar by fixstars (1st)
Fpga online seminar by fixstars (1st)Fpga online seminar by fixstars (1st)
Fpga online seminar by fixstars (1st)
 
PostgreSQL 12の話
PostgreSQL 12の話PostgreSQL 12の話
PostgreSQL 12の話
 
PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)
 
Snapdragon-SCORER
Snapdragon-SCORERSnapdragon-SCORER
Snapdragon-SCORER
 
20190119 aws-study-pg-extension
20190119 aws-study-pg-extension20190119 aws-study-pg-extension
20190119 aws-study-pg-extension
 
Robotech2012講習会v01最終版v2
Robotech2012講習会v01最終版v2Robotech2012講習会v01最終版v2
Robotech2012講習会v01最終版v2
 
20181110 fok2018-pg-extension
20181110 fok2018-pg-extension20181110 fok2018-pg-extension
20181110 fok2018-pg-extension
 
MeeGo Seminar Winter Porting 20101209
MeeGo Seminar Winter Porting 20101209MeeGo Seminar Winter Porting 20101209
MeeGo Seminar Winter Porting 20101209
 
PostgreSQLの運用・監視にまつわるエトセトラ
PostgreSQLの運用・監視にまつわるエトセトラPostgreSQLの運用・監視にまつわるエトセトラ
PostgreSQLの運用・監視にまつわるエトセトラ
 
Osc10do linux nextstep
Osc10do linux nextstepOsc10do linux nextstep
Osc10do linux nextstep
 
[db tech showcase Tokyo 2014] C31: PostgreSQLをエンタープライズシステムで利用しよう by PostgreS...
[db tech showcase Tokyo 2014] C31: PostgreSQLをエンタープライズシステムで利用しよう  by PostgreS...[db tech showcase Tokyo 2014] C31: PostgreSQLをエンタープライズシステムで利用しよう  by PostgreS...
[db tech showcase Tokyo 2014] C31: PostgreSQLをエンタープライズシステムで利用しよう by PostgreS...
 
Cell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始めCell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始め
 
D22 目覚めよDBエンジニア 〜世界最速カラムナーデータベースは本物だ!〜 by Koji Shinkubo
D22 目覚めよDBエンジニア 〜世界最速カラムナーデータベースは本物だ!〜 by Koji ShinkuboD22 目覚めよDBエンジニア 〜世界最速カラムナーデータベースは本物だ!〜 by Koji Shinkubo
D22 目覚めよDBエンジニア 〜世界最速カラムナーデータベースは本物だ!〜 by Koji Shinkubo
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
 
ストリームデータ分散処理基盤Storm
ストリームデータ分散処理基盤Stormストリームデータ分散処理基盤Storm
ストリームデータ分散処理基盤Storm
 
20130203 oss-db-lpi
20130203 oss-db-lpi20130203 oss-db-lpi
20130203 oss-db-lpi
 

9.3で進化した外部テーブル

  • 1. Copyright 2013 Metro Systems. 1 9.3で進化した外部テーブル 第26回 しくみ+アプリケーション勉強会 2013年6月8日 株式会社メトロシステムズ 花田 茂
  • 2. Copyright 2013 Metro Systems. 2 自己紹介 ● 氏名 – 花田 茂(はなだ しげる) ● 所属 – 株式会社メトロシステムズ ● メールアドレス – shigeru.hanada@gmail.com ● Twitter – @s87 ● ブログ – http://d.hatena.ne.jp/s87/
  • 3. Copyright 2013 Metro Systems. 3 アジェンダ ● 外部テーブルとは? ● 外部テーブルの進化 ● 外部データラッパの紹介 ● 外部データラッパの作り方
  • 4. Copyright 2013 Metro Systems. 4 外部テーブルとは? ● PostgreSQLの外部にあるデータに通常の テーブルと同様にSQL文でアクセスできる特 殊なテーブルです。(ビューに近い?) – SQLでは「FOREIGN TABLE」 ● 外部テーブルを作成するには、外部データの 種類に応じた「外部データラッパ」(FDW: Foreign Data Wrapper)が必要です。
  • 5. Copyright 2013 Metro Systems. 5 そもそも外部データって? ● PostgreSQLからアクセスできるもの全て – OSファイル ● CSVファイル、JSONファイル、ログファイル、Etc. – リレーショナルデータベース ● PostgreSQL、Oracle、MySQL、SQLite3、Etc. – NoSQLデータベース ● Hadoop、Redis、Mongo、Neo4J、Etc. – Webサービス ● twitter、RESTアプリケーション、Etc. – その他 ● Amazon S3、コマンド実行結果、Etc.
  • 6. Copyright 2013 Metro Systems. 6 外部テーブルの進化(1) ● 8.4 – SQL/MED基盤 ● 外部データの検索は未実装 ● dblinkやplproxyなどの外部モジュール用に管理情報 のコンテナを提供 – postgresql_fdw_validatorがdblink用に存在 ● これの後方互換性維持のために「postgresql_fdw」 という名前が使えないという事態になるとは…
  • 7. Copyright 2013 Metro Systems. 7 外部テーブルの進化(2) ● 9.0 – ***動きなし***
  • 8. Copyright 2013 Metro Systems. 8 外部テーブルの進化(3) ● 9.1 – 外部テーブルサポート(検索のみ) – file_fdwの追加 – SERVER、USER MAPPING、FOREIGN TABLE構文の追加
  • 9. Copyright 2013 Metro Systems. 9 外部テーブルの進化(4) ● 9.2 – 外部テーブルへのANALYZE – 複数候補パス(よりよいアクセスパスを選択) – 列単位のFDWオプション
  • 10. Copyright 2013 Metro Systems. 10 外部テーブルの進化(5) ● 9.3 – 書き込み可能な外部テーブル ● トランザクションコマンドもハンドリング可能 – postgres_fdwの追加
  • 11. Copyright 2013 Metro Systems. 11 さっそくデモ ● postgres_fdw – 他のPostgreSQLサーバにアクセスできるFDW – 9.1で外部テーブルと一緒に提案→却下 – 9.2でANALYZE対応などと一緒に提案→却下 – 9.3でようやくcontribに追加 ● 長引いた原因はネーミング? ● pgsql_fdw → postgresql_fdw → postgres_fdw
  • 12. Copyright 2013 Metro Systems. 12 postgres_fdw(1) ● まずはEXTENSIONを作成 – 自動的にFOREIGN DATA WRAPPERも作成 ● 接続先サーバをSERVERで定義 – オプション:host、port、dbnameなどのlibpqオプ ション ● リモートユーザをUSER MAPPINGで定義 – オプション:user、password ● 外部データ構造をFOREIGN TABLEで定義 – オプション:table_name
  • 13. Copyright 2013 Metro Systems. 13 postgres_fdw(2) ● SERVERで定義したデータベースにUSER MAPPINGで定義したユーザで接続 – ローカルユーザとリモートユーザをマッピング – サーバ×ローカルユーザでリモートユーザを切り替え ● table_nameオプションで指定したテーブルに対する SELECT文を生成してクエリを実行 – リモートと別の名前で外部テーブルを定義可能 ● 取得した結果をローカルのPostgreSQL内で処理し、 クライアントに返却 – EXPLAIN VERBOSEでリモートクエリを表示
  • 14. Copyright 2013 Metro Systems. 14 postgres_fdw(3) ● WHERE句をリモートで評価して転送量削減 – MUTABLE/STABLEの演算子/関数 – ユーザ定義の演算子/関数 ● 他のテーブルやビューとの結合が可能 – 同じサーバの外部テーブル同士でも、結合はローカルに持って きてから→大量データの場合は要注意 ● ORDER BYやLIMIT/OFFSETはローカル評価 – 頑張ればORDER BYはリモート評価できそうです
  • 15. Copyright 2013 Metro Systems. 15 postgres_fdw(4) ● EXPLAIN結果でおかしい点があったんです が、気づきましたか?
  • 16. Copyright 2013 Metro Systems. 16 postgres_fdw(5) ● 見積もりを正確にするには… – クエリ実行時にリモートの見積もりを取得 ● FOREIGN TABLEかSERVERのオプションで use_remote_estimateをtrueに設定 ● クエリ実行時にEXPLAINをリモートで実行し、その 見積もりでローカルの実行計画を作成 – ANALYZEしてローカルに統計情報を保持 ● テーブル名を明示する必要がある(対象を指定しない場 合は外部テーブルをスキップ)
  • 17. Copyright 2013 Metro Systems. 17 postgres_fdw(6) ● リモート接続に関する注意点 – ローカル接続が続いている限り、リモート接続は 保持される→リモート側をシャットダウンすると き注意 – 同じサーバ上の外部テーブルへのクエリは同じ接 続で実行 ● REPEATABLE READまたはSERIALIZABLEの分離 レベルを使用
  • 18. Copyright 2013 Metro Systems. 18 postgres_fdw(7) ● 検索だけでなく、更新も可能 – INSERT/UPDATE/DELETE ● トランザクションも一部サポート – リモートトランザクションをロールバック可能 – 二相コミットは未サポート
  • 19. Copyright 2013 Metro Systems. 19 サードパーティの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/
  • 20. Copyright 2013 Metro Systems. 20 サードパーティの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/ ● https://github.com/pg-redis-fdw/redis_fdw – ldap_fdw ● http://pgxn.org/dist/ldap_fdw/ – neo4j_fdw ● https://github.com/nuko-yokohama/neo4j_fdw
  • 21. Copyright 2013 Metro Systems. 21 サードパーティの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
  • 22. Copyright 2013 Metro Systems. 22 外部データラッパの作り方 ● C言語関数 – FDW API(コールバック関数)を実装し、それらの関数ポインタを持っ た構造体を返すハンドラ関数を実装 – 検索のみならば7個の関数でOK ● SQL関数 – ハンドラ関数のSQLラッパ関数を実装 – オプションを検査するバリデータ関数を実装(必要に応じて) ● EXTENSION – 全体をEXTENSIONとしてパッケージ ● 詳細は – http://www.postgresql.org/docs/9.3/static/fdwhandler.html
  • 23. Copyright 2013 Metro Systems. 23 FDW API(1) ● 検索系 – プランナ ● GetForeignRelSize – テーブルサイズを見積もる ● GetForeignPaths – アクセスパスを(最低一つ)生成する – ソートキーの異なるパスなどを複数生成できる – プランナが自動的に最適なパスを選択してくれる ● GetForeignPlan – プランナが決定したアクセスパスに沿ったForeignScanプラン ノードを生成する – FDW独自の情報をGetForeignPathsから受け取れる
  • 24. Copyright 2013 Metro Systems. 24 FDW API(2) ● 検索系 – エグゼキュータ ● BeginForeignScan – スキャン開始時に一度だけ呼ばれる ● IterateForeignScan – 上位ノードが1行必要としたときに呼ばれる – HeapTuple(行データの内部表現)を生成して返す ● ReScanForeignScan – スキャン位置を先頭に戻してほしいときに呼ばれる – NestedLoopのインナー側の場合など – スキャン結果を捨ててしまった場合は、リモートから再取得する ● EndForeignScan(検索終了) – スキャン終了時に呼ばれる – クリーンアップなど – クエリがエラー終了すると呼ばれないので要注意
  • 25. Copyright 2013 Metro Systems. 25 FDW API(3) ● 検索用EXPLAIN – ExplainForeignScan ● 検索クエリのEXPLAINで呼ばれる ● ForeignScanノードに表示する情報を追加する ● VERBOSEモードのon/of判定も可能 ● ANALYZE – AnalyzeForeignTable ANALYZE可否を判断し、可能ならばサンプル収集関数を返す – AcquireSampleRows ● リモートデータからサンプル行を取得する
  • 26. Copyright 2013 Metro Systems. 26 FDW API(4) ● 更新系 – リライタ/プランナ ● AddForeignUpdateTargets – 更新時に使用するキー情報をタプル定義に追加する – postgres_fdwではCTID(タプルID)を使用 ● PlanForeignModify – 更新処理に必要な情報をプライベート領域に保存する – postgres_fdwでは更新用SQL分を生成
  • 27. Copyright 2013 Metro Systems. 27 FDW API(5) ● 更新系 – エグゼキュータ ● BeginForeignModify – 更新処理開始時に呼ばれる ● ExecForeignInsert ● ExecForeignUpdate(リモート更新実行) ● ExecForeignDelete(リモート削除実行) – 挿入/更新/削除一件ごとに一回呼ばれる – リモート側にデータを挿入/更新/削除する ● EndForeignModify(更新終了) – 更新処理終了時に呼ばれる
  • 28. Copyright 2013 Metro Systems. 28 FDW API(6) ● 更新用EXPLAIN – ExplainForeignModify ● 更新クエリのEXPLAINで呼ばれる ● 更新ノードに表示する情報を追加する ● VERBOSEモードのon/of判定も可能
  • 29. Copyright 2013 Metro Systems. 29 トランザクション管理 ● リモートトランザクションサポート – トランザクション終了時に呼ばれるコールバック関数を登 録しておき、そこでトランザクションコマンドを実行する ● RegisterXactCallback ● RegisterSubXactCallback – ローカルのCOMMIT/ROLLBACKの直前に呼ばれるの で、このコールバックで例外が発生するとローカルトラン ザクションもABORTする
  • 30. Copyright 2013 Metro Systems. 30 大変だな〜という人向けに ● blackhole_fdw – Andrew Dunstan氏が公開 ● https://bitbucket.org/adunstan/blackhole_fdw – APIに対応する関数を持つが、何もしない→検索 しても0件、更新は空振り – FDWのひな形として利用可能
  • 31. Copyright 2013 Metro Systems. 31 FDW関連の情報源 ● PostgreSQL wiki – http://wiki.postgresql.org/wiki/SQL/MED ● PGXN – http://pgxn.org
  • 32. Copyright 2013 Metro Systems. 32 おわりに ● ご清聴ありがとうございました。