SlideShare ist ein Scribd-Unternehmen logo
1 von 33
Downloaden Sie, um offline zu lesen
外部データラッパによる
           PostgreSQLの拡張

                        株式会社メトロシステムズ
                                 花田茂




 Copyright (C) 2012 Metro          1
Systems Co., Ltd All Rights
        Reserved
セッションの流れ

  外部データラッパの概要
  外部データラッパとは?
  外部データラッパの実例

  外部データアクセスの流れ
  外部データラッパに関わるオブジェクト
  外部データへのアクセス

  外部データラッパの作成
  外部データラッパに必要なもの
  外部データラッパ作成のTips

  PostgreSQL 9.2に向けて
  追加された機能や提案中の機能

             Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved   2
自己紹介



 氏名 :花田 茂
 所属 :株式会社メトロシステムズ
 メール :shigeru.hanada@gmail.com
 twitter :@s87
 ブログ :http://d.hatena.ne.jp/s87/




               Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved   3
セッションの流れ

  外部データラッパの概要
  外部データラッパとは?
  外部データラッパの実例

  外部データアクセスの流れ
  外部データラッパに関わるオブジェクト
  外部データへのアクセス

  外部データラッパの作成
  外部データラッパに必要なもの
  外部データラッパ作成のTips

  PostgreSQL 9.2に向けて
  追加された機能や提案中の機能

             Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved   4
外部データラッパとは?

                     PostgreSQLにいくつかある
                     機能拡張の仕組みのひとつ
 PostgreSQLに備わった機能拡張の仕組み
                         概要                                         PostgreSQLに含まれる同種のもの

  関数      SQLから呼び出す関数を追加                                        pg_sleep()、dblink_query()など

  演算子     データ型に応じた演算子を追加                                        幾何演算など

  データ型    業務データを表現するデータ型を追加                                     IPアドレス型、幾何型、XML型など

 インデックス   データ特性に適したインデックスを追加                                    GIN、GiSTなど

 手続き言語    関数を実装する新しい言語を追加                                       PL/Perl、PL/pgSQLなど

 フック関数
          PostgreSQLの一部の処理に割り込み、独自                              auto_explainでの自動EXPLAIN実行処理の
          の処理を追加/置換                                             追加など


 外部データ    外部データを通常の表と同様に検索できる                                   CSVファイルなどを読み込むfile_fdw
  ラッパ



                 Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved                5
外部データラッパとは?



  PostgreSQLの外部にあるデータに

  普通のSELECT文で
  アクセスするためのしくみ
   postgres=# SELECT * FROM ex_users WHERE id = 1;
    id | name | birthday
   ----+------+------------             普通の表に見えるが
     1 | foo | 2001-01-01              実は外部にあるデータ
   (1 row)


   標準SQLの一部であるSQL/MED規格に準拠

                Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved   6
外部データ検索の流れ


               PostgreSQL
           ①                                     ②                             ③
                    プランナ                                         外部
  クライアント                                                         データ               外部データ
                  エグゼキュータ
                                                                 ラッパ
           ⑤                                     ④


                     内部データ




  ①   クライアントがSELECT文を発行
  ②   FROM句のテーブルに応じて外部データラッパに検索処理を委譲
  ③   FDWが検索内容に応じて外部データを取得
  ④   読み取った結果をPostgreSQLの内部表現に変換して返却
  ⑤   クライアントに結果を返却
               Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved               7
情報ハブとしてのPostgreSQL


                                          Web                        フラット
   RDBMS       NoSQL DB                                                               外部データ
                                         サービス                        ファイル




   mysql_fdw   redis_fdw          twitter_fdw                 file_fdw               外部データラッパ



                                                          通常の
                                                          テーブル
                   プランナ
  PostgreSQL     エグゼキュータ



                                                                   複数の外部データに対して
                  クライアント                                           シームレスにアクセス可能

                     Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved            8
外部データラッパの実例

  mysql_fdw
  MySQLのテーブルにアクセス
  pgsnake(Dave Page)氏がPGXNにおいてEXTENSIONとして公開

  PostgreSQLからC言語ライブラリ経由でMySQLサーバにアクセス
  他のRDBMSにあるデータをPostgreSQLでのSQL文で参照可能

 使用例
                                                             -- MySQL 側での実行結果
  -- MySQL にあるテーブルを検索                                        mysql> select * From user;
  postgres=# select id, name FROM mysql_user;                 ------+------------+
                                                             +------+------------+
   id |    name                                              | id | name         |
  ----+------------                                           ------+------------+
                                                             +------+------------+
    1 | PostgreSQL                                           |    1 | PostgreSQL |
    2 | MySQL                                                |    2 | MySQL      |
    3 | Firebird                                             |    3 | Firebird |
  (3 rows)                                                    ------+------------+
                                                             +------+------------+
                                                             3 rows in set (0.00 sec)
  postgres=#       MySQLのデータが
                PostgreSQLの検索結果に mysql>


                            Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved   9
外部データラッパの実例

  redis_fdw
  Key-ValueストアであるRedisにアクセス
  pgsnake(Dave Page)氏がPGXNにおいてEXTENSIONとして公開

  PostgreSQLからRedisサーバにアクセス
  NoSQL DBにあるデータをPostgreSQLでのSQL文で参照可能

 使用例
  -- Redis に格納されたデータから key が 1~3 のものを検索
  postgres=# select * from redis WHERE key BETWEEN '1' AND '3' ORDER BY key;
  NOTICE: Got qual key = 1
  NOTICE: Got qual key = 3
   key | value
  -----+------------
   1 | PostgreSQL
                                                                   Redisからは不定順で
   2 | MySQL                                                          返却されるので、
   3 | Firebird
  (3 行)
                                                                      PostgreSQL側で
                                                                                        ソートしている
  postgres=#



                        Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved             10
外部データラッパの実例

  twitter_fdw
  Twitterのつぶやきを条件指定で検索
  umitanuki氏がPGXNにおいてEXTENSIONとして公開

  PostgreSQLからcurl+twitter API経由でTwitterサービスにアクセス
  Webサービスのデータを直接参照可能

 使用例
  -- “PostgreSQL”を含むつぶやきの id と 内容の先頭を検索
  postgres=# SELECT id, substr(text, 1, 30) AS "text" FROM twitter
  postgres-# WHERE q = 'PostgreSQL' ORDER BY created_at LIMIT 3
                                                              3;
           id         |              text
  --------------------+--------------------------------
   165256379513307136 | Tengo que retomar PostgreSQL ,
   165243243322286080 | Develop your PostgreSQL Skills            LIMITを記述することで
   165237194234142720 | PostgreSQL
                        PostgreSQLコンファレンス
  (3 rows)                                                          PostgreSQL側で
                                                                                  件数制限が可能
  postgres=#




                       Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved        11
外部データラッパの実例

  file_fdw
  PostgreSQLが動作するサーバ上のファイルにアクセスするFDW
  contrib/file_fdwとして、PostgreSQLに同梱(9.1から)

  COPYコマンドと同じファイルフォーマットに対応
  外部ファイルのデータをテーブルにロードせずに随時参照可能

 使用例
  -- LOG レベルのサーバをログを CSV フォーマットのログファイルから検索
  postgres=# select log_time, message From postgres_log_current WHERE error_severity = 'LOG'
                                                                                       'LOG';
            log_time          |                         message
  ----------------------------+----------------------------------------------------------
   2012-02-03 10:21:26.929+09 | database system was shut down at 2012-02-03 10:21:25 JST
   2012-02-03 10:21:27.097+09 | database system is ready to accept connections
   2012-02-03 10:21:27.099+09 | autovacuum launcher started
                                                                             WHERE句を
  (3 rows)                                                                      書くことで
  postgres=#
                                                                                           絞込みが可能



                           Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved            12
外部データラッパを組み合わせると

   MySQLとRedisのデータを結合して検索
    MySQLにはデータベースの                                                   Redisにはデータベースの
    IDと名称を格納                                                         名称とバージョンを格納


                        db_name;
   mysql> select * From db_name;                                               redis>get PostgreSQL
    ------+------------+
   +------+------------+                                                       "9.1.2"
   | id | name         |                                                       redis>get
                                                                               redis>get MySQL
    ------+------------+
   +------+------------+                                                       "5.5.18"
   |    1 | PostgreSQL |                                                       redis>get Firebird
   |    2 | MySQL      |                                                       "2.5.1"
   |    3 | Firebird |
    ------+------------+
   +------+------------+




   postgres=# SELECT m.id m.name r.value AS version
                     m.id, m.name,
   postgres-# FROM redis_db_version r JOIN mysql_db_name m ON m.name = r.key
                   redis_db_version        mysql_db_name               r.key;
    id |    name    | version
   ----+------------+---------
     1 | PostgreSQL | 9.1.2
     2 | MySQL      | 5.5.18                       結合結果をPostgreSQLの
     3 | Firebird | 2.5.1
   (3 行)                                            結果セットとして利用可能

                         Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved                13
セッションの流れ

  外部データラッパの概要
  外部データラッパとは?
  外部データラッパの実例

  外部データアクセスの流れ
  外部データラッパに関わるオブジェクト
  外部データへのアクセス

  外部データラッパの作成
  外部データラッパに必要なもの
  外部データラッパ作成のTips

  PostgreSQL 9.2に向けて
  追加された機能や提案中の機能

             Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved   14
外部データラッパに関わるオブジェクト

               外部データラッパに関連するオブジェクトは階層構造
                 上位のオブジェクトから順に作成していく

  外部データラッパ(FOREIGN DATA WRAPPER)                                                          CREATE FOREIGN DATA WRAPPER fdw_name
                                                                                              HANDLER handler_func
       外部データの種類ごとに作成                                                                          VALIDATOR validator_func
       例)ファイル、MySQL、Redis、etc.                                                                OPTIONS (key 'value');
                                                                                                       key

            外部サーバ(SERVER)                                                                 CREATE SERVER server_name
              外部データの格納場所ごとに作成                                                                 FOREIGN DATA WRAPPER fdw_name
                                                                                              OPTIONS (key 'value);
                                                                                                       key
              例)mysql://host:port/database

                   ユーザマッピング(USER MAPPING)                                                 CREATE USER MAPPING FOR user_name
                                                                                                                  user_name
                      ローカルユーザごとに作成                                                            SERVER server_name
 8.4                  例)postgresユーザ、public(デフォルト)                                             OPTIONS (key 'value);
                                                                                                       key


 9.1               外部テーブル(FOREIGN TABLE)                                                  CREATE FOREIGN TABLE relname
                                                                                              (attname type, ...)
                      表として見せるかたまりごとに作成                                                        SERVER server_name
                      例)特定のCSVファイル、外部DBのテーブル                                                  OPTIONS (key 'value');
                                                                                                       key,
                                                                                                       key




                          Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved                                  15
オブジェクト:外部データラッパ

  FOREIGN DATA WRAPPER
     PostgreSQLからFDW依存の処理を呼び出すためのハンドラ関数を指定
     設定されたFDWオプションを検証するためのバリデータ関数を指定

     外部データラッパ単位で保持するFDWオプションを指定
     通常一つだけ必要なので、インストール時に自動的に作成されることも

 例
  postgres=# CREATE FOREIGN DATA WRAPPER mysql_fdw
  postgres-# HANDLER mysql_fdw_handler                   ハンドラ関数(事前にSQL関数を定義)
  postgres-# VALIDATOR mysql_fdw_validator
                       mysql_fdw_validator;
  CREATE FOREIGN DATA WRAPPER
  postgres=# ¥dew                                       バリデータ関数(事前にSQL関数を定義)
                   List of foreign-data wrappers
      Name | Owner |           Handler      |     Validator
  -----------+----------+-------------------+---------------------
   mysql_fdw | postgres | mysql_fdw_handler | mysql_fdw_validator
  (1 row)

                                                             psqlの¥dewコマンドで確認可能


                       Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved   16
オブジェクト:外部サーバ

  SERVER(FOREIGN SERVER)
     使用する外部データラッパを指定
     外部サーバ単位で保持するFDWオプションを指定

     一つの外部データラッパにつき複数を作成することが可能
     接続先がRDBMS向けの場合、データベースごとなどに作成

 例
     postgres=# CREATE SERVER asset_db
     postgres-# FOREIGN DATA WRAPPER mysql_fdw
     postgres-# OPTIONS (address '192.168.1.101', port '3306'
                         address                       '3306');
     CREATE SERVER
     postgres=# ¥des
               List of foreign servers
        Name | Owner | Foreign-data wrapper
     ----------+----------+----------------------
      asset_db | postgres | mysql_fdw
     (1 row)                                                  psqlの¥desコマンドで確認可能




                         Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved   17
オブジェクト:ユーザマッピング

  USER MAPPING
     外部データにアクセスするローカルユーザを指定(「public」も指定可)
     接続先外部サーバを指定

     ユーザマッピングごとに保持するFDWオプションを指定
     FDWの実装によっては作成不要(file_fdwなど)

 例
  postgres=# CREATE USER MAPPING FOR postgres
  postgres-# SERVER asset_db
  postgres-# OPTIONS (username 'mysql', password 'secret'
                      username                   'secret');
  CREATE USER MAPPING
  postgres=# ¥deu
  List of user mappings
    Server | User name
  ----------+-----------
   asset_db | postgres
  (1 row)
                                                psqlの¥deuコマンドで確認可能



                             Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved   18
オブジェクト:外部テーブル

  FOREIGN TABLE
     外部データの構造を表す列定義を指定
     外部データが存在する外部サーバを指定

     外部テーブルごとに保持するFDWオプションを指定
     この外部テーブルをSELECTすることで外部データラッパが外部データを取得

 例
  postgres=# CREATE FOREIGN TABLE assets (                          postgres=# ¥det
  postgres-#                NULL,
                 id int NOT NULL                                       List of foreign tables
  postgres-#                   NULL,
                 name text NOT NULL                                  Schema | Table | Server
  postgres-#              date,
                 buy_date date                                      --------+--------+----------
  postgres-#     note text                                           public | assets | asset_db
  postgres-# ) SERVER asset_db                                      (1 row)
  postgres-# OPTIONS (query 'SELECT * FROM assets'
                      query                assets');
  CREATE FOREIGN TABLE                                              postgres=#


                                                                                             psqlの¥detコマンドや
                                                                                             ¥dコマンドで確認可能


                             Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved                    19
外部データへのアクセス

                                                                                外部
           PostgreSQL                                                           データ         外部データ
                                      結果タプル

            エグゼキュータ                                                外部
                                                                   データ
                                                                   ラッパ
  検索結果
              プラン木
                                                                          外部サーバ
                                          コスト情報                                address, port, database
 クライアント       プランナ                                                        ユーザマッピング
                                                                               username, password
                                    外部データラッパ
                                          ハンドラ関数                           外部テーブル
             パース木                   外部テーブル                                     query
                                          列定義
     SQL
              パーサ
                                                            カタログ



               Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved                             20
外部テーブル検索のプラン

   MySQLとRedisのデータを結合して検索

  postgres=# EXPLAIN SELECT m.id, m.name, r.value AS version
  postgres-# FROM redis_db_version r JOIN mysql_db_name m ON m.name = r.key
  postgres-# ORDER BY m.id;
                                         QUERY PLAN
  ----------------------------------------------------------------------------------------
   Sort (cost=26.15..26.16 rows=1 width=68)
     Sort Key: m.id
     -> Nested Loop (cost=20.00..26.14 rows=1 width=68)
           Join Filter: (r.key = m.name)
           -> Foreign Scan on redis_db_version r (cost=10.00..13.00 rows=3 width=64)
                 Foreign Redis Database Size: 3
           -> Materialize (cost=10.00..13.02 rows=3 width=36)
                 -> Foreign Scan on mysql_db_name m (cost=10.00..13.00 rows=3 width=36)
                       Local server startup cost: 10
                       MySQL query: SELECT * FROM db_name
  (10 行)

  【検索結果】
   id |    name    | version
  ----+------------+---------
    1 | PostgreSQL | 9.1.2
    2 | MySQL      | 5.5.18
    3 | Firebird | 2.5.1
  (3 行)

                          Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved      21
セッションの流れ

  外部データラッパの概要
  外部データラッパとは?
  外部データラッパの実例

  外部データへのアクセス
  外部データラッパに関わるオブジェクト
  外部データへのアクセス

  外部データラッパの作成
  外部データラッパに必要なもの
  外部データラッパ作成のTips

  PostgreSQL 9.2に向けて
  追加された機能や提案中の機能

             Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved   22
外部データラッパに必要なもの


 C言語で外部データにアクセスできれば、
 外部データラッパを作れます!

    ハンドラ           プランナやエグゼキュータが呼び出すC言語関
                   数のポインタを保持するFdwRoutine構造体を返
     関数
                   すSQL関数です。


                   各種の外部データラッパ関連オブジェクトに設
   バリデータ
                   定されたFDWオプションの妥当性を検査する
    関数             SQL関数です。検査が不要ならば省略可能です。


  ほんの少しの           現時点ではPostgreSQLの内部構造に関する知
  元気と勇気            識がある程度必要です。

           Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved   23
ハンドラ関数が必要とするC言語関数


      関数名                 呼び出しタイミング                                                      必要な処理

                      プランナが外部テーブル単体のス                                外部テーブルのスキャンコストを見積もり、ス
 PlanForeignScan                                                     キャン実行時に必要な情報と一緒にFdwPlan
                      キャンのコストを知りたいとき                                 構造体に格納する。

                      エグゼキュータでプランを実行し                                外部テーブルのスキャンに必要な情報をカタ
 BeginForeignScan     始めるとき                                          ログなどから取得し、以降の関数で使用でき
                                                                     るようにFofeignScanStateに格納する。


                      エグゼキュータが次の行を必要と                                外部データから一行分のデータを読み取り、
 IterateForeignScan   するとき                                           Tupleを生成して返す。スキャンが末尾に到達
                                                                     した場合はそれを通知する。

                      Nested LoopのInner Scanがリセッ                     外部データからの読み取り位置を先頭にリ
 ReScanForeignScan    トされるとき(Outer Scanが次のタ                          セットする。
                      プルに進んだとき)


 EndForeignScan       エグゼキュータでプラン実行が完                                使用したリソースを解放する。
                      了したとき


                      外部テーブルを含むSELECT文の                              外部データラッパ特有のプラン情報(リモート
 ExplainForeignScan   EXPLAINコマンドが実行されたと                             に発行するクエリなど)がある場合は、
                      き                                              ExplainPropertyText()などで追加する。


                         Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved           24
ハンドラ関数の仕様

  引数
   なし

  戻り値
   FdwRoutineオブジェクトのポインタを返す
   SQL関数の戻り値はfdw_handler型(これにより、SQLからは呼べなくなる)

 【SQL関数】
 CREATE FUNCTION pgsql_fdw_handler
                 pgsql_fdw_handler()
 RETURNS fdw_handler AS
 '<ライブラリファイル名>' LANGUAGE C STRICT;
                                                                          static FdwRoutine fdwroutine = {
                                                                              T_FdwRoutine,
 【C言語関数】                                                                      pgsqlPlanForeignScan,
 Datum                                                                        pgsqlExplainForeignScan,
 pgsql_fdw_handler(PG_FUNCTION_ARGS)
 pgsql_fdw_handler                                                            pgsqlBeginForeignScan,
 {                                                                            pgsqlIterateForeignScan,
     PG_RETURN_POINTER(&fdwroutine);                                          pgsqlReScanForeignScan,
 }                                                                            pgsqlEndForeignScan,
                                                                          };




                             Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved                   25
バリデータ関数の仕様

  引数
   DDLで指定されたオプションの名前/値ペア(textの配列型)
   DDLで指定されたオブジェクトを管理するカタログ種別(pg_classのOID)
  戻り値
   なし(void)
   全て妥当なオプションであれば、呼び出し元に制御を戻す
   不正なオプションがあった場合は、内部でereport()などでエラーにする


 【SQL関数】                                                           【C言語関数】
 CREATE FUNCTION pgsql_fdw_validator
                 pgsql_fdw_validator
                           validator(text[], oid)                  Datum
 RETURNS void AS                                                   pgsql_fdw_validator(PG_FUNCTION_ARGS)
                                                                   pgsql_fdw_validator
 '<ライブラリファイル名>' LANGUAGE C STRICT;                                 {
                                                                       ...
                                                                       if (invalid_option_found)
                                                                           elog(ERROR, "invalid option");
                                                                       ...
                                                                   }


                             Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved                  26
外部データラッパ作成のTips

  手始めに
  まずは既存の外部データラッパをコピーしていろいろ改造
  慣れてきたら、独自の外部データにアクセス

  C言語関数の実装での注意点
  関数間での情報の受け渡しはfdw_private(List)で
  ただし、ここで受け渡せる情報はNode構造体を継承したもののみ
  非Node構造体はC言語文字列化してmakeString()でValueに変換、とか

  リソース管理
  動的メモリの確保は必ずpalloc()で!
  独自のメモリコンテキストを作成するのもあり
  外部リソースはResourceOwnerにコールバックを登録してエラー時に解放


              Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved   27
外部データラッパの実例(番外)

  multicorn
   Pythonで外部データラッパを実装するためのフレームワーク
   http://multicorn.orgで開発、PGXNで配布中

   PostgreSQL内部の知識が不要で、Pythonのライブラリが利用可能
   ForeignDataWrapperクラスを継承しexecuteメソッドを書くだけ!

 使用例
 ...
 class ProcessFdw(ForeignDataWrapper):
     ...

    def execute(self, quals, columns):
        # statgrab already returns its data in a format suitable
        # for Multicorn: a list (iterable) of dicts.
        # `quals` is ignored, PostgreSQL will do the filtering itself.
        return statgrab.sg_get_process_stats()

                                                                       実質この一行だけで、プロセス
                                                                       一覧がSELECT文で取得可能


                             Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved   28
セッションの流れ

  外部データラッパの概要
  外部データラッパとは?
  外部データラッパの実例

  外部データアクセスの流れ
  外部データラッパに関わるオブジェクト
  外部データへのアクセス

  外部データラッパの作成
  外部データラッパに必要なもの
  外部データラッパ作成のTips

  PostgreSQL 9.2に向けて
  追加された機能や提案中の機能

             Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved   29
PostgreSQL 9.2に向けて

   FDWオブジェクトの強化
   外部テーブルの各列にFDWオプションが指定可能
   psqlの¥d*+でFDWオプションをDDLと同じ書式で表示→コピペ可能

   外部データラッパ、外部サーバがCOMMENT ON文に対応
   これらの機能は、9.2での採用が決定しています!

 使用例
   -- 列単位のFDWオプションを設定
   postgres=# CREATE FOREIGN TABLE remote_users (
   postgres-#     id int NOT NULL OPTIONS (colname 'user_id'),
   postgres-#     name text NOT NULL OPTIONS (colname 'user_name')
                                                      'user_name'),
   postgres-#     ...
   postgres-# ) SERVER pgsql_fdw OPTIONS (relname 'users');
   postgres-# ¥det+

                                                                                   リモート側の列名などを
                                                                                   適切な単位で設定可能


                             Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved       30
PostgreSQL 9.2に向けて

   pgsql_fdw
    外部のPostgreSQLサーバのデータにアクセス
    PostgreSQL本体のcontribモジュールとして提案中

    PostgreSQLからlibpq経由で外部サーバにアクセス
    一部のWHERE句をリモート側で評価し転送量を削減可能!

 使用例
  postgres=# EXPLAIN SELECT tid, tbalance FROM pgbench_tellers WHERE bid = 11;
                                                                 QUERY PLAN
  ----------------------------------------------------------------------------------------------------
  -------------------------------------
   Foreign Scan on pgbench_tellers (cost=100.00..137.38 rows=10 width=12)
     Remote SQL: DECLARE pgsql_fdw_cursor_0 SCROLL CURSOR FOR SELECT tid, bid, tbalance, NULL FROM
  public.pgbench_tellers WHERE (bid = 1
                                bid 1)
  (2 rows)
                                                                        WHERE句をリモート側で評価
                                                                          しデータ転送量を削減


                              Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved              31
PostgreSQL 9.2に向けて

   外部テーブルのANALYZE対応
    外部テーブルの統計情報をANALYZEコマンドで収集可能に
    PostgreSQL本体の追加機能として提案中

    統計情報の収集処理は各外部データラッパに委譲
    検索条件やJOIN条件に関するコスト見積もりの精度が向上!

 使用例
  postgres=# EXPLAIN ANALYZE SELECT tid, tbalance FROM pgbench_tellers WHERE bid = 1;
                                                         QUERY PLAN
  ---------------------------------------------------------------------------------------------------
   Foreign Scan on pgbench_tellers (cost=100.00..137.96 rows=10 width=12) (actual time=46.363..46.740
  rows=10 loops=1)
     Filter: (bid = 1)
     Rows Removed by Filter: 20
     Remote SQL: DECLARE pgsql_fdw_cursor_2 SCROLL CURSOR FOR SELECT tid, bid, tbalance, …
   Total runtime: 48.167 ms                                         見積もり精度が向上
  (5 rows)




                              Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved             32
おわりに

       外部データラッパに関する情報は
           こんなところに
 PostgreSQL Wiki
   http://wiki.postgresql.org/wiki/Foreign_data_wrappers
   開発中のものも含めて、様々な外部データラッパがリストアップされ、
   配布場所やソースリポジトリなどがリンクされています。


 PGXN
   http://pgxn.org/
   本セッションで紹介した外部データラッパは、主にこのサイトで配布さ
   れています。PostgreSQLのEXTENSIONをシェルコマンドで管理す
   るツールもあります。


                      Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved   33

Weitere ähnliche Inhalte

Was ist angesagt?

PGroonga 2 - PostgreSQLでの全文検索の決定版
PGroonga 2 - PostgreSQLでの全文検索の決定版PGroonga 2 - PostgreSQLでの全文検索の決定版
PGroonga 2 - PostgreSQLでの全文検索の決定版Kouhei Sutou
 
PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報Masahiko Sawada
 
PostgreSQLではじめるOSS開発@OSC 2014 Hiroshima
PostgreSQLではじめるOSS開発@OSC 2014 HiroshimaPostgreSQLではじめるOSS開発@OSC 2014 Hiroshima
PostgreSQLではじめるOSS開発@OSC 2014 HiroshimaShigeru Hanada
 
C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努Insight Technology, Inc.
 
片手間MySQLチューニング戦略
片手間MySQLチューニング戦略片手間MySQLチューニング戦略
片手間MySQLチューニング戦略yoku0825
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -onozaty
 
PostgreSQLのgitレポジトリから見える2021年の開発状況(第30回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのgitレポジトリから見える2021年の開発状況(第30回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQLのgitレポジトリから見える2021年の開発状況(第30回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのgitレポジトリから見える2021年の開発状況(第30回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
SQLアンチパターン - ジェイウォーク
SQLアンチパターン - ジェイウォークSQLアンチパターン - ジェイウォーク
SQLアンチパターン - ジェイウォークke-m kamekoopa
 
MySQLerの7つ道具
MySQLerの7つ道具MySQLerの7つ道具
MySQLerの7つ道具yoku0825
 
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)NTT DATA Technology & Innovation
 
行ロックと「LOG: process 12345 still waiting for ShareLock on transaction 710 afte...
行ロックと「LOG:  process 12345 still waiting for ShareLock on transaction 710 afte...行ロックと「LOG:  process 12345 still waiting for ShareLock on transaction 710 afte...
行ロックと「LOG: process 12345 still waiting for ShareLock on transaction 710 afte...Masahiko Sawada
 
Spring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のことSpring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のこと心 谷本
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーyoku0825
 
MongoDBのアレをアレする
MongoDBのアレをアレするMongoDBのアレをアレする
MongoDBのアレをアレするAkihiro Kuwano
 
SolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみようSolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみようShinsuke Sugaya
 
オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...
オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...
オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...NTT DATA Technology & Innovation
 

Was ist angesagt? (20)

使ってみませんか?pg_hint_plan
使ってみませんか?pg_hint_plan使ってみませんか?pg_hint_plan
使ってみませんか?pg_hint_plan
 
PGroonga 2 - PostgreSQLでの全文検索の決定版
PGroonga 2 - PostgreSQLでの全文検索の決定版PGroonga 2 - PostgreSQLでの全文検索の決定版
PGroonga 2 - PostgreSQLでの全文検索の決定版
 
PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報
 
PostgreSQLではじめるOSS開発@OSC 2014 Hiroshima
PostgreSQLではじめるOSS開発@OSC 2014 HiroshimaPostgreSQLではじめるOSS開発@OSC 2014 Hiroshima
PostgreSQLではじめるOSS開発@OSC 2014 Hiroshima
 
C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
片手間MySQLチューニング戦略
片手間MySQLチューニング戦略片手間MySQLチューニング戦略
片手間MySQLチューニング戦略
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
 
PostgreSQLのgitレポジトリから見える2021年の開発状況(第30回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのgitレポジトリから見える2021年の開発状況(第30回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQLのgitレポジトリから見える2021年の開発状況(第30回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのgitレポジトリから見える2021年の開発状況(第30回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
SQLアンチパターン - ジェイウォーク
SQLアンチパターン - ジェイウォークSQLアンチパターン - ジェイウォーク
SQLアンチパターン - ジェイウォーク
 
MySQLerの7つ道具
MySQLerの7つ道具MySQLerの7つ道具
MySQLerの7つ道具
 
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
 
行ロックと「LOG: process 12345 still waiting for ShareLock on transaction 710 afte...
行ロックと「LOG:  process 12345 still waiting for ShareLock on transaction 710 afte...行ロックと「LOG:  process 12345 still waiting for ShareLock on transaction 710 afte...
行ロックと「LOG: process 12345 still waiting for ShareLock on transaction 710 afte...
 
Spring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のことSpring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のこと
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
 
MongoDBのアレをアレする
MongoDBのアレをアレするMongoDBのアレをアレする
MongoDBのアレをアレする
 
SolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみようSolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみよう
 
pg_bigmを用いた全文検索のしくみ(前編)
pg_bigmを用いた全文検索のしくみ(前編)pg_bigmを用いた全文検索のしくみ(前編)
pg_bigmを用いた全文検索のしくみ(前編)
 
オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...
オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...
オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...
 
Docker Swarm入門
Docker Swarm入門Docker Swarm入門
Docker Swarm入門
 

Ähnlich wie 外部データラッパによる PostgreSQL の拡張

20190119 aws-study-pg-extension
20190119 aws-study-pg-extension20190119 aws-study-pg-extension
20190119 aws-study-pg-extensionToshi Harada
 
Extending PostgreSQL - PgDay 2012 Japan
Extending PostgreSQL - PgDay 2012 JapanExtending PostgreSQL - PgDay 2012 Japan
Extending PostgreSQL - PgDay 2012 JapanShigeru Hanada
 
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014Shigeru Hanada
 
PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)Kosuke Kida
 
20181110 fok2018-pg-extension
20181110 fok2018-pg-extension20181110 fok2018-pg-extension
20181110 fok2018-pg-extensionToshi Harada
 
Data Factory V2 新機能徹底活用入門
Data Factory V2 新機能徹底活用入門Data Factory V2 新機能徹底活用入門
Data Factory V2 新機能徹底活用入門Keisuke Fujikawa
 
KOF2015 PostgreSQL 9.5
KOF2015 PostgreSQL 9.5KOF2015 PostgreSQL 9.5
KOF2015 PostgreSQL 9.5Toshi Harada
 
PostgreSQL10徹底解説
PostgreSQL10徹底解説PostgreSQL10徹底解説
PostgreSQL10徹底解説Masahiko Sawada
 
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
PostgreSQL13 新機能紹介
PostgreSQL13 新機能紹介PostgreSQL13 新機能紹介
PostgreSQL13 新機能紹介Satoshi Hirata
 
A Tour of PostgreSQL
A Tour of PostgreSQLA Tour of PostgreSQL
A Tour of PostgreSQLEDB
 
SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】
SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】
SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】Kohei KaiGai
 
Chugoku db 20th-postgresql-10-pub
Chugoku db 20th-postgresql-10-pubChugoku db 20th-postgresql-10-pub
Chugoku db 20th-postgresql-10-pubToshi Harada
 
[B22] PostgresPlus Advanced Server の Oracle Database 互換機能検証 by Noriyoshi Shinoda
[B22] PostgresPlus Advanced Server の Oracle Database 互換機能検証 by Noriyoshi Shinoda[B22] PostgresPlus Advanced Server の Oracle Database 互換機能検証 by Noriyoshi Shinoda
[B22] PostgresPlus Advanced Server の Oracle Database 互換機能検証 by Noriyoshi ShinodaInsight Technology, Inc.
 
Jjugccc2017spring-postgres-ccc_m1
Jjugccc2017spring-postgres-ccc_m1Jjugccc2017spring-postgres-ccc_m1
Jjugccc2017spring-postgres-ccc_m1Kosuke Kida
 
20190518 27th-chugoku db-lt-pg12
20190518 27th-chugoku db-lt-pg1220190518 27th-chugoku db-lt-pg12
20190518 27th-chugoku db-lt-pg12Toshi Harada
 
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsPL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsKohei KaiGai
 

Ähnlich wie 外部データラッパによる PostgreSQL の拡張 (20)

20190119 aws-study-pg-extension
20190119 aws-study-pg-extension20190119 aws-study-pg-extension
20190119 aws-study-pg-extension
 
Extending PostgreSQL - PgDay 2012 Japan
Extending PostgreSQL - PgDay 2012 JapanExtending PostgreSQL - PgDay 2012 Japan
Extending PostgreSQL - PgDay 2012 Japan
 
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
 
PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)
 
20181110 fok2018-pg-extension
20181110 fok2018-pg-extension20181110 fok2018-pg-extension
20181110 fok2018-pg-extension
 
PostgreSQL9.3新機能紹介
PostgreSQL9.3新機能紹介PostgreSQL9.3新機能紹介
PostgreSQL9.3新機能紹介
 
Chugokudb18_2
Chugokudb18_2Chugokudb18_2
Chugokudb18_2
 
Data Factory V2 新機能徹底活用入門
Data Factory V2 新機能徹底活用入門Data Factory V2 新機能徹底活用入門
Data Factory V2 新機能徹底活用入門
 
KOF2015 PostgreSQL 9.5
KOF2015 PostgreSQL 9.5KOF2015 PostgreSQL 9.5
KOF2015 PostgreSQL 9.5
 
PostgreSQL 12の話
PostgreSQL 12の話PostgreSQL 12の話
PostgreSQL 12の話
 
PostgreSQL10徹底解説
PostgreSQL10徹底解説PostgreSQL10徹底解説
PostgreSQL10徹底解説
 
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
PostgreSQL13 新機能紹介
PostgreSQL13 新機能紹介PostgreSQL13 新機能紹介
PostgreSQL13 新機能紹介
 
A Tour of PostgreSQL
A Tour of PostgreSQLA Tour of PostgreSQL
A Tour of PostgreSQL
 
SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】
SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】
SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】
 
Chugoku db 20th-postgresql-10-pub
Chugoku db 20th-postgresql-10-pubChugoku db 20th-postgresql-10-pub
Chugoku db 20th-postgresql-10-pub
 
[B22] PostgresPlus Advanced Server の Oracle Database 互換機能検証 by Noriyoshi Shinoda
[B22] PostgresPlus Advanced Server の Oracle Database 互換機能検証 by Noriyoshi Shinoda[B22] PostgresPlus Advanced Server の Oracle Database 互換機能検証 by Noriyoshi Shinoda
[B22] PostgresPlus Advanced Server の Oracle Database 互換機能検証 by Noriyoshi Shinoda
 
Jjugccc2017spring-postgres-ccc_m1
Jjugccc2017spring-postgres-ccc_m1Jjugccc2017spring-postgres-ccc_m1
Jjugccc2017spring-postgres-ccc_m1
 
20190518 27th-chugoku db-lt-pg12
20190518 27th-chugoku db-lt-pg1220190518 27th-chugoku db-lt-pg12
20190518 27th-chugoku db-lt-pg12
 
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsPL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
 

Mehr von Shigeru Hanada

PostgreSQL 10 新機能 @OSC 2017 Fukuoka
PostgreSQL 10 新機能 @OSC 2017 FukuokaPostgreSQL 10 新機能 @OSC 2017 Fukuoka
PostgreSQL 10 新機能 @OSC 2017 FukuokaShigeru Hanada
 
PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017Shigeru Hanada
 
Foreign Data Wrapper Enhancements
Foreign Data Wrapper EnhancementsForeign Data Wrapper Enhancements
Foreign Data Wrapper EnhancementsShigeru Hanada
 
PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会
PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会
PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会Shigeru Hanada
 
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会Shigeru Hanada
 
OSS-DB Goldへの第一歩~実践!運用管理~
OSS-DB Goldへの第一歩~実践!運用管理~OSS-DB Goldへの第一歩~実践!運用管理~
OSS-DB Goldへの第一歩~実践!運用管理~Shigeru Hanada
 
PostgreSQL開発ことはじめ - 第27回しくみ+アプリケーション勉強会
PostgreSQL開発ことはじめ - 第27回しくみ+アプリケーション勉強会PostgreSQL開発ことはじめ - 第27回しくみ+アプリケーション勉強会
PostgreSQL開発ことはじめ - 第27回しくみ+アプリケーション勉強会Shigeru Hanada
 
9.3で進化した外部テーブル
9.3で進化した外部テーブル9.3で進化した外部テーブル
9.3で進化した外部テーブルShigeru Hanada
 
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012Shigeru Hanada
 
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@KyotoShigeru Hanada
 

Mehr von Shigeru Hanada (10)

PostgreSQL 10 新機能 @OSC 2017 Fukuoka
PostgreSQL 10 新機能 @OSC 2017 FukuokaPostgreSQL 10 新機能 @OSC 2017 Fukuoka
PostgreSQL 10 新機能 @OSC 2017 Fukuoka
 
PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017
 
Foreign Data Wrapper Enhancements
Foreign Data Wrapper EnhancementsForeign Data Wrapper Enhancements
Foreign Data Wrapper Enhancements
 
PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会
PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会
PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会
 
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
 
OSS-DB Goldへの第一歩~実践!運用管理~
OSS-DB Goldへの第一歩~実践!運用管理~OSS-DB Goldへの第一歩~実践!運用管理~
OSS-DB Goldへの第一歩~実践!運用管理~
 
PostgreSQL開発ことはじめ - 第27回しくみ+アプリケーション勉強会
PostgreSQL開発ことはじめ - 第27回しくみ+アプリケーション勉強会PostgreSQL開発ことはじめ - 第27回しくみ+アプリケーション勉強会
PostgreSQL開発ことはじめ - 第27回しくみ+アプリケーション勉強会
 
9.3で進化した外部テーブル
9.3で進化した外部テーブル9.3で進化した外部テーブル
9.3で進化した外部テーブル
 
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012
 
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
 

Kürzlich hochgeladen

論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 

Kürzlich hochgeladen (10)

論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 

外部データラッパによる PostgreSQL の拡張

  • 1. 外部データラッパによる PostgreSQLの拡張 株式会社メトロシステムズ 花田茂 Copyright (C) 2012 Metro 1 Systems Co., Ltd All Rights Reserved
  • 2. セッションの流れ 外部データラッパの概要 外部データラッパとは? 外部データラッパの実例 外部データアクセスの流れ 外部データラッパに関わるオブジェクト 外部データへのアクセス 外部データラッパの作成 外部データラッパに必要なもの 外部データラッパ作成のTips PostgreSQL 9.2に向けて 追加された機能や提案中の機能 Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 2
  • 3. 自己紹介 氏名 :花田 茂 所属 :株式会社メトロシステムズ メール :shigeru.hanada@gmail.com twitter :@s87 ブログ :http://d.hatena.ne.jp/s87/ Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 3
  • 4. セッションの流れ 外部データラッパの概要 外部データラッパとは? 外部データラッパの実例 外部データアクセスの流れ 外部データラッパに関わるオブジェクト 外部データへのアクセス 外部データラッパの作成 外部データラッパに必要なもの 外部データラッパ作成のTips PostgreSQL 9.2に向けて 追加された機能や提案中の機能 Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 4
  • 5. 外部データラッパとは? PostgreSQLにいくつかある 機能拡張の仕組みのひとつ PostgreSQLに備わった機能拡張の仕組み 概要 PostgreSQLに含まれる同種のもの 関数 SQLから呼び出す関数を追加 pg_sleep()、dblink_query()など 演算子 データ型に応じた演算子を追加 幾何演算など データ型 業務データを表現するデータ型を追加 IPアドレス型、幾何型、XML型など インデックス データ特性に適したインデックスを追加 GIN、GiSTなど 手続き言語 関数を実装する新しい言語を追加 PL/Perl、PL/pgSQLなど フック関数 PostgreSQLの一部の処理に割り込み、独自 auto_explainでの自動EXPLAIN実行処理の の処理を追加/置換 追加など 外部データ 外部データを通常の表と同様に検索できる CSVファイルなどを読み込むfile_fdw ラッパ Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 5
  • 6. 外部データラッパとは? PostgreSQLの外部にあるデータに 普通のSELECT文で アクセスするためのしくみ postgres=# SELECT * FROM ex_users WHERE id = 1; id | name | birthday ----+------+------------ 普通の表に見えるが 1 | foo | 2001-01-01 実は外部にあるデータ (1 row) 標準SQLの一部であるSQL/MED規格に準拠 Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 6
  • 7. 外部データ検索の流れ PostgreSQL ① ② ③ プランナ 外部 クライアント データ 外部データ エグゼキュータ ラッパ ⑤ ④ 内部データ ① クライアントがSELECT文を発行 ② FROM句のテーブルに応じて外部データラッパに検索処理を委譲 ③ FDWが検索内容に応じて外部データを取得 ④ 読み取った結果をPostgreSQLの内部表現に変換して返却 ⑤ クライアントに結果を返却 Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 7
  • 8. 情報ハブとしてのPostgreSQL Web フラット RDBMS NoSQL DB 外部データ サービス ファイル mysql_fdw redis_fdw twitter_fdw file_fdw 外部データラッパ 通常の テーブル プランナ PostgreSQL エグゼキュータ 複数の外部データに対して クライアント シームレスにアクセス可能 Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 8
  • 9. 外部データラッパの実例 mysql_fdw MySQLのテーブルにアクセス pgsnake(Dave Page)氏がPGXNにおいてEXTENSIONとして公開 PostgreSQLからC言語ライブラリ経由でMySQLサーバにアクセス 他のRDBMSにあるデータをPostgreSQLでのSQL文で参照可能 使用例 -- MySQL 側での実行結果 -- MySQL にあるテーブルを検索 mysql> select * From user; postgres=# select id, name FROM mysql_user; ------+------------+ +------+------------+ id | name | id | name | ----+------------ ------+------------+ +------+------------+ 1 | PostgreSQL | 1 | PostgreSQL | 2 | MySQL | 2 | MySQL | 3 | Firebird | 3 | Firebird | (3 rows) ------+------------+ +------+------------+ 3 rows in set (0.00 sec) postgres=# MySQLのデータが PostgreSQLの検索結果に mysql> Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 9
  • 10. 外部データラッパの実例 redis_fdw Key-ValueストアであるRedisにアクセス pgsnake(Dave Page)氏がPGXNにおいてEXTENSIONとして公開 PostgreSQLからRedisサーバにアクセス NoSQL DBにあるデータをPostgreSQLでのSQL文で参照可能 使用例 -- Redis に格納されたデータから key が 1~3 のものを検索 postgres=# select * from redis WHERE key BETWEEN '1' AND '3' ORDER BY key; NOTICE: Got qual key = 1 NOTICE: Got qual key = 3 key | value -----+------------ 1 | PostgreSQL Redisからは不定順で 2 | MySQL 返却されるので、 3 | Firebird (3 行) PostgreSQL側で ソートしている postgres=# Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 10
  • 11. 外部データラッパの実例 twitter_fdw Twitterのつぶやきを条件指定で検索 umitanuki氏がPGXNにおいてEXTENSIONとして公開 PostgreSQLからcurl+twitter API経由でTwitterサービスにアクセス Webサービスのデータを直接参照可能 使用例 -- “PostgreSQL”を含むつぶやきの id と 内容の先頭を検索 postgres=# SELECT id, substr(text, 1, 30) AS "text" FROM twitter postgres-# WHERE q = 'PostgreSQL' ORDER BY created_at LIMIT 3 3; id | text --------------------+-------------------------------- 165256379513307136 | Tengo que retomar PostgreSQL , 165243243322286080 | Develop your PostgreSQL Skills LIMITを記述することで 165237194234142720 | PostgreSQL PostgreSQLコンファレンス (3 rows) PostgreSQL側で 件数制限が可能 postgres=# Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 11
  • 12. 外部データラッパの実例 file_fdw PostgreSQLが動作するサーバ上のファイルにアクセスするFDW contrib/file_fdwとして、PostgreSQLに同梱(9.1から) COPYコマンドと同じファイルフォーマットに対応 外部ファイルのデータをテーブルにロードせずに随時参照可能 使用例 -- LOG レベルのサーバをログを CSV フォーマットのログファイルから検索 postgres=# select log_time, message From postgres_log_current WHERE error_severity = 'LOG' 'LOG'; log_time | message ----------------------------+---------------------------------------------------------- 2012-02-03 10:21:26.929+09 | database system was shut down at 2012-02-03 10:21:25 JST 2012-02-03 10:21:27.097+09 | database system is ready to accept connections 2012-02-03 10:21:27.099+09 | autovacuum launcher started WHERE句を (3 rows) 書くことで postgres=# 絞込みが可能 Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 12
  • 13. 外部データラッパを組み合わせると MySQLとRedisのデータを結合して検索 MySQLにはデータベースの Redisにはデータベースの IDと名称を格納 名称とバージョンを格納 db_name; mysql> select * From db_name; redis>get PostgreSQL ------+------------+ +------+------------+ "9.1.2" | id | name | redis>get redis>get MySQL ------+------------+ +------+------------+ "5.5.18" | 1 | PostgreSQL | redis>get Firebird | 2 | MySQL | "2.5.1" | 3 | Firebird | ------+------------+ +------+------------+ postgres=# SELECT m.id m.name r.value AS version m.id, m.name, postgres-# FROM redis_db_version r JOIN mysql_db_name m ON m.name = r.key redis_db_version mysql_db_name r.key; id | name | version ----+------------+--------- 1 | PostgreSQL | 9.1.2 2 | MySQL | 5.5.18 結合結果をPostgreSQLの 3 | Firebird | 2.5.1 (3 行) 結果セットとして利用可能 Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 13
  • 14. セッションの流れ 外部データラッパの概要 外部データラッパとは? 外部データラッパの実例 外部データアクセスの流れ 外部データラッパに関わるオブジェクト 外部データへのアクセス 外部データラッパの作成 外部データラッパに必要なもの 外部データラッパ作成のTips PostgreSQL 9.2に向けて 追加された機能や提案中の機能 Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 14
  • 15. 外部データラッパに関わるオブジェクト 外部データラッパに関連するオブジェクトは階層構造 上位のオブジェクトから順に作成していく 外部データラッパ(FOREIGN DATA WRAPPER) CREATE FOREIGN DATA WRAPPER fdw_name HANDLER handler_func 外部データの種類ごとに作成 VALIDATOR validator_func 例)ファイル、MySQL、Redis、etc. OPTIONS (key 'value'); key 外部サーバ(SERVER) CREATE SERVER server_name 外部データの格納場所ごとに作成 FOREIGN DATA WRAPPER fdw_name OPTIONS (key 'value); key 例)mysql://host:port/database ユーザマッピング(USER MAPPING) CREATE USER MAPPING FOR user_name user_name ローカルユーザごとに作成 SERVER server_name 8.4 例)postgresユーザ、public(デフォルト) OPTIONS (key 'value); key 9.1 外部テーブル(FOREIGN TABLE) CREATE FOREIGN TABLE relname (attname type, ...) 表として見せるかたまりごとに作成 SERVER server_name 例)特定のCSVファイル、外部DBのテーブル OPTIONS (key 'value'); key, key Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 15
  • 16. オブジェクト:外部データラッパ FOREIGN DATA WRAPPER PostgreSQLからFDW依存の処理を呼び出すためのハンドラ関数を指定 設定されたFDWオプションを検証するためのバリデータ関数を指定 外部データラッパ単位で保持するFDWオプションを指定 通常一つだけ必要なので、インストール時に自動的に作成されることも 例 postgres=# CREATE FOREIGN DATA WRAPPER mysql_fdw postgres-# HANDLER mysql_fdw_handler ハンドラ関数(事前にSQL関数を定義) postgres-# VALIDATOR mysql_fdw_validator mysql_fdw_validator; CREATE FOREIGN DATA WRAPPER postgres=# ¥dew バリデータ関数(事前にSQL関数を定義) List of foreign-data wrappers Name | Owner | Handler | Validator -----------+----------+-------------------+--------------------- mysql_fdw | postgres | mysql_fdw_handler | mysql_fdw_validator (1 row) psqlの¥dewコマンドで確認可能 Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 16
  • 17. オブジェクト:外部サーバ SERVER(FOREIGN SERVER) 使用する外部データラッパを指定 外部サーバ単位で保持するFDWオプションを指定 一つの外部データラッパにつき複数を作成することが可能 接続先がRDBMS向けの場合、データベースごとなどに作成 例 postgres=# CREATE SERVER asset_db postgres-# FOREIGN DATA WRAPPER mysql_fdw postgres-# OPTIONS (address '192.168.1.101', port '3306' address '3306'); CREATE SERVER postgres=# ¥des List of foreign servers Name | Owner | Foreign-data wrapper ----------+----------+---------------------- asset_db | postgres | mysql_fdw (1 row) psqlの¥desコマンドで確認可能 Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 17
  • 18. オブジェクト:ユーザマッピング USER MAPPING 外部データにアクセスするローカルユーザを指定(「public」も指定可) 接続先外部サーバを指定 ユーザマッピングごとに保持するFDWオプションを指定 FDWの実装によっては作成不要(file_fdwなど) 例 postgres=# CREATE USER MAPPING FOR postgres postgres-# SERVER asset_db postgres-# OPTIONS (username 'mysql', password 'secret' username 'secret'); CREATE USER MAPPING postgres=# ¥deu List of user mappings Server | User name ----------+----------- asset_db | postgres (1 row) psqlの¥deuコマンドで確認可能 Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 18
  • 19. オブジェクト:外部テーブル FOREIGN TABLE 外部データの構造を表す列定義を指定 外部データが存在する外部サーバを指定 外部テーブルごとに保持するFDWオプションを指定 この外部テーブルをSELECTすることで外部データラッパが外部データを取得 例 postgres=# CREATE FOREIGN TABLE assets ( postgres=# ¥det postgres-# NULL, id int NOT NULL List of foreign tables postgres-# NULL, name text NOT NULL Schema | Table | Server postgres-# date, buy_date date --------+--------+---------- postgres-# note text public | assets | asset_db postgres-# ) SERVER asset_db (1 row) postgres-# OPTIONS (query 'SELECT * FROM assets' query assets'); CREATE FOREIGN TABLE postgres=# psqlの¥detコマンドや ¥dコマンドで確認可能 Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 19
  • 20. 外部データへのアクセス 外部 PostgreSQL データ 外部データ 結果タプル エグゼキュータ 外部 データ ラッパ 検索結果 プラン木 外部サーバ コスト情報 address, port, database クライアント プランナ ユーザマッピング username, password 外部データラッパ ハンドラ関数 外部テーブル パース木 外部テーブル query 列定義 SQL パーサ カタログ Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 20
  • 21. 外部テーブル検索のプラン MySQLとRedisのデータを結合して検索 postgres=# EXPLAIN SELECT m.id, m.name, r.value AS version postgres-# FROM redis_db_version r JOIN mysql_db_name m ON m.name = r.key postgres-# ORDER BY m.id; QUERY PLAN ---------------------------------------------------------------------------------------- Sort (cost=26.15..26.16 rows=1 width=68) Sort Key: m.id -> Nested Loop (cost=20.00..26.14 rows=1 width=68) Join Filter: (r.key = m.name) -> Foreign Scan on redis_db_version r (cost=10.00..13.00 rows=3 width=64) Foreign Redis Database Size: 3 -> Materialize (cost=10.00..13.02 rows=3 width=36) -> Foreign Scan on mysql_db_name m (cost=10.00..13.00 rows=3 width=36) Local server startup cost: 10 MySQL query: SELECT * FROM db_name (10 行) 【検索結果】 id | name | version ----+------------+--------- 1 | PostgreSQL | 9.1.2 2 | MySQL | 5.5.18 3 | Firebird | 2.5.1 (3 行) Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 21
  • 22. セッションの流れ 外部データラッパの概要 外部データラッパとは? 外部データラッパの実例 外部データへのアクセス 外部データラッパに関わるオブジェクト 外部データへのアクセス 外部データラッパの作成 外部データラッパに必要なもの 外部データラッパ作成のTips PostgreSQL 9.2に向けて 追加された機能や提案中の機能 Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 22
  • 23. 外部データラッパに必要なもの C言語で外部データにアクセスできれば、 外部データラッパを作れます! ハンドラ プランナやエグゼキュータが呼び出すC言語関 数のポインタを保持するFdwRoutine構造体を返 関数 すSQL関数です。 各種の外部データラッパ関連オブジェクトに設 バリデータ 定されたFDWオプションの妥当性を検査する 関数 SQL関数です。検査が不要ならば省略可能です。 ほんの少しの 現時点ではPostgreSQLの内部構造に関する知 元気と勇気 識がある程度必要です。 Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 23
  • 24. ハンドラ関数が必要とするC言語関数 関数名 呼び出しタイミング 必要な処理 プランナが外部テーブル単体のス 外部テーブルのスキャンコストを見積もり、ス PlanForeignScan キャン実行時に必要な情報と一緒にFdwPlan キャンのコストを知りたいとき 構造体に格納する。 エグゼキュータでプランを実行し 外部テーブルのスキャンに必要な情報をカタ BeginForeignScan 始めるとき ログなどから取得し、以降の関数で使用でき るようにFofeignScanStateに格納する。 エグゼキュータが次の行を必要と 外部データから一行分のデータを読み取り、 IterateForeignScan するとき Tupleを生成して返す。スキャンが末尾に到達 した場合はそれを通知する。 Nested LoopのInner Scanがリセッ 外部データからの読み取り位置を先頭にリ ReScanForeignScan トされるとき(Outer Scanが次のタ セットする。 プルに進んだとき) EndForeignScan エグゼキュータでプラン実行が完 使用したリソースを解放する。 了したとき 外部テーブルを含むSELECT文の 外部データラッパ特有のプラン情報(リモート ExplainForeignScan EXPLAINコマンドが実行されたと に発行するクエリなど)がある場合は、 き ExplainPropertyText()などで追加する。 Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 24
  • 25. ハンドラ関数の仕様 引数 なし 戻り値 FdwRoutineオブジェクトのポインタを返す SQL関数の戻り値はfdw_handler型(これにより、SQLからは呼べなくなる) 【SQL関数】 CREATE FUNCTION pgsql_fdw_handler pgsql_fdw_handler() RETURNS fdw_handler AS '<ライブラリファイル名>' LANGUAGE C STRICT; static FdwRoutine fdwroutine = { T_FdwRoutine, 【C言語関数】 pgsqlPlanForeignScan, Datum pgsqlExplainForeignScan, pgsql_fdw_handler(PG_FUNCTION_ARGS) pgsql_fdw_handler pgsqlBeginForeignScan, { pgsqlIterateForeignScan, PG_RETURN_POINTER(&fdwroutine); pgsqlReScanForeignScan, } pgsqlEndForeignScan, }; Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 25
  • 26. バリデータ関数の仕様 引数 DDLで指定されたオプションの名前/値ペア(textの配列型) DDLで指定されたオブジェクトを管理するカタログ種別(pg_classのOID) 戻り値 なし(void) 全て妥当なオプションであれば、呼び出し元に制御を戻す 不正なオプションがあった場合は、内部でereport()などでエラーにする 【SQL関数】 【C言語関数】 CREATE FUNCTION pgsql_fdw_validator pgsql_fdw_validator validator(text[], oid) Datum RETURNS void AS pgsql_fdw_validator(PG_FUNCTION_ARGS) pgsql_fdw_validator '<ライブラリファイル名>' LANGUAGE C STRICT; { ... if (invalid_option_found) elog(ERROR, "invalid option"); ... } Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 26
  • 27. 外部データラッパ作成のTips 手始めに まずは既存の外部データラッパをコピーしていろいろ改造 慣れてきたら、独自の外部データにアクセス C言語関数の実装での注意点 関数間での情報の受け渡しはfdw_private(List)で ただし、ここで受け渡せる情報はNode構造体を継承したもののみ 非Node構造体はC言語文字列化してmakeString()でValueに変換、とか リソース管理 動的メモリの確保は必ずpalloc()で! 独自のメモリコンテキストを作成するのもあり 外部リソースはResourceOwnerにコールバックを登録してエラー時に解放 Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 27
  • 28. 外部データラッパの実例(番外) multicorn Pythonで外部データラッパを実装するためのフレームワーク http://multicorn.orgで開発、PGXNで配布中 PostgreSQL内部の知識が不要で、Pythonのライブラリが利用可能 ForeignDataWrapperクラスを継承しexecuteメソッドを書くだけ! 使用例 ... class ProcessFdw(ForeignDataWrapper): ... def execute(self, quals, columns): # statgrab already returns its data in a format suitable # for Multicorn: a list (iterable) of dicts. # `quals` is ignored, PostgreSQL will do the filtering itself. return statgrab.sg_get_process_stats() 実質この一行だけで、プロセス 一覧がSELECT文で取得可能 Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 28
  • 29. セッションの流れ 外部データラッパの概要 外部データラッパとは? 外部データラッパの実例 外部データアクセスの流れ 外部データラッパに関わるオブジェクト 外部データへのアクセス 外部データラッパの作成 外部データラッパに必要なもの 外部データラッパ作成のTips PostgreSQL 9.2に向けて 追加された機能や提案中の機能 Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 29
  • 30. PostgreSQL 9.2に向けて FDWオブジェクトの強化 外部テーブルの各列にFDWオプションが指定可能 psqlの¥d*+でFDWオプションをDDLと同じ書式で表示→コピペ可能 外部データラッパ、外部サーバがCOMMENT ON文に対応 これらの機能は、9.2での採用が決定しています! 使用例 -- 列単位のFDWオプションを設定 postgres=# CREATE FOREIGN TABLE remote_users ( postgres-# id int NOT NULL OPTIONS (colname 'user_id'), postgres-# name text NOT NULL OPTIONS (colname 'user_name') 'user_name'), postgres-# ... postgres-# ) SERVER pgsql_fdw OPTIONS (relname 'users'); postgres-# ¥det+ リモート側の列名などを 適切な単位で設定可能 Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 30
  • 31. PostgreSQL 9.2に向けて pgsql_fdw 外部のPostgreSQLサーバのデータにアクセス PostgreSQL本体のcontribモジュールとして提案中 PostgreSQLからlibpq経由で外部サーバにアクセス 一部のWHERE句をリモート側で評価し転送量を削減可能! 使用例 postgres=# EXPLAIN SELECT tid, tbalance FROM pgbench_tellers WHERE bid = 11; QUERY PLAN ---------------------------------------------------------------------------------------------------- ------------------------------------- Foreign Scan on pgbench_tellers (cost=100.00..137.38 rows=10 width=12) Remote SQL: DECLARE pgsql_fdw_cursor_0 SCROLL CURSOR FOR SELECT tid, bid, tbalance, NULL FROM public.pgbench_tellers WHERE (bid = 1 bid 1) (2 rows) WHERE句をリモート側で評価 しデータ転送量を削減 Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 31
  • 32. PostgreSQL 9.2に向けて 外部テーブルのANALYZE対応 外部テーブルの統計情報をANALYZEコマンドで収集可能に PostgreSQL本体の追加機能として提案中 統計情報の収集処理は各外部データラッパに委譲 検索条件やJOIN条件に関するコスト見積もりの精度が向上! 使用例 postgres=# EXPLAIN ANALYZE SELECT tid, tbalance FROM pgbench_tellers WHERE bid = 1; QUERY PLAN --------------------------------------------------------------------------------------------------- Foreign Scan on pgbench_tellers (cost=100.00..137.96 rows=10 width=12) (actual time=46.363..46.740 rows=10 loops=1) Filter: (bid = 1) Rows Removed by Filter: 20 Remote SQL: DECLARE pgsql_fdw_cursor_2 SCROLL CURSOR FOR SELECT tid, bid, tbalance, … Total runtime: 48.167 ms 見積もり精度が向上 (5 rows) Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 32
  • 33. おわりに 外部データラッパに関する情報は こんなところに PostgreSQL Wiki http://wiki.postgresql.org/wiki/Foreign_data_wrappers 開発中のものも含めて、様々な外部データラッパがリストアップされ、 配布場所やソースリポジトリなどがリンクされています。 PGXN http://pgxn.org/ 本セッションで紹介した外部データラッパは、主にこのサイトで配布さ れています。PostgreSQLのEXTENSIONをシェルコマンドで管理す るツールもあります。 Copyright (C) 2012 Metro Systems Co., Ltd All Rights Reserved 33