5. 改めて・・・ PostgreSQL とは
代表的なオープンソースRDBMSのひとつ
Ingres(1970~ UCB) を先祖に持つ
PostgreSQL 6.0 (1996 ~) から 15年以上の歴史
BSDタイプのライセンスで配布
PostgreSQL Global Development Group と
University of California が著作権を持つ
ひとつのオーナー企業、オーナー個人を持たない
PostgreSQL開発に時間を割く技術者を提供している
企業がいくつかある/その企業群も少しずつ変遷して
いる
日本PostgreSQLユーザ会 5
6. PostgreSQL開発体制
支援企業
Contributors
藤井雅雄
板垣貴裕
原田均
Major Contributors 石井達夫
:
30~40名
Core Team
Josh Berkus
Tom Lane
Peter Eisentraut
Magnus Hagander
Bruce Momjian
Dave Page
開発コミュニ
ティ
日本PostgreSQLユーザ会 6
30. JSONデータ型(2)
使用例(テーブル定義)
postgres=# d users
Table "public.users"
Column | Type | Modifiers
--------+---------+-----------
id | integer | not null
name | text | not null
data | json |
Indexes:
"users_pkey" PRIMARY KEY, btree (id)
postgres=# SELECT * FROM users ORDER BY id;
id | name | data
----+------+------------------------------------------------------------
1 | foo | {"last_access":"2012-01-01 12:34:56","features":"[1,3,5]"}
2 | bar | {"last_access":"2011-11-25 23:42:41","features":"[2,3,6]"}
(2 rows)
日本PostgreSQLユーザ会 30
32. JSONデータ型(4)
使用例(row_to_json()関数)
postgres=# SELECT row_to_json(row(id, name))
postgres-# FROM foo WHERE id = 1;
row_to_json
--------------------------
{"f1":1,"f2":"name_1"}
(1 row)
postgres=# SELECT row_to_json(t) FROM
postgres-# (SELECT id, name FROM t WHERE id = 1) t;
row_to_json
--------------------------
{"id":1,"name":"name_1"}
(1 row)
日本PostgreSQLユーザ会 32
34. JSONデータ型(6)
使用例(json_get_text()関数)
postgres=# select * from users order by id;
-[ RECORD 1 ]----------------------------------------------------------
id | 1
name | Saito
attributes | {"carrior":"softbank", "model":"iPhone-5","maker":"Apple"}
-[ RECORD 2 ]----------------------------------------------------------
id | 2
name | Takahashi
attributes | {"carrior":"au", "model":"A01","maker":"iida"}
postgres=# SELECT name FROM users WHERE
postgres-# json_get_text(attributes::text, 'maker') = 'Apple';
name
-------
引数がtext型なので、
Saito
(1 row)
キャストが必要です
日本PostgreSQLユーザ会 34
35. カスタムプラン
EXECUTEのパラメータを考慮したプランを生成
postgres=# PREPARE s(int) AS SELECT * FROM t WHERE id < $1;
PREPARE
postgres=# EXPLAIN (COSTS off) EXECUTE s(1);
QUERY PLAN
------------------------------
Index Scan using t_pkey on t
Index Cond: (id < 1)
(2 rows)
postgres=# EXPLAIN (COSTS off) EXECUTE s(1000000);
QUERY PLAN
--------------------------
Seq Scan on t
Filter: (id < 1000000)
(2 rows)
日本PostgreSQLユーザ会 35
37. Parameterized Paths(2)
9.1ではbはSeqScanだが…
postgres=# EXPLAIN (COSTS false) SELECT 1 FROM c WHERE EXISTS (
postgres(# SELECT * FROM a JOIN b USING (b_id)
postgres(# WHERE b.c_id = c.c_id) AND c.value = 1;
QUERY PLAN
-------------------------------------------
Nested Loop Semi Join
Join Filter: (c.c_id = b.c_id)
-> Index Scan using c_value_key on c
Index Cond: (value = 1)
-> Nested Loop
-> Seq Scan on b
-> Index Scan using a__b_id on a
Index Cond: (b_id = b.b_id)
(8 rows)
日本PostgreSQLユーザ会 37
38. Parameterized Paths(3)
9.2ではcテーブルの値を使うIndexScanに!
postgres=# EXPLAIN (COSTS false) SELECT 1 FROM c WHERE EXISTS (
postgres(# SELECT * FROM a JOIN b USING (b_id)
postgres(# WHERE b.c_id = c.c_id) AND c.value = 1;
QUERY PLAN
------------------------------------------------
Nested Loop Semi Join
-> Index Scan using c_value_key on c
Index Cond: (value = 1)
-> Nested Loop
-> Index Scan using b__c_id on b
Index Cond: (c_id = c.c_id)
-> Index Only Scan using a__b_id on a
Index Cond: (b_id = b.b_id)
(8 rows)
日本PostgreSQLユーザ会 38
39. その他の拡張(1)
NOT VALID CHECK制約
CHECK制約作成時に既存のデータを検査しない
制約作成以降のデータ追加・更新は検査される
ALTER TABLE VALIDATE CONSTRAINT <制約名>
で現在のデータを検査可能
NOT INHERIT CHECK制約
継承関係を辿って子テーブルに制約が伝搬しない
親テーブルにデータを入れたくない、といったケース
で有効
日本PostgreSQLユーザ会 39
40. その他の拡張(2)
インデックス
Unbalanced treeをサポートするSP-GiST(Space-
Partitioned GiST)アクセスメソッドの追加
セキュリティ
セキュリティバリアビュー
VIEWのsecurity_barrier属性と関数のLEAKPROOF属性を組
み合わせることで、関数を通じてアクセス不可のカラム内容が
漏れることを防ぐ
CREATE や DROP もSE-Postgresで管理可能
ALTER TABLEでの .. ALTER TYPE の改善
全レコード書き替えは必要なときだけ
日本PostgreSQLユーザ会 40