Recommended
PDF
PDF
PDF
PDF
PDF
PDF
MyNA JPUG study 20160220-postgresql-json-datatype
PPT
Online schema change in mysql casual #1(2010/12/11)
PPT
Online schema change in mysql casual #1(2010/12/11)
PPTX
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PDF
PPTX
PDF
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
PPT
今年こそ始めたい!SQL超入門 MIRACLE Linux Meetup版 0620
PDF
PDF
PDF
PDF
PPTX
PostgreSQL使いのエンジニアから見たMySQL
PPT
今年こそ始めたい!SQL超入門 セミナー資料 2024年5月22日 富士通クラウドミートアップ
PDF
PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介
PDF
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
PDF
PDF
PDF
PPT
Online schema change_for_mysql_casual
PPT
20090107 Postgre Sqlチューニング(Sql編)
PDF
Incoming PostgreSQL 9.4 次バージョンの新機能をご紹介
PDF
20150530 pgunconf-pgbench-semi-structured-benchmark
PDF
PPTX
More Related Content
PDF
PDF
PDF
PDF
PDF
PDF
MyNA JPUG study 20160220-postgresql-json-datatype
PPT
Online schema change in mysql casual #1(2010/12/11)
PPT
Online schema change in mysql casual #1(2010/12/11)
Similar to Postgre SQL 9.3 新機能
PPTX
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PDF
PPTX
PDF
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
PPT
今年こそ始めたい!SQL超入門 MIRACLE Linux Meetup版 0620
PDF
PDF
PDF
PDF
PPTX
PostgreSQL使いのエンジニアから見たMySQL
PPT
今年こそ始めたい!SQL超入門 セミナー資料 2024年5月22日 富士通クラウドミートアップ
PDF
PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介
PDF
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
PDF
PDF
PDF
PPT
Online schema change_for_mysql_casual
PPT
20090107 Postgre Sqlチューニング(Sql編)
PDF
Incoming PostgreSQL 9.4 次バージョンの新機能をご紹介
PDF
20150530 pgunconf-pgbench-semi-structured-benchmark
More from Yasuo Ohgaki
PDF
PPTX
PDF
PDF
PDF
PDF
PPTX
PDF
PDF
ネットワークから学ぶソフトウェアセキュリティの基礎
PDF
PDF
PPTX
PPTX
PDF
PDF
アプリ開発者に大きな影響 2017年版OWASP TOP 10
PDF
Postgre SQL 9.3 新機能 1. 2. 自己紹介
▪ 氏名:大垣靖男(Ohgaki Yasuo)
▪ メール:yohgaki@ohgaki.net
▪ SNS: yohgaki (Twitter/Facebook/Gmail/LinkedIn)
▪ 職業:
▪ エレクトロニック・サービス・イニシアチブ有限会社社長
▪ PHP技術者認定機構顧問・BOSS CON CTO・岡山大学大学
院講師
▪ Webアプリソースコード検査
(Ruby/PHP/Java/C#/ObjectiveC)など
▪ OSS開発者:PHP、Momonga-Linuxコミッター
2013/07/08岡山Ruby会議2013 (C) Electronic Service Initiative, Ltd. 2
3. 4. 5. 6. 7. 8. 9. 10. 2013年秋 PostgreSQL 9.3
▪ PostgreSQL 9.3がこの秋に正式リリース予定です。執筆時
点ではBeta2がリリースされています。今回は現時点でリ
リースが確定している機能をご紹介します。
2013/8/3中国DB勉強会 10
11. 12. 13. 14. 15. 16. 17. 18. マテリアライズドビューの例
yohgaki@127 ~=# CREATE TABLE my_table (
id SERIAL PRIMARY KEY,
txt text,
date TIMESTAMP DEFAULT now()
);
CREATE TABLE
yohgaki@127 ~=# INSERT INTO my_table (txt) VALUES ('abc');
INSERT 0 1
yohgaki@127 ~=# INSERT INTO my_table (txt) VALUES ('abc');
INSERT 0 1
yohgaki@127 ~=# INSERT INTO my_table (txt) VALUES ('abc');
INSERT 0 1
yohgaki@127 ~=# CREATE MATERIALIZED VIEW my_mate_view AS SELECT * FROM my_table;
SELECT 3
yohgaki@127 ~=# INSERT INTO my_table (txt) VALUES ('abc');
INSERT 0 1
yohgaki@127 ~=# INSERT INTO my_table (txt) VALUES ('abc');
INSERT 0 1
yohgaki@127 ~=# INSERT INTO my_table (txt) VALUES ('abc');
INSERT 0 1
2013/8/3中国DB勉強会 18
19. マテリアライズドビューの例
yohgaki@127 ~=# SELECT * FROM my_mate_view;
id | txt | date
----+-----+----------------------------
1 | abc | 2013-07-25 07:39:32.099291
2 | abc | 2013-07-25 07:39:32.851492
3 | abc | 2013-07-25 07:39:35.835314
(3 行)
yohgaki@127 ~=# SELECT * FROM my_table;
id | txt | date
----+-----+----------------------------
1 | abc | 2013-07-25 07:39:32.099291
2 | abc | 2013-07-25 07:39:32.851492
3 | abc | 2013-07-25 07:39:35.835314
4 | abc | 2013-07-25 07:41:07.430558
5 | abc | 2013-07-25 07:41:08.278669
6 | abc | 2013-07-25 07:41:10.959413
(6 行)
2013/8/3中国DB勉強会 19
20. マテリアライズドビューの例
yohgaki@127 ~=# REFRESH MATERIALIZED VIEW my_mate_view;
REFRESH MATERIALIZED VIEW
yohgaki@127 ~=# SELECT * FROM my_mate_view;
id | txt | date
----+-----+----------------------------
1 | abc | 2013-07-25 07:39:32.099291
2 | abc | 2013-07-25 07:39:32.851492
3 | abc | 2013-07-25 07:39:35.835314
4 | abc | 2013-07-25 07:41:07.430558
5 | abc | 2013-07-25 07:41:08.278669
6 | abc | 2013-07-25 07:41:10.959413
(6 行)
2013/8/3中国DB勉強会 20
21. 22. 更新可能ビュー
▪ FROM句に1つのテーブルまたは更新可能ビューが設定され
ている
▪ WITH, DISTINCT, GROUP BY, HAVING, LIMIT, OFFSETが
トップレベルに含まれない
▪ UNION、INTERSECT、EXCEPTがトップレベルに含まれ
ない
▪ 全てのコラムが単純な参照であること(表現、リテラル、
関数でない)
▪ ビューのSELECTリストにコラムの重複が無い
▪ security_barrierプロパティが設定されていない
2013/8/3中国DB勉強会 22
23. 更新可能ビューの例
yohgaki@127 ~=# CREATE TABLE my_table (
yohgaki(# id SERIAL PRIMARY KEY,
yohgaki(# txt text,
yohgaki(# date TIMESTAMP DEFAULT now()
yohgaki(# );
CREATE TABLE
yohgaki@127 ~=# CREATE VIEW my_view AS SELECT * FROM my_table WHERE id > 2;
CREATE VIEW
yohgaki@127 ~=# INSERT INTO my_table (txt) VALUES ('abc');
INSERT 0 1
yohgaki@127 ~=# INSERT INTO my_table (txt) VALUES ('abc');
INSERT 0 1
yohgaki@127 ~=# INSERT INTO my_table (txt) VALUES ('abc');
INSERT 0 1
yohgaki@127 ~=# INSERT INTO my_table (txt) VALUES ('abc');
INSERT 0 1
yohgaki@127 ~=# INSERT INTO my_table (txt) VALUES ('abc');
INSERT 0 1
2013/8/3中国DB勉強会 23
24. 更新可能ビューの例
yohgaki@127 ~=# SELECT * FROM my_table;
id | txt | date
----+-----+----------------------------
1 | abc | 2013-07-25 06:58:08.747109
2 | abc | 2013-07-25 06:58:09.811324
3 | abc | 2013-07-25 06:58:10.442833
4 | abc | 2013-07-25 06:58:11.026806
5 | abc | 2013-07-25 06:58:11.611632
(5 行)
時間: 0.351 ms
yohgaki@127 ~=# SELECT * FROM my_view;
id | txt | date
----+-----+----------------------------
3 | abc | 2013-07-25 06:58:10.442833
4 | abc | 2013-07-25 06:58:11.026806
5 | abc | 2013-07-25 06:58:11.611632
(3 行)
2013/8/3中国DB勉強会 24
25. 更新可能ビューの例
yohgaki@127 ~=# INSERT INTO my_view (txt) VALUES ('xyz');
INSERT 0 1
時間: 20.490 ms
yohgaki@127 ~=# INSERT INTO my_view (txt) VALUES ('xyz');
INSERT 0 1
時間: 9.702 ms
yohgaki@127 ~=# INSERT INTO my_view (txt) VALUES ('xyz');
INSERT 0 1
2013/8/3中国DB勉強会 25
26. 更新可能ビューの例
yohgaki@127 ~=# SELECT * FROM my_view;
id | txt | date
----+-----+----------------------------
3 | abc | 2013-07-25 06:58:10.442833
4 | abc | 2013-07-25 06:58:11.026806
5 | abc | 2013-07-25 06:58:11.611632
6 | xyz | 2013-07-25 06:58:44.644324
7 | xyz | 2013-07-25 06:58:45.620243
8 | xyz | 2013-07-25 06:58:46.188217
(6 行)
yohgaki@127 ~=# SELECT * FROM my_table;
id | txt | date
----+-----+----------------------------
1 | abc | 2013-07-25 06:58:08.747109
2 | abc | 2013-07-25 06:58:09.811324
3 | abc | 2013-07-25 06:58:10.442833
4 | abc | 2013-07-25 06:58:11.026806
5 | abc | 2013-07-25 06:58:11.611632
6 | xyz | 2013-07-25 06:58:44.644324
7 | xyz | 2013-07-25 06:58:45.620243
8 | xyz | 2013-07-25 06:58:46.188217
(8 行)
2013/8/3中国DB勉強会 26
27. 更新可能ビューの例
yohgaki@127 ~=# DELETE FROM my_view WHERE id = 7;
DELETE 1
yohgaki@127 ~=# SELECT * FROM my_view;
id | txt | date
----+-----+----------------------------
3 | abc | 2013-07-25 06:58:10.442833
4 | abc | 2013-07-25 06:58:11.026806
5 | abc | 2013-07-25 06:58:11.611632
6 | xyz | 2013-07-25 06:58:44.644324
8 | xyz | 2013-07-25 06:58:46.188217
(5 行)
yohgaki@127 ~=# UPDATE my_view SET txt = 'ABC';
UPDATE 5
yohgaki@127 ~=# SELECT * FROM my_view;
id | txt | date
----+-----+----------------------------
3 | ABC | 2013-07-25 06:58:10.442833
4 | ABC | 2013-07-25 06:58:11.026806
5 | ABC | 2013-07-25 06:58:11.611632
6 | ABC | 2013-07-25 06:58:44.644324
8 | ABC | 2013-07-25 06:58:46.188217
(5 行)
2013/8/3中国DB勉強会 27
28. 29. 再帰ビュー
yohgaki@127 ~=# CREATE VIEW fib_up_to_50 AS
WITH RECURSIVE
fib AS (
SELECT 0 AS a, 1 AS b
UNION ALL
SELECT b, a + b FROM fib WHERE b <= 50
)
SELECT a FROM fib;
CREATE VIEW
yohgaki@127 ~=# SELECT * FROM fib_up_to_50;
a
----
0
1
1
2
3
5
8
13
21
34
2013/8/3中国DB勉強会 29
30. WITH RECURSIVEのみでも可能
yohgaki@127 ~=# WITH RECURSIVE
fib AS (
SELECT 0 AS a, 1 AS b
UNION ALL
SELECT b, a + b FROM fib WHERE b <= 50
)
SELECT a FROM fib;
a
----
0
1
1
2
3
5
8
13
21
34
2013/8/3中国DB勉強会 30
31. 実用的な例
WITH RECURSIVE included_parts(sub_part, part, quantity) AS (
SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product'
UNION ALL
SELECT p.sub_part, p.part, p.quantity
FROM included_parts pr, parts p
WHERE p.part = pr.sub_part
)
SELECT sub_part, SUM(quantity) as total_quantity
FROM included_parts
GROUP BY sub_part
2013/8/3中国DB勉強会 31
32. 33. JSONサポート PostgreSQL 9.2
• JSON形式のデータを保存
• データ形式はバリデーションされる
JSON型
• 配列をJSONとして返す。PostgreSQLの多次元配列がJSON配列として返
される。pretty_boolが真の場合、1次元の要素の後に改行が追加される。
array_to_json(anyarray [, pretty_bool])
• 行をJSONとして返す。pretty_boolが真の場合、一次元の要素の後に改行
が追加される。
row_to_json(record [, pretty_bool])
2013/8/3中国DB勉強会 33
34. JSONサポート - 演算子
• 配列要素またはオブジェクトフィールドを取得する。
->
• 配列要素の値またはオブジェクトフィールドの値をテキストとし
て取得する
->>
• 指定されたパスのJSONオブジェクトを取得する
#>
• 指定されたパスのJSONオブジェクトをテキストとして取得する。
#>>
2013/8/3中国DB勉強会 34
35. JSON用演算子の利用例
yohgaki@127 ~=# SELECT '[1,2,3]'::json->2;
?column?
----------
3
(1 行)
yohgaki@127 ~=# SELECT '{"a":1,"b":2}'::json->'b';
?column?
----------
2
(1 行)
yohgaki@127 ~=# SELECT '[1,2,3]'::json->>2;
?column?
----------
3
時間: 0.304 ms
yohgaki@127 ~=# SELECT '{"a":1,"b":2}'::json->>'b';
?column?
----------
2
(1 行)
2013/8/3中国DB勉強会 35
36. JSON用演算子の利用例
yohgaki@127 ~=# SELECT '{"a":[1,2,3],"b":[4,5,6]}'::json#>'{a,2}';
?column?
----------
3
yohgaki@127 ~=# SELECT '{"a":[1,2,3],"b":[4,5,6]}'::json#>>'{a,2}';
?column?
----------
3
(1 行)
2013/8/3中国DB勉強会 36
37. 38. 39. 40. 41. 42. 43. 44. JSON関数
• JSONデータからレコードを生成する。フィールド名が一致しな
いとNULLとなり、データ型が一致しない場合、エラーとなる。
json_populate_record(base anyelement, from_json
json, [, use_json_as_text bool=false])
yohgaki@127 ~=# CREATE TYPE x AS (f1 int, f2 bool, f3 text);
CREATE TYPE
yohgaki@127 ~=# SELECT * FROM json_populate_record(null::x, '{"f1":3,"f2":true,"f3":"Some text"}');
f1 | f2 | f3
----+----+-----------
3 | t | Some text
(1 行)
yohgaki@127 ~=# SELECT * FROM json_populate_record(null::x, '{"f1":3,"f2":true,"f3":"Some text", "f4":"Extra"}');
f1 | f2 | f3
----+----+-----------
3 | t | Some text
(1 行)
yohgaki@127 ~=# SELECT * FROM json_populate_record(null::x, '{"f1":3,"foo":"Bar","f3":"Some text"}');
f1 | f2 | f3
----+----+-----------
3 | | Some text
(1 行)
yohgaki@127 ~=# SELECT * FROM json_populate_record(null::x, '{"f1":3,"f2":"Bar","f3":"Some text", "f4":"Extra"}');
ERROR: invalid input syntax for type boolean: "Bar"
2013/8/3中国DB勉強会 44
45. 46. 47. JSON関数とテーブル
▪ JSON関数はJSON型を持つテーブルと一緒に利用すると
様々なデータ操作を行える
yohgaki@127 ~=# CREATE TABLE my_json(id SERIAL PRIMARY KEY, j JSON);
時間: 132.419 ms
yohgaki@127 ~=# INSERT INTO my_json (j) VALUES ('{"f1":1,"f2":true,"f3":"Foo"}');
INSERT 0 1
yohgaki@127 ~=# INSERT INTO my_json (j) VALUES ('{"f1":2,"f2":false,"f3":"bar"}');
INSERT 0 1
# json_each()にクエリ結果を渡す
yohgaki@127 ~=# SELECT * FROM json_each((SELECT j FROM my_json WHERE id=1));
key | value
-----+-------
f1 | 1
f2 | true
f3 | "Foo"
(3 行)
# クエリでJSON型を取得し、json_extract_path()関数と"->"オペレータで同じ値を取得する
yohgaki@127 ~=# SELECT json_extract_path(j, 'f1') AS f1a, j->'f1' AS f1b FROM my_json WHERE id = 3;
f1a | f1b
---------------------+---------------------
{"f11":11,"f12":12} | {"f11":11,"f12":12}
(1 行)
2013/8/3中国DB勉強会 47
48. 49. 50.