Your SlideShare is downloading. ×
9.3で進化した外部テーブル
9.3で進化した外部テーブル
9.3で進化した外部テーブル
9.3で進化した外部テーブル
9.3で進化した外部テーブル
9.3で進化した外部テーブル
9.3で進化した外部テーブル
9.3で進化した外部テーブル
9.3で進化した外部テーブル
9.3で進化した外部テーブル
9.3で進化した外部テーブル
9.3で進化した外部テーブル
9.3で進化した外部テーブル
9.3で進化した外部テーブル
9.3で進化した外部テーブル
9.3で進化した外部テーブル
9.3で進化した外部テーブル
9.3で進化した外部テーブル
9.3で進化した外部テーブル
9.3で進化した外部テーブル
9.3で進化した外部テーブル
9.3で進化した外部テーブル
9.3で進化した外部テーブル
9.3で進化した外部テーブル
9.3で進化した外部テーブル
9.3で進化した外部テーブル
9.3で進化した外部テーブル
9.3で進化した外部テーブル
9.3で進化した外部テーブル
9.3で進化した外部テーブル
9.3で進化した外部テーブル
9.3で進化した外部テーブル
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

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

2,839

Published on

2013-06-08 第26回 しくみ+アプリケーション勉強会で使用したスライドです。 …

2013-06-08 第26回 しくみ+アプリケーション勉強会で使用したスライドです。

Ustreamで動画も観られます。
http://www.ustream.tv/recorded/34007681

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

No Downloads
Views
Total Views
2,839
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
20
Comments
0
Likes
5
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Copyright 2013 Metro Systems. 19.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、FOREIGNTABLE構文の追加
  • 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. 12postgres_fdw(1)●まずはEXTENSIONを作成– 自動的にFOREIGN DATA WRAPPERも作成●接続先サーバをSERVERで定義– オプション:host、port、dbnameなどのlibpqオプション●リモートユーザをUSER MAPPINGで定義– オプション:user、password●外部データ構造をFOREIGN TABLEで定義– オプション:table_name
  • 13. Copyright 2013 Metro Systems. 13postgres_fdw(2)●SERVERで定義したデータベースにUSERMAPPINGで定義したユーザで接続– ローカルユーザとリモートユーザをマッピング– サーバ×ローカルユーザでリモートユーザを切り替え●table_nameオプションで指定したテーブルに対するSELECT文を生成してクエリを実行– リモートと別の名前で外部テーブルを定義可能●取得した結果をローカルのPostgreSQL内で処理し、クライアントに返却– EXPLAIN VERBOSEでリモートクエリを表示
  • 14. Copyright 2013 Metro Systems. 14postgres_fdw(3)●WHERE句をリモートで評価して転送量削減– MUTABLE/STABLEの演算子/関数– ユーザ定義の演算子/関数●他のテーブルやビューとの結合が可能– 同じサーバの外部テーブル同士でも、結合はローカルに持ってきてから→大量データの場合は要注意●ORDER BYやLIMIT/OFFSETはローカル評価– 頑張ればORDER BYはリモート評価できそうです
  • 15. Copyright 2013 Metro Systems. 15postgres_fdw(4)●EXPLAIN結果でおかしい点があったんですが、気づきましたか?
  • 16. Copyright 2013 Metro Systems. 16postgres_fdw(5)●見積もりを正確にするには…– クエリ実行時にリモートの見積もりを取得●FOREIGN TABLEかSERVERのオプションでuse_remote_estimateをtrueに設定●クエリ実行時にEXPLAINをリモートで実行し、その見積もりでローカルの実行計画を作成– ANALYZEしてローカルに統計情報を保持●テーブル名を明示する必要がある(対象を指定しない場合は外部テーブルをスキップ)
  • 17. Copyright 2013 Metro Systems. 17postgres_fdw(6)●リモート接続に関する注意点– ローカル接続が続いている限り、リモート接続は保持される→リモート側をシャットダウンするとき注意– 同じサーバ上の外部テーブルへのクエリは同じ接続で実行●REPEATABLE READまたはSERIALIZABLEの分離レベルを使用
  • 18. Copyright 2013 Metro Systems. 18postgres_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. 23FDW API(1)●検索系– プランナ●GetForeignRelSize– テーブルサイズを見積もる●GetForeignPaths– アクセスパスを(最低一つ)生成する– ソートキーの異なるパスなどを複数生成できる– プランナが自動的に最適なパスを選択してくれる●GetForeignPlan– プランナが決定したアクセスパスに沿ったForeignScanプランノードを生成する– FDW独自の情報をGetForeignPathsから受け取れる
  • 24. Copyright 2013 Metro Systems. 24FDW API(2)●検索系– エグゼキュータ●BeginForeignScan– スキャン開始時に一度だけ呼ばれる●IterateForeignScan– 上位ノードが1行必要としたときに呼ばれる– HeapTuple(行データの内部表現)を生成して返す●ReScanForeignScan– スキャン位置を先頭に戻してほしいときに呼ばれる– NestedLoopのインナー側の場合など– スキャン結果を捨ててしまった場合は、リモートから再取得する●EndForeignScan(検索終了)– スキャン終了時に呼ばれる– クリーンアップなど– クエリがエラー終了すると呼ばれないので要注意
  • 25. Copyright 2013 Metro Systems. 25FDW API(3)●検索用EXPLAIN– ExplainForeignScan●検索クエリのEXPLAINで呼ばれる●ForeignScanノードに表示する情報を追加する●VERBOSEモードのon/of判定も可能●ANALYZE– AnalyzeForeignTableANALYZE可否を判断し、可能ならばサンプル収集関数を返す– AcquireSampleRows●リモートデータからサンプル行を取得する
  • 26. Copyright 2013 Metro Systems. 26FDW API(4)●更新系– リライタ/プランナ●AddForeignUpdateTargets– 更新時に使用するキー情報をタプル定義に追加する– postgres_fdwではCTID(タプルID)を使用●PlanForeignModify– 更新処理に必要な情報をプライベート領域に保存する– postgres_fdwでは更新用SQL分を生成
  • 27. Copyright 2013 Metro Systems. 27FDW API(5)●更新系– エグゼキュータ●BeginForeignModify– 更新処理開始時に呼ばれる●ExecForeignInsert●ExecForeignUpdate(リモート更新実行)●ExecForeignDelete(リモート削除実行)– 挿入/更新/削除一件ごとに一回呼ばれる– リモート側にデータを挿入/更新/削除する●EndForeignModify(更新終了)– 更新処理終了時に呼ばれる
  • 28. Copyright 2013 Metro Systems. 28FDW 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. 31FDW関連の情報源●PostgreSQL wiki– http://wiki.postgresql.org/wiki/SQL/MED●PGXN– http://pgxn.org
  • 32. Copyright 2013 Metro Systems. 32おわりに●ご清聴ありがとうございました。

×