SlideShare a Scribd company logo
OSS ユーザーのための勉強会
<OSS X Users Meeting> #6  
PostgreSQL と MySQL
Lighting-Talk
私的な PostgreSQL の楽しみ方
ぬこ@横浜 (@nuko_yokohama)
自己紹介
「ぬこ@横浜」で検索
ラーメンの食べ歩きと
無駄な PostgreSQL 拡張を考えるのが趣味
さて、 MySQL と PostgreSQL
どっち派なの?と聞かれたら
躊躇なく PostgreSQL 派と
私は答えちゃうわけですが
なんで
私が PostgreSQL を
お気に入りなのか
無駄に?
機能拡張能力が
高いから
ユーザ定義関数
ユーザ定義型
独自インデックス
Foreign Data Wrapper
Background Worker Process
Custom Scan API
手続き言語ハンドラ
HOOK 組込
etc ・・・
面白いので
自分でも
いくつか作った
ユーザ定義型の例
漢数字型 (ksj)
SELECT data, data + ' 拾 ' FROM ksj_sample;
data | ?column?
------------+----------------
五百壱拾六 | 五百弐拾六
零 | 壱拾
参万壱百壱 | 参万壱百壱拾壱
(3 rows)
SELECT data, data * ' 拾 ' FROM ksj_sample;
data | ?column?
------------+--------------
五百壱拾六 | 五千壱百六拾
零 | 零
参万壱百壱 | 参拾壱千壱拾
(3 rows)
SELECT data, data % ' 拾 ' FROM ksj_sample;
data | ?column?
------------+----------
五百壱拾六 | 六
零 | 零
参万壱百壱 | 壱
(3 rows)
SELECT sum(data) FROM ksj_sample;
sum
----------------
参万六百壱拾七
(1 row)
SELECT * FROM ksj_sample ORDER BY data;
data
------------
零
五百壱拾六
参万壱百壱
(3 rows)
漢数字で
四則演算や
比較演算できます
ユーザ定義型の例
ゆるい TEXT 型
(ntext)
SELECT * FROM foo WHERE data = ' 味噌らーめん ';
id | data
----+--------------
1 | 味噌ラーメン
(1 row)
SELECT * FROM foo WHERE data = 'postgresql';
id | data
----+----------------------
2 | PostgreSQL
(1 row)
SELECT * FROM foo WHERE data = ' エバンゲリオン ';
id | data
----+------------
3 | エヴァンゲリヲン
(1 row)
SELECT * FROM foo WHERE data = ' センヌリティウス ';
id | data
----+------
(0 rows)
SELECT * FROM foo WHERE data = ' フィロストラス ';
id | data
----+------
(0 rows)
SELECT * FROM foo WHERE data /= ' センヌリティウス ';
id | data
----+------------------
4 | セリヌンティウス
(1 row)
SELECT * FROM foo WHERE data /= ' フィロストラス ';
id | data
----+------------------
5 | フィロストラトス
(1 row)
日本語正規化
+
typo を許容
Foreign Data
Wrapper の例
neo4j_fdw
Neo4j Server
Neo4j Foriegn Data Wrapper
PostgreSQL
REST I/FCypher
Query
JSON
Result
SQL
PostgreSQL
Record
Set Cypher Query
Execute Cypher Query on REST
Generate PostgreSQL Record
Neo4j-FDW
Concept
Do not convert SQL into Cypher!
neo4j_fdw のデータソース
CREATE EXTENSION neo4j_fdw;
CREATE EXTENSION
CREATE SERVER foo
FOREIGN DATA WRAPPER neo4j_fdw
OPTIONS (url 'http://localhost:7474/db/data/cypher');
CREATE SERVER
CREATE FOREIGN TABLE bar2 (
name text,
follower_name text,
follower_gender text)
SERVER foo
OPTIONS (query '{"query":"START n=node(*) MATCH p=n<-[]-fm
RETURN n.name as name , fm.name as follower_name, fm.gender? as follower_gender " }');
CREATE FOREIGN TABLE
SELECT name, follower_name, follower_gender FROM bar2;
name | follower_name | follower_gender
---------+---------------+-----------------
Yamato | Akagi | Famale
Musashi | Yamato | Male
Akagi | Hiryu | Famale
Akagi | Yamato | Male
Kaga | Hiryu | Famale
Kaga | Musashi | Male
Nagato | Mutsu | Male
Nagato | Yamato | Male
Mutsu | Nagato | Male
Hiryu | Soryu | Famale
Hiryu | Akagi | Famale
Soryu | Hiryu | Famale
(12 rows)
グラフデータベースの
ビューを定義して、
そこへ SQL で問い合わせ
Background Worker
Process の例
hit_and_blow
hb_worker.so
Postgres server(9.3)
Background
Worker Process
(libpq を使用 )
【 postgresql.conf 】
shared_preload_libraries = 'hb_worker'
hb_worker.conninfo = 'dbname=xxx user=yyy'
psql
チャネル
HB_SV
チャネル
HB_CL
NOTIFY HB_CL,' 結果 ' NOTIFY HB_SV,' 数字列 '
こんな感じ
起動
LISTEN HB_CL
起動
LISTEN HB_SV
ロード・起動
数当て判定処理
psql からの実行例
postgres=# LISTEN HB_CL;
LISTEN
postgres=# NOTIFY HB_SV,'xxxx';;
NOTIFY
Asynchronous notification "hb_cl" with payload "Invalid data.(xxxx)"
received from server process with PID 29520.
postgres=# NOTIFY HB_SV,'0123';;
NOTIFY
Asynchronous notification "hb_cl" with payload "2 Hit / 1 Blow."
received from server process with PID 29520.
postgres=# NOTIFY HB_SV,'0813';;
NOTIFY
Asynchronous notification "hb_cl" with payload "4 Hit! Conguratulatoins!, next new game."
received from server process with PID 29520.
postgres=#
hb_worker の応答
LOG: NOTIFY HB_CL,'2 Hit / 1 Blow.'
LOG: hb_worker: NOTIFY HB_CL,'4 Hit! Conguratulatoins!, next new game.'
LOG: hb_worker: set secret number=0391
(注:見やすさのために適宜改行している)
psql から数当て
HOOK の例
pg_heartman
pg_heartman とは
[nuko]$ LOG: loaded library "hartmanhook"
LOG: database system was shut down at 2014-02-16 04:45:33 PST
LOG: database system is ready to accept connections
LOG: autovacuum launcher started
[nuko]$ psql test
psql (9.3.2)
Type "help" for help.
test=# SELECT 1;
NOTICE: Sir, yes, sir!
?column?
----------
1
(1 row)
test=# d
NOTICE: Sir, yes, sir!
List of relations
Schema | Name | Type | Owner
--------+------+-------+--------
public | test | table | harada
(1 row)
test=#
SQL を投げると
ハートマン軍曹から
罵ってもらえます
(現在実装中)
実に
くだらない
でも、拡張機能を
使って、こういう
遊びが出来るのが
PostgreSQL の
好きなところです
時間が余ったら
デモします
おしまい

More Related Content

PDF
KOF2015 PostgreSQL 9.5
PDF
Lt ingaoho-jsonb+postgeres fdw
PDF
[9.5新機能]追加されたgroupbyの使い方
PDF
Pgunconf 20121212-postgeres fdw
PDF
Chugoku db 20th-postgresql-10-pub
PDF
Chugokudb study-20150131
PDF
JSONBはPostgreSQL9.5でいかに改善されたのか
PDF
Jpug study-pq 20170121
KOF2015 PostgreSQL 9.5
Lt ingaoho-jsonb+postgeres fdw
[9.5新機能]追加されたgroupbyの使い方
Pgunconf 20121212-postgeres fdw
Chugoku db 20th-postgresql-10-pub
Chugokudb study-20150131
JSONBはPostgreSQL9.5でいかに改善されたのか
Jpug study-pq 20170121

What's hot (20)

PPT
第20回 中国地方DB勉強会 in 岡山 MySQLレプリケーション
PDF
DynamoDB MyNA・JPUG合同DB勉強会 in 東京
PDF
20130203 OSS-DB Exam Silver 技術解説無料セミナー
PDF
pg_bigmを用いた全文検索のしくみ(前編)
PDF
Postgre sql9.3新機能紹介
PDF
Jpug study-postgre sql-10-pub
PDF
Hackers Champloo 2016 postgresql-9.6
PDF
PostgreSQLの関数属性を知ろう
PDF
Chugoku db 17th-postgresql-9.6
PDF
PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介
PDF
PostgreSQL13 新機能紹介
PDF
Chugokudb18_2
PDF
Pg14_sql_standard_function_body
PDF
外部データラッパによる PostgreSQL の拡張
PDF
PostgreSQL10徹底解説
PDF
PGCon.jp 2014 jsonb-datatype-20141205
PDF
PostgreSQLとPythonとSQL
PDF
PostgreSQL9.3新機能紹介
PDF
PostgreSQL 9.5 新機能紹介
PDF
DeclarativeSql
第20回 中国地方DB勉強会 in 岡山 MySQLレプリケーション
DynamoDB MyNA・JPUG合同DB勉強会 in 東京
20130203 OSS-DB Exam Silver 技術解説無料セミナー
pg_bigmを用いた全文検索のしくみ(前編)
Postgre sql9.3新機能紹介
Jpug study-postgre sql-10-pub
Hackers Champloo 2016 postgresql-9.6
PostgreSQLの関数属性を知ろう
Chugoku db 17th-postgresql-9.6
PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介
PostgreSQL13 新機能紹介
Chugokudb18_2
Pg14_sql_standard_function_body
外部データラッパによる PostgreSQL の拡張
PostgreSQL10徹底解説
PGCon.jp 2014 jsonb-datatype-20141205
PostgreSQLとPythonとSQL
PostgreSQL9.3新機能紹介
PostgreSQL 9.5 新機能紹介
DeclarativeSql
Ad

Viewers also liked (8)

PDF
Plone conf 2014report by terada
PDF
Plone features and trends
PDF
Dockerの利用事例
PDF
Puppetが仲間外れにされて悲しいので、呼ばれてないのにPuppetの最新動向を話すよ
PDF
Docker事始めと最新動向 2015年6月
PDF
Machine Learning Basics for Web Application Developers
PDF
Caffeの特徴と最近の動向 -CNN、そしてRNNへ-
PPTX
Internet Week 2016 脆弱性スキャナによる対策支援の課題 Vuls
Plone conf 2014report by terada
Plone features and trends
Dockerの利用事例
Puppetが仲間外れにされて悲しいので、呼ばれてないのにPuppetの最新動向を話すよ
Docker事始めと最新動向 2015年6月
Machine Learning Basics for Web Application Developers
Caffeの特徴と最近の動向 -CNN、そしてRNNへ-
Internet Week 2016 脆弱性スキャナによる対策支援の課題 Vuls
Ad

Similar to my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方 (20)

PDF
Osc2015 hokkaido postgresql-semi-stuructured-datatype
PDF
20181110 fok2018-pg-extension
PDF
20190119 aws-study-pg-extension
PDF
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
PDF
Osc shimane-2016-do-postgres-dream-of-graph-database
PDF
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう by SRA OSS, Inc. 日本支社 高塚遥
PDF
MyNA JPUG study 20160220-postgresql-json-datatype
PDF
Pgunconf14 pg13-psql
PDF
20150530 pgunconf-pgbench-semi-structured-benchmark
PDF
PostgreSQLによるデータ分析ことはじめ
PDF
Do postgres-dream-of-graph-database
PDF
JSONB型でpostgresをNoSQLっぽく使う
PDF
Chugokudb18_1
PPTX
第51回NDS PostgreSQLのデータ型 #nds51
PDF
20171103 pg con-jp-lt-plpgsql
PDF
Jjugccc2017spring-postgres-ccc_m1
PPTX
Ctb57 with god7
PDF
色々な言語からPostgreSQLへ接続
PPTX
PostgreSQL使いのエンジニアから見たMySQL
PDF
20140531 JPUGしくみ+アプリケーション分科会 勉強会資料
Osc2015 hokkaido postgresql-semi-stuructured-datatype
20181110 fok2018-pg-extension
20190119 aws-study-pg-extension
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
Osc shimane-2016-do-postgres-dream-of-graph-database
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう by SRA OSS, Inc. 日本支社 高塚遥
MyNA JPUG study 20160220-postgresql-json-datatype
Pgunconf14 pg13-psql
20150530 pgunconf-pgbench-semi-structured-benchmark
PostgreSQLによるデータ分析ことはじめ
Do postgres-dream-of-graph-database
JSONB型でpostgresをNoSQLっぽく使う
Chugokudb18_1
第51回NDS PostgreSQLのデータ型 #nds51
20171103 pg con-jp-lt-plpgsql
Jjugccc2017spring-postgres-ccc_m1
Ctb57 with god7
色々な言語からPostgreSQLへ接続
PostgreSQL使いのエンジニアから見たMySQL
20140531 JPUGしくみ+アプリケーション分科会 勉強会資料

More from Toshi Harada (15)

PDF
無駄にNeo4jを使っている日々
PDF
Pgunconf16 toast
PDF
20190518 27th-chugoku db-lt-pg12
PDF
20190202-pgunconf-Access-Privilege-Inquiry-Functions
PDF
20181122 pg con-jp-lt-logrep
PDF
20171106 ntt-tx-postgre sql-10
PDF
20171028 osc-nagaoka-postgre sql-10
PDF
20170819 ocd-l tthon-pgdev
PDF
Ntt tx-study-postgre sql-10
PDF
Pgconf asia-201612203-pg reversi-ja
PDF
Pgconf asia-201612203-pg reversi
PDF
Kof2016 postgresql-9.6
PDF
Chugoku db 17th-lt-kly
PDF
Dblt#2 do-postgres-dream-of-graph-database
PDF
20150530 pgunconf-ycsb-jsonb
無駄にNeo4jを使っている日々
Pgunconf16 toast
20190518 27th-chugoku db-lt-pg12
20190202-pgunconf-Access-Privilege-Inquiry-Functions
20181122 pg con-jp-lt-logrep
20171106 ntt-tx-postgre sql-10
20171028 osc-nagaoka-postgre sql-10
20170819 ocd-l tthon-pgdev
Ntt tx-study-postgre sql-10
Pgconf asia-201612203-pg reversi-ja
Pgconf asia-201612203-pg reversi
Kof2016 postgresql-9.6
Chugoku db 17th-lt-kly
Dblt#2 do-postgres-dream-of-graph-database
20150530 pgunconf-ycsb-jsonb

my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方

  • 1. OSS ユーザーのための勉強会 <OSS X Users Meeting> #6   PostgreSQL と MySQL Lighting-Talk 私的な PostgreSQL の楽しみ方 ぬこ@横浜 (@nuko_yokohama)
  • 3. さて、 MySQL と PostgreSQL どっち派なの?と聞かれたら 躊躇なく PostgreSQL 派と 私は答えちゃうわけですが
  • 6. ユーザ定義関数 ユーザ定義型 独自インデックス Foreign Data Wrapper Background Worker Process Custom Scan API 手続き言語ハンドラ HOOK 組込 etc ・・・
  • 9. SELECT data, data + ' 拾 ' FROM ksj_sample; data | ?column? ------------+---------------- 五百壱拾六 | 五百弐拾六 零 | 壱拾 参万壱百壱 | 参万壱百壱拾壱 (3 rows) SELECT data, data * ' 拾 ' FROM ksj_sample; data | ?column? ------------+-------------- 五百壱拾六 | 五千壱百六拾 零 | 零 参万壱百壱 | 参拾壱千壱拾 (3 rows) SELECT data, data % ' 拾 ' FROM ksj_sample; data | ?column? ------------+---------- 五百壱拾六 | 六 零 | 零 参万壱百壱 | 壱 (3 rows) SELECT sum(data) FROM ksj_sample; sum ---------------- 参万六百壱拾七 (1 row) SELECT * FROM ksj_sample ORDER BY data; data ------------ 零 五百壱拾六 参万壱百壱 (3 rows) 漢数字で 四則演算や 比較演算できます
  • 11. SELECT * FROM foo WHERE data = ' 味噌らーめん '; id | data ----+-------------- 1 | 味噌ラーメン (1 row) SELECT * FROM foo WHERE data = 'postgresql'; id | data ----+---------------------- 2 | PostgreSQL (1 row) SELECT * FROM foo WHERE data = ' エバンゲリオン '; id | data ----+------------ 3 | エヴァンゲリヲン (1 row) SELECT * FROM foo WHERE data = ' センヌリティウス '; id | data ----+------ (0 rows) SELECT * FROM foo WHERE data = ' フィロストラス '; id | data ----+------ (0 rows) SELECT * FROM foo WHERE data /= ' センヌリティウス '; id | data ----+------------------ 4 | セリヌンティウス (1 row) SELECT * FROM foo WHERE data /= ' フィロストラス '; id | data ----+------------------ 5 | フィロストラトス (1 row) 日本語正規化 + typo を許容
  • 13. Neo4j Server Neo4j Foriegn Data Wrapper PostgreSQL REST I/FCypher Query JSON Result SQL PostgreSQL Record Set Cypher Query Execute Cypher Query on REST Generate PostgreSQL Record Neo4j-FDW Concept Do not convert SQL into Cypher!
  • 15. CREATE EXTENSION neo4j_fdw; CREATE EXTENSION CREATE SERVER foo FOREIGN DATA WRAPPER neo4j_fdw OPTIONS (url 'http://localhost:7474/db/data/cypher'); CREATE SERVER CREATE FOREIGN TABLE bar2 ( name text, follower_name text, follower_gender text) SERVER foo OPTIONS (query '{"query":"START n=node(*) MATCH p=n<-[]-fm RETURN n.name as name , fm.name as follower_name, fm.gender? as follower_gender " }'); CREATE FOREIGN TABLE SELECT name, follower_name, follower_gender FROM bar2; name | follower_name | follower_gender ---------+---------------+----------------- Yamato | Akagi | Famale Musashi | Yamato | Male Akagi | Hiryu | Famale Akagi | Yamato | Male Kaga | Hiryu | Famale Kaga | Musashi | Male Nagato | Mutsu | Male Nagato | Yamato | Male Mutsu | Nagato | Male Hiryu | Soryu | Famale Hiryu | Akagi | Famale Soryu | Hiryu | Famale (12 rows) グラフデータベースの ビューを定義して、 そこへ SQL で問い合わせ
  • 17. hb_worker.so Postgres server(9.3) Background Worker Process (libpq を使用 ) 【 postgresql.conf 】 shared_preload_libraries = 'hb_worker' hb_worker.conninfo = 'dbname=xxx user=yyy' psql チャネル HB_SV チャネル HB_CL NOTIFY HB_CL,' 結果 ' NOTIFY HB_SV,' 数字列 ' こんな感じ 起動 LISTEN HB_CL 起動 LISTEN HB_SV ロード・起動 数当て判定処理
  • 18. psql からの実行例 postgres=# LISTEN HB_CL; LISTEN postgres=# NOTIFY HB_SV,'xxxx';; NOTIFY Asynchronous notification "hb_cl" with payload "Invalid data.(xxxx)" received from server process with PID 29520. postgres=# NOTIFY HB_SV,'0123';; NOTIFY Asynchronous notification "hb_cl" with payload "2 Hit / 1 Blow." received from server process with PID 29520. postgres=# NOTIFY HB_SV,'0813';; NOTIFY Asynchronous notification "hb_cl" with payload "4 Hit! Conguratulatoins!, next new game." received from server process with PID 29520. postgres=# hb_worker の応答 LOG: NOTIFY HB_CL,'2 Hit / 1 Blow.' LOG: hb_worker: NOTIFY HB_CL,'4 Hit! Conguratulatoins!, next new game.' LOG: hb_worker: set secret number=0391 (注:見やすさのために適宜改行している) psql から数当て
  • 21. [nuko]$ LOG: loaded library "hartmanhook" LOG: database system was shut down at 2014-02-16 04:45:33 PST LOG: database system is ready to accept connections LOG: autovacuum launcher started [nuko]$ psql test psql (9.3.2) Type "help" for help. test=# SELECT 1; NOTICE: Sir, yes, sir! ?column? ---------- 1 (1 row) test=# d NOTICE: Sir, yes, sir! List of relations Schema | Name | Type | Owner --------+------+-------+-------- public | test | table | harada (1 row) test=# SQL を投げると ハートマン軍曹から 罵ってもらえます (現在実装中)