SlideShare a Scribd company logo
Copyright©2019 NTT corp. All Rights Reserved.
PostgreSQL 12は ここがスゴイ!
~性能改善やpluggable storage engineなどの新機能を徹底解説~
澤田 雅彦
NTT OSSセンタ
NTTデータ テクノロジーカンファレンス 2019 (2019/9/5)
Copyright©2019 NTT corp. All Rights Reserved.
2018/7/1 開発開始
2019/4/1 Feature Freeze
2019/5/23 Beta 1
2019/6/20 Beta 2
2019/8/8 Beta 3
2019/9/X RC?
2019/10/X GA?
12のリリースと同時に9.4の
コミュニティサポートが終わることに注意
2
PostgreSQL 12
Copyright©2019 NTT corp. All Rights Reserved.
既存機能の大幅な改善や、
将来の機能拡張への基盤、
かゆい所に手が届くような機能が揃っている、
PostgreSQLの総合力が上がったバージョン。
ただ非互換に注意!
3
PostgreSQL 12はどんなバージョン?
Copyright©2019 NTT corp. All Rights Reserved.
約180個の新機能
• テーブル・パーティショニングの改善
• CTE Inlining
• Vacuum改善
• SQL/JSON Path
• CREATE STATISTICS(拡張統計情報)
• Pluggable Storage Engine(Table AM)
• Generated Columns(生成列)
• 非互換
4
PostgreSQL 12の新機能
Copyright©2019 NTT corp. All Rights Reserved.
• テーブル・パーティショニングの改善
• CTE Inlining
• Vacuum改善
• Generated Columns(生成列)
• SQL/JSON Path
• CREATE STATISTICS(拡張統計情報)
• Pluggable Storage Engine(Table AM)
• 非互換
5
PostgreSQL 12の新機能
Copyright©2019 NTT corp. All Rights Reserved.
PostgreSQL 12でもテーブル・パーティショニングの改善は多い(全体の約
15%、PG11もほぼ同じ)
新機能一覧
• パーティション・プルーニングの性能改善
• パーティション・テーブルへの外部キー制約の実現
• パーティション・テーブルへのCOPYの性能改善
• ATTACH PARTITIONのロックが弱くなった
– UPDATE/DELETE/INSERTと競合しなくなった
• pg_partition_root(), pg_partition_ancestors()
• パーティション境界に式を指定(テーブル作成時に評価)
6
テーブル・パーティショニングの改善
Copyright©2019 NTT corp. All Rights Reserved. 7
プランニング時間
PostgreSQL11の新機能紹介より
PostgreSQL10に
比べて早くなっている。
けど、まだプラン生成
時間が子テーブル数に
比例して伸びている
Copyright©2019 NTT corp. All Rights Reserved.
• これまでは、プランナは内部で使用するテーブルの管理情報(RangeTblEntry,
RelOptInfo)を全ての子テーブルについて作成してた。
• PG12では、プルーニング情報を求めた後に興味のある子テーブルだけの管理情
報を作成するようにした。
• 数千規模の子テーブルがある場合に有用
8
子テーブルが多い時のプラン生成時間が大幅に改善
0
20
40
60
80
100
120
50 100 500 1000 2000 5000 10000
実行計画作成時間(MS)
子テーブル数
プラン生成時間(Range Partitioning)
PG12 PG11 PG10
Copyright©2019 NTT corp. All Rights Reserved.
• テーブル・パーティショニングの改善
• CTE Inlining
• Vacuum改善
• Generated Columns(生成列)
• SQL/JSON Path
• CREATE STATISTICS(拡張統計情報)
• Pluggable Storage Engine(Table AM)
• 非互換
9
PostgreSQL 12の新機能
Copyright©2019 NTT corp. All Rights Reserved.
• WITH句で指定したクエリ結果を一時テーブルみたいな形で扱うことがで
きる
– 複雑なSQLをより単純な部品に分解することで、SQLを読みやすくできる
• 再帰SQLのときにも使う
• PostgreSQLの実装では常にCTEの結果を一時テーブルとして持つ
– work_memを使用
– クエリの意味は同じでもsubselectを使った時とは実行計画を異なる
• MySQLも8.0からサポート
10
Common Table Expression (CTE)
Copyright©2019 NTT corp. All Rights Reserved.
-- CTEを利用(PG11まで)
=# EXPLAIN
WITH test AS (SELECT * FROM a WHERE c = 1)
SELECT * FROM test WHERE d = 1;
QUERY PLAN
------------------------------------------------------------------------
CTE Scan on test (cost=8.17..8.20 rows=1 width=8)
Filter: (d = 1)
CTE test
-> Index Scan using a_pkey on a (cost=0.15..8.17 rows=1 width=8)
Index Cond: (c = 1)
(5 rows)
11
CTEとSubSelect - PostgreSQL 11まで -
-- SubSelectを利用
=# EXPLAIN
SELECT * FROM (SELECT * FROM a WHERE c = 1 and d = 1) as test;
QUERY PLAN
----------------------------------------------------------------
Index Scan using a_pkey on a (cost=0.15..8.17 rows=1 width=8)
Index Cond: (c = 1)
Filter: (d = 1)
(3 rows)
Copyright©2019 NTT corp. All Rights Reserved.
-- CTEを利用(PG12)
=# EXPLAIN
WITH test AS (SELECT * FROM a WHERE c = 1)
SELECT * FROM test WHERE d = 1;
QUERY PLAN
----------------------------------------------------------------------------------
Index Scan using a_pkey on a (cost=0.15..8.17 rows=1 width=8)
Index Cond: (c = 1)
Filter: (d = 1)
(3 rows)
12
CTEとSubSelect - PostgreSQL 12から -
-- SubSelectを利用
=# EXPLAIN
SELECT * FROM (SELECT * FROM a WHERE c = 1 and d = 1) as test;
QUERY PLAN
----------------------------------------------------------------
Index Scan using a_pkey on a (cost=0.15..8.17 rows=1 width=8)
Index Cond: (c = 1)
Filter: (d = 1)
(3 rows)
Copyright©2019 NTT corp. All Rights Reserved.
• デフォルトでCTEのクエリを展開するようになった(CTE inlining)
– 他のRDBMSもこっちの動作がデフォルトになっている
– ただし再帰SQL、SELECT以外、volatile関数が入っている場合は強制的に
MATERIALIZE(一時テーブル的な扱い)される
• [ NOT ] MATERIALIZED句で動作を制御可能
13
PostgreSQL 12以降のCTE
=# EXPLAIN
WITH test AS MATERIALIZED (SELECT * FROM a WHERE c = 1)
SELECT * FROM test WHERE d = 1;
QUERY PLAN
------------------------------------------------------------------------
CTE Scan on test (cost=8.17..8.20 rows=1 width=8)
Filter: (d = 1)
CTE test
-> Index Scan using a_pkey on a (cost=0.15..8.17 rows=1 width=8)
Index Cond: (c = 1)
(5 rows)
Copyright©2019 NTT corp. All Rights Reserved.
• テーブル・パーティショニングの改善
• CTE Inlining
• Vacuum改善
• Generated Columns(生成列)
• SQL/JSON Path
• CREATE STATISTICS(拡張統計情報)
• Pluggable Storage Engine(Table AM)
• 非互換
14
PostgreSQL 12の新機能
Copyright©2019 NTT corp. All Rights Reserved.
• テーブルのスキャン、VACUUMは最適化済み
• インデックスのVACUUM、末尾の切り詰めは依然時間がかかる
• INDEX_CLEANUP、TRUNCATEでVACUUM処理の細かい制御が可能
– (テーブルの特性に応じて)時間がかかる処理をスキップできるようになった
Vacuumの改善
テーブル
スキャン
インデックス
VACUUM
テーブル
VACUUM
末尾の
切り詰め
長時間化に注意
1行でもゴミがあれば、
インデックスをフルスキャン
長時間化に注意
共有バッファをフルスキャン
Visibility Mapで
ゴミがあるページ
のみをスキャン
15
ゴミがあるページ
のみをVACUUM
Copyright©2019 NTT corp. All Rights Reserved.
• SKIP_LOCKED [ boolean ]
– すでにロックされているテーブルをスキップする
• TRUNCATE [ boolean ]
– テーブルの切り詰めを行わない
– 共有バッファのフルスキャンを回避
– テーブル毎に設定可能
• INDEX_CLEANUP [ boolean ]
– インデックスのVACUUMを行わない
– インデックスのVACUUMは常にフルスキャン
– テーブル毎に設定可能
16
Vacuumの改善 - 新オプション -
Copyright©2019 NTT corp. All Rights Reserved.
• TRUNCATEオプション
– テーブルの物理サイズが小さくならない
– こういう時に「TRUNCATE false」を検討する
• 高頻度で更新されるテーブル(一括削除とかがない=末尾の切り詰めが期待できない)
• 共有バッファが大きい(数百GB)
• ホットスタンバイでの競合を避けたい
• INDEX_CLEANUPオプション
– インデックスが肥大化する可能性がある
• インデックスはテーブルよりも肥大化しにくい
• REINDEX CONCURRENTLYでオンラインでShrinkすることも可能
– こういう時に「INDEX_CLEANUP false」を検討する
• 大規模テーブルで頻繁に更新がかかる
• 定期的にREINDEXできる時間がある
17
注意点と使い所
Copyright©2019 NTT corp. All Rights Reserved.
• テーブル・パーティショニングの改善
• CTE Inlining
• Vacuum改善
• Generated Columns(生成列)
• SQL/JSON Path
• CREATE STATISTICS(拡張統計情報)
• Pluggable Storage Engine(Table AM)
• 非互換
18
PostgreSQL 12の新機能
Copyright©2019 NTT corp. All Rights Reserved.
• 他の列情報から計算式によって値を生成する列
• PG 12ではSTOREDのみ対応
– VIRTUALは未対応
• テーブル定義時に列に計算式を指定
• 行の書き込み時に計算式から算出されたデータが列に格納さ
れる
19
Generated Columns(生成列)
Copyright©2019 NTT corp. All Rights Reserved.
=# CREATE TABLE people (
height_m numeric,
weight_kg numeric,
bmi numeric
GENERATED ALWAYS AS
(weight_kg / pow(height_m, 2)) STORED
);
=# INSERT INTO people VALUES (1.7, 65);
=# SELECT * FROM people;
height_m | weight_kg | bmi
----------+-----------+---------------------
1.7 | 65 | 22.4913494809688581
(1 row)
=# UPDATE people SET weight_kg = 60;
=# SELECT * FROM people ;
height_m | weight_kg | bmi
----------+-----------+---------------------
1.8 | 60 | 20.7612456747404844
(1 row)
20
Generated Columns(生成列)
Copyright©2019 NTT corp. All Rights Reserved.
• テーブル・パーティショニングの改善
• CTE Inlining
• Vacuum改善
• Generated Columns(生成列)
• SQL/JSON Path
• CREATE STATISTICS(拡張統計情報)
• Pluggable Storage Engine(Table AM)
• 非互換
21
PostgreSQL 12の新機能
Copyright©2019 NTT corp. All Rights Reserved.
• XpathのJSON版
• SQL 2016
• JSONデータから特定の部分を指定し、抽出するための構文
(言語)
• jsonb型のデータに対してのみ利用可能
– json型は非対応
• jsonb_path_exists(target jsonb, path jsonpath)
• jsonb_path_match(target jsonb, path jsonpath)
• jsonb_path_query(target jsonb, path jsonpath)
• jsonb_path_query_array(target jsonb, path jsonpath)
• jsonb_path_query_first(target jsonb, path jsonpath)
22
SQL/JSON path
Copyright©2019 NTT corp. All Rights Reserved.
{
“data1”: {
“a”: [1,2,3],
“b”: {
“c”: “cc”
}
},
“data2”: “d”
}
23
‘$.data1’
jsonb_path_query
------------------------------------
{"a": [1, 2, 3], "b": {"c": "cc"}}
(1 row)
Copyright©2019 NTT corp. All Rights Reserved.
{
“data1”: {
“a”: [1,2,3],
“b”: {
“c”: “cc”
}
},
“data2”: “d”
}
24
‘$.data1.a’
jsonb_path_query
------------------
[1, 2, 3]
(1 row)
Copyright©2019 NTT corp. All Rights Reserved.
{
“data1”: {
“a”: [1,2,3],
“b”: {
“c”: “cc”
}
},
“data2”: “d”
}
25
‘$.data1.a[1]’
jsonb_path_query
------------------
2
(1 row)
Copyright©2019 NTT corp. All Rights Reserved.
{
“data1”: {
“a”: [1,2,3],
“b”: {
“c”: “cc”
}
},
“data2”: “d”
}
26
‘$.data1.a[*]’
jsonb_path_query
------------------
1
2
3
(3 rows)
Copyright©2019 NTT corp. All Rights Reserved.
{
“data1”: {
“a”: [1,2,3],
“b”: {
“c”: “cc”
}
},
“data2”: “d”
}
27
‘$.data1.a ? (@ % 2 == 0)’
jsonb_path_query
------------------
2
(1 row)
Copyright©2019 NTT corp. All Rights Reserved.
{
“data1”: {
“a”: [1,2,3],
“b”: {
“c”: “cc”
}
},
“data2”: “d”
}
28
‘$.data1.keyvalue()
jsonb_path_query
----------------------------------------------
{"id": 32, "key": "a", "value": [1, 2, 3]}
{"id": 32, "key": "b", "value": {"c": "cc"}}
(2 rows)
Copyright©2019 NTT corp. All Rights Reserved.
https://www.postgresql.org/docs/12/functions-json.html
29
JSON/PATHの演算子と関数
Copyright©2019 NTT corp. All Rights Reserved.
• テーブル・パーティショニングの改善
• CTE Inlining
• Vacuum改善
• Generated Columns(生成列)
• SQL/JSON Path
• CREATE STATISTICS(拡張統計情報)
• Pluggable Storage Engine(Table AM)
• 非互換
30
PostgreSQL 12の新機能
Copyright©2019 NTT corp. All Rights Reserved.
(例)
コインとサイコロを投げ、コインが裏で3の目が出る確率は?
コインを投げる事と、サイコロを投げる事は独立な事象と考えるこ
とができる。(コインの表裏によってサイコロの出る目の確率は変わらない)
P(A) = 1/2
P(B) = 1/6
P (A∩B) = P(A)P(B) = 1/2 * 1/6 = 1/12
31
行数見積もりの問題 - 事象の独立性 -
事象の独立性
P(A∩B) = P(A)P(B)
PostgreSQLでは、(問い合わせ結果の)行数を推定する際に、
列の値の独立性を仮定している
Copyright©2019 NTT corp. All Rights Reserved.
次のテーブルを考えてみる
• 住所テーブル
• 都道府県、市町村などが入っている
32
行数見積もりの問題
=# SELECT * FROM addresses;
prefecture | city | town | chome
------------+------+------+-----------------------------
東京都 | 港区 | 港南 |
東京都 | 港区 | 港南 |
東京都 | 港区 | 港南 | 品川インターシティA棟
東京都 | 港区 | 港南 | 品川インターシティA棟 1階
東京都 | 港区 | 港南 | 品川インターシティA棟 2階
東京都 | 港区 | 港南 | 品川インターシティA棟 3階
東京都 | 港区 | 港南 | 品川インターシティA棟 4階
東京都 | 港区 | 港南 | 品川インターシティA棟 5階
東京都 | 港区 | 港南 | 品川インターシティA棟 6階
東京都 | 港区 | 港南 | 品川インターシティA棟 7階
(10 rows)
Copyright©2019 NTT corp. All Rights Reserved. 33
行数見積もりの問題
QUERY PLAN
----------------------------------------------------------------------------------------
Seq Scan on addresses (cost=0.00..3476.01 rows=75 width=54)
(actual time=9.343..33.347 rows=1257 loops=1)
Filter: ((prefecture = '東京都'::text) AND (city = '千代田区'::text))
Rows Removed by Filter: 148144
Planning Time: 0.146 ms
Execution Time: 33.456 ms
(5 rows)(5 rows)
WHERE
prefecture = ‘東京都’
AND
city = ‘千代田区’
を考える。都道府県と市町村には相関がある。
(東京都の行には千代田区が出やすい)
見積値 75件に対し、
実際には1257件取得。
約16倍、行数見積が間違っている
Copyright©2019 NTT corp. All Rights Reserved.
PostgreSQLは各条件を独立の事象だとみなし見積を行っている
ため、結果行数を過小に見積もってしまった。
S(A)をAの選択率(Selectivity)とした時、
S(東京都) = 5.7%
S(千代田区) = 0.8%
S(東京都 ∩ 千代田区) = S(東京都)S(千代田区) = 5.7% * 0.8% = 0.05%
行数見積 = 全行数 * 選択率 = 149401 * 0.0005 ≒ 75
34
行数見積もりのズレ
P (A∩B) =
P(A)P(B)
Copyright©2019 NTT corp. All Rights Reserved.
• 相関関係のある複数列に跨った統計情報を作成できる
– 例) “都道府県”列と”市町村”列の値の組み合わせに対して統計情報を作
成する
• PostgreSQL 10で導入された機能
– Oracle Databaseには昔からある
• 複数条件に対する行数見積をより正確に行うことができる
• 作成できる統計情報
– ndistinct
– dependencies
– mcv (most common variables:最頻値)
35
CREATE STATISTICS(拡張統計情報)
Copyright©2019 NTT corp. All Rights Reserved. 36
拡張統計情報を使ってみる
=# CREATE STATISTICS stts ON prefecture, city FROM addresses;
CREATE STATISTICS
=# ANALYZE stts; --ANALYZE時に拡張統計情報が作成される
ANALYZE
=# EXPLAIN ANALYZE SELECT * FROM addresses
WHERE prefecture = '東京都‘ AND city = '千代田区';
QUERY PLAN
-------------------------------------------------------------------------------------
Seq Scan on addresses (cost=0.00..3476.01 rows=1290 width=54)
(actual time=10.958..37.468 rows=1257 loops=1)
Filter: ((prefecture = '東京都'::text) AND (city = '千代田区'::text))
Rows Removed by Filter: 148144
Planning Time: 0.493 ms
Execution Time: 37.584 ms
(5 rows)
=# SELECT m.* FROM pg_statistic_ext JOIN pg_statistic_ext_data on (oid = stxoid),
pg_mcv_list_items(stxdmcv) m WHERE m.values = ARRAY['東京都', '千代田区'];
index | values | nulls | frequency | base_frequency
-------+-------------------+-------+----------------------+-----------------------
2 | {東京都,千代田区} | {f,f} | 0.008633333333333333 | 0.0005001577777777778
(1 row)
正確に結果行数の
見積りができている
Copyright©2019 NTT corp. All Rights Reserved.
• テーブル・パーティショニングの改善
• CTE Inlining
• Vacuum改善
• Generated Columns(生成列)
• SQL/JSON Path
• CREATE STATISTICS(拡張統計情報)
• Pluggable Storage Engine(Table AM)
• 非互換
37
PostgreSQL 12の新機能
Copyright©2019 NTT corp. All Rights Reserved.
• 独自のテーブル(Access Method)を定義、使用できるよう
なった
– インデックス(Index AM)は9.6から可能
• 夢が広がる機能
例えば
• OracleライクなUNDOベースのテーブル
• 列指向テーブル
• インメモリテーブル
• 他DBとの連携(RocksDB + PostgreSQLなど)
• 分散テーブル
38
Pluggable Storage Engine (Table AM)
Copyright©2019 NTT corp. All Rights Reserved.
https://www.pgcon.org/2019/schedule/attachments/559_pgcon-2019-transaction-logging.pdf
39
MySQLのStorage Engineとの違い
Copyright©2019 NTT corp. All Rights Reserved. 40
アーキテクチャ - これまで -
https://anarazel.de/talks/2018-10-25-pgconfeu-pluggable-storage/pluggable.pdf
Copyright©2019 NTT corp. All Rights Reserved. 41
アーキテクチャ - PG 12から -
https://anarazel.de/talks/2018-10-25-pgconfeu-pluggable-storage/pluggable.pdf
Copyright©2019 NTT corp. All Rights Reserved.
• 公式にサポートしているのはHeapのみ
• PostgreSQL 13では、なにか新しい種類のTable AMが入るか
もしれない
42
PostgreSQL 12ではAPIが切られただけ
Copyright©2019 NTT corp. All Rights Reserved.
• zheap (EnterpriseDB社)
– 行指向
– UNDOログ
– タプルヘッダが小さい
• ZedStore (Pivotal社)
– 列指向
– UNDOログ
– 圧縮
• In-memory table
43
どんなAccess Methodが今後入りそうか
Copyright©2019 NTT corp. All Rights Reserved.
• UNDOログを利用
– 古いタプルはすべてUNDO領域に退避
– Commitなら退避した古いタプルを消す、Rollbackならもとに戻す
• In-place update
• VACUUMがいらない
• タプルヘッダが従来のテーブルよりも小さい
– 25 bytes → 5 bytes
– MVCCに必要なデータはUNDOログにある
• ソースは公開されているので試してみるのもあり
– https://github.com/EnterpriseDB/zheap
44
zheap
Copyright©2019 NTT corp. All Rights Reserved.
目的は異なるが機能性は一部重複している
• 目的の違い
– FDWは外部データとの連携が目的(SQL/MEDの実装系)
– Table AMはPostgreSQLのストレージ層の切り出し
• 機能の違い
– FDWでは、実行計画の作成(外部サーバが担当する部分の切り出し等)、外
部サーバからのデータ取得を担当
• GetForeignPaths、GetForeignJoinPath, ExecForeignScanなど
– Table AMは、Executor⇔ストレージのI/Fのみ(今後変わる可能性あり)
• scan_getnextslot, index_fetch_begin, scan_bitmap_next_block, tuple_insert,
tuple_delete, scan_bitmapなど
– FDWではDDLに対応していない
45
Foreign Data Wrapperとの違い
Copyright©2019 NTT corp. All Rights Reserved.
• テーブル・パーティショニングの改善
• CTE Inlining
• Vacuum改善
• Generated Columns(生成列)
• SQL/JSON Path
• CREATE STATISTICS(拡張統計情報)
• Pluggable Storage Engine(Table AM)
• 非互換
46
PostgreSQL 12の新機能
Copyright©2019 NTT corp. All Rights Reserved.
• WITH OIDSの廃止
• recovery.confの廃止
• recovery_target_XXXの重複指定禁止
47
影響が大きそうな非互換
Copyright©2019 NTT corp. All Rights Reserved.
対象者
CREATE TABLE ... WITH OIDSを使っている人
内容
• WITH OIDSが使えなくなった
• WITH OIDSがあるテーブルがあるとpg_upgradeが実行
できない
対処方法
• WITH OIDSを使わなくても良い設計を検討する
• ALTER TABLE ... SET WITHOUT OIDSでOIDSを取り除く
48
WITH OIDSの廃止
Copyright©2019 NTT corp. All Rights Reserved.
対象者
リカバリまたはレプリケーションをする人(= 全員)
内容
• recovery.confはなくなりpostgresql.confに統合された
• 代わりにrecovery.signalやstandby.signalファイルが必要
• recovery.confがあると起動しない
対処方法
• recovery.confに書いていたパラメータをpostgresql.confに書
くようにする
• リカバリ時はrecovery.signal、スタンバイ時はstandby.signal
を置くようにする
• recovery_target_XXXは設定ファイルに必ず一つになるよう
にすること
49
recovery.confの廃止
Copyright©2019 NTT corp. All Rights Reserved.
• SHOWコマンドでリカバリ関連の設定値が確認できる
• リカバリやスタンバイサーバの設定値をreloadで反映できる
– archive_cleanup_command
– promote_trigger_file
– recovery_end_command
– recovery_min_apply_delay
50
大きな非互換だけどその恩恵は大きい
Copyright©2019 NTT corp. All Rights Reserved.
• 新機能による恩恵とアップグレードのコストのトレードオフ
• これぞという機能があればアップグレードを検討
– 悩みをうまく解決してくれる機能があるかも
• もれなく運用ツールの修正コストが付いてくることに留意す
る
51
12へアップグレードするべき?
Copyright©2019 NTT corp. All Rights Reserved.
• テーブル・パーティショニングの改善
• CTE Inlining
• Vacuum改善
• SQL/JSON Path
• CREATE STATISTICS(拡張統計情報)
• Pluggable Storage Engine(Table AM)
• Generated Columns(生成列)
• 非互換
52
まとめ
Copyright©2019 NTT corp. All Rights Reserved.
Thank you

More Related Content

What's hot (20)

PPTX
フックを使ったPostgreSQLの拡張機能を作ってみよう!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
PostgreSQL 15 開発最新情報
Masahiko Sawada
 
PDF
使ってみませんか?pg_hint_plan
NTT DATA OSS Professional Services
 
PDF
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PPTX
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
NTT DATA Technology & Innovation
 
PDF
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
Yahoo!デベロッパーネットワーク
 
PPTX
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
PostgreSQL 15の新機能を徹底解説
Masahiko Sawada
 
PPTX
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
Miki Shimogai
 
PDF
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
あなたの知らないPostgreSQL監視の世界
Yoshinori Nakanishi
 
PPTX
PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...
NTT DATA Technology & Innovation
 
PDF
並行実行制御の最適化手法
Sho Nakazono
 
PDF
SQL大量発行処理をいかにして高速化するか
Shogo Wakayama
 
PDF
NTT DATA と PostgreSQL が挑んだ総力戦
NTT DATA OSS Professional Services
 
PPTX
Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)
NTT DATA Technology & Innovation
 
PDF
Apache Kafka 0.11 の Exactly Once Semantics
Yoshiyasu SAEKI
 
PDF
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Toru Makabe
 
PDF
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
NTT DATA Technology & Innovation
 
フックを使ったPostgreSQLの拡張機能を作ってみよう!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQL 15 開発最新情報
Masahiko Sawada
 
使ってみませんか?pg_hint_plan
NTT DATA OSS Professional Services
 
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
NTT DATA Technology & Innovation
 
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
Yahoo!デベロッパーネットワーク
 
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQL 15の新機能を徹底解説
Masahiko Sawada
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
Miki Shimogai
 
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
あなたの知らないPostgreSQL監視の世界
Yoshinori Nakanishi
 
PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...
NTT DATA Technology & Innovation
 
並行実行制御の最適化手法
Sho Nakazono
 
SQL大量発行処理をいかにして高速化するか
Shogo Wakayama
 
NTT DATA と PostgreSQL が挑んだ総力戦
NTT DATA OSS Professional Services
 
Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)
NTT DATA Technology & Innovation
 
Apache Kafka 0.11 の Exactly Once Semantics
Yoshiyasu SAEKI
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Toru Makabe
 
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
NTT DATA Technology & Innovation
 

Similar to PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノロジーカンファレンス 2019講演資料) (20)

PDF
PostgreSQL 12の話
Masahiko Sawada
 
PDF
PostgreSQL 9.6 新機能紹介
Masahiko Sawada
 
PDF
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
Satoshi Nagayasu
 
PDF
最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)
NTT DATA Technology & Innovation
 
PDF
Postgre sql9.3新機能紹介
Daichi Egawa
 
PDF
KOF2015 PostgreSQL 9.5
Toshi Harada
 
PDF
今秋リリース予定のPostgreSQL11を徹底解説
Masahiko Sawada
 
PDF
PostgreSQL13 新機能紹介
Satoshi Hirata
 
PDF
PostgreSQLによるデータ分析ことはじめ
Ohyama Masanori
 
PDF
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012
Shigeru Hanada
 
PPTX
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
NTT DATA Technology & Innovation
 
PDF
PostgreSQL 10 新機能 @OSC 2017 Fukuoka
Shigeru Hanada
 
PPTX
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
PostgreSQL 9.5 新機能紹介
NTT DATA OSS Professional Services
 
ODP
PostgreSQL 9.2 新機能 - OSC 2012 Kansai@Kyoto
Shigeru Hanada
 
PDF
Incoming PostgreSQL 9.4 次バージョンの新機能をご紹介
Ryuichiro Munechika
 
PPTX
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
NTT DATA Technology & Innovation
 
PDF
20190518 27th-chugoku db-lt-pg12
Toshi Harada
 
PDF
PostgreSQL 10 新機能 @オープンセミナー香川 2017
Shigeru Hanada
 
PDF
PostgreSQL17対応版 EXPLAINオプションについて (第49回PostgreSQLアンカンファレンス@東京 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQL 12の話
Masahiko Sawada
 
PostgreSQL 9.6 新機能紹介
Masahiko Sawada
 
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
Satoshi Nagayasu
 
最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)
NTT DATA Technology & Innovation
 
Postgre sql9.3新機能紹介
Daichi Egawa
 
KOF2015 PostgreSQL 9.5
Toshi Harada
 
今秋リリース予定のPostgreSQL11を徹底解説
Masahiko Sawada
 
PostgreSQL13 新機能紹介
Satoshi Hirata
 
PostgreSQLによるデータ分析ことはじめ
Ohyama Masanori
 
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012
Shigeru Hanada
 
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
NTT DATA Technology & Innovation
 
PostgreSQL 10 新機能 @OSC 2017 Fukuoka
Shigeru Hanada
 
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQL 9.5 新機能紹介
NTT DATA OSS Professional Services
 
PostgreSQL 9.2 新機能 - OSC 2012 Kansai@Kyoto
Shigeru Hanada
 
Incoming PostgreSQL 9.4 次バージョンの新機能をご紹介
Ryuichiro Munechika
 
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
NTT DATA Technology & Innovation
 
20190518 27th-chugoku db-lt-pg12
Toshi Harada
 
PostgreSQL 10 新機能 @オープンセミナー香川 2017
Shigeru Hanada
 
PostgreSQL17対応版 EXPLAINオプションについて (第49回PostgreSQLアンカンファレンス@東京 発表資料)
NTT DATA Technology & Innovation
 
Ad

More from NTT DATA Technology & Innovation (20)

PDF
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
NTT DATA Technology & Innovation
 
PDF
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
NTT DATA Technology & Innovation
 
PDF
つくって壊して直して学ぶ Database on Kubernetes (CloudNative Days Summer 2025 発表資料)
NTT DATA Technology & Innovation
 
PDF
2025年現在のNewSQL (最強DB講義 #36 発表資料)
NTT DATA Technology & Innovation
 
PDF
Java in Japan: A Journey of Community, Culture, and Global Integration (JavaO...
NTT DATA Technology & Innovation
 
PDF
Unveiling the Hidden Layers of Java Class Files: Beyond Bytecode (Devnexus 2025)
NTT DATA Technology & Innovation
 
PDF
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
NTT DATA Technology & Innovation
 
PDF
Apache Sparkに対するKubernetesのNUMAノードを意識したリソース割り当ての性能効果 (Open Source Conference ...
NTT DATA Technology & Innovation
 
PDF
PostgreSQL最新動向 ~カラムナストアから生成AI連携まで~ (Open Source Conference 2025 Tokyo/Spring ...
NTT DATA Technology & Innovation
 
PDF
pgbenchのスレッドとクライアント (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
PostgreSQLのgitレポジトリから見える2024年の開発状況 (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
ストリーム処理はデータを失うから怖い?それ、何とかできますよ! 〜Apahe Kafkaを用いたストリーム処理における送達保証〜 (Open Source...
NTT DATA Technology & Innovation
 
PDF
生成AI時代のPostgreSQLハイブリッド検索 (第50回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
DAIS2024参加報告 ~Spark中心にしらべてみた~ (JEDAI DAIS Recap 講演資料)
NTT DATA Technology & Innovation
 
PDF
PostgreSQLのHTAP適応について考える (PostgreSQL Conference Japan 2024 講演資料)
NTT DATA Technology & Innovation
 
PDF
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
NTT DATA Technology & Innovation
 
PDF
Gartnerも注目するグリーンソフトウェアの実現に向けて (Green Software Foundation Global Summit 2024 T...
NTT DATA Technology & Innovation
 
PDF
パーティションのATTACH時の注意ポイント (第49回PostgreSQLアンカンファレンス@東京 発表資料)
NTT DATA Technology & Innovation
 
PDF
B-Treeのアーキテクチャ解説 (第49回PostgreSQLアンカンファレンス@東京 発表資料)
NTT DATA Technology & Innovation
 
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
NTT DATA Technology & Innovation
 
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
NTT DATA Technology & Innovation
 
つくって壊して直して学ぶ Database on Kubernetes (CloudNative Days Summer 2025 発表資料)
NTT DATA Technology & Innovation
 
2025年現在のNewSQL (最強DB講義 #36 発表資料)
NTT DATA Technology & Innovation
 
Java in Japan: A Journey of Community, Culture, and Global Integration (JavaO...
NTT DATA Technology & Innovation
 
Unveiling the Hidden Layers of Java Class Files: Beyond Bytecode (Devnexus 2025)
NTT DATA Technology & Innovation
 
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
NTT DATA Technology & Innovation
 
Apache Sparkに対するKubernetesのNUMAノードを意識したリソース割り当ての性能効果 (Open Source Conference ...
NTT DATA Technology & Innovation
 
PostgreSQL最新動向 ~カラムナストアから生成AI連携まで~ (Open Source Conference 2025 Tokyo/Spring ...
NTT DATA Technology & Innovation
 
pgbenchのスレッドとクライアント (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQLのgitレポジトリから見える2024年の開発状況 (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
ストリーム処理はデータを失うから怖い?それ、何とかできますよ! 〜Apahe Kafkaを用いたストリーム処理における送達保証〜 (Open Source...
NTT DATA Technology & Innovation
 
生成AI時代のPostgreSQLハイブリッド検索 (第50回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
DAIS2024参加報告 ~Spark中心にしらべてみた~ (JEDAI DAIS Recap 講演資料)
NTT DATA Technology & Innovation
 
PostgreSQLのHTAP適応について考える (PostgreSQL Conference Japan 2024 講演資料)
NTT DATA Technology & Innovation
 
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
NTT DATA Technology & Innovation
 
Gartnerも注目するグリーンソフトウェアの実現に向けて (Green Software Foundation Global Summit 2024 T...
NTT DATA Technology & Innovation
 
パーティションのATTACH時の注意ポイント (第49回PostgreSQLアンカンファレンス@東京 発表資料)
NTT DATA Technology & Innovation
 
B-Treeのアーキテクチャ解説 (第49回PostgreSQLアンカンファレンス@東京 発表資料)
NTT DATA Technology & Innovation
 
Ad

Recently uploaded (9)

PDF
Hyperledger Fabric最新v3.x系での機能強化、変更点にキャッチアップ!
LFDT Tokyo Meetup
 
PDF
Hyperledger Fabric公式サンプル fabric-samples徹底解説
LFDT Tokyo Meetup
 
PDF
生成AIパネルトーク(Interop25Tokyo APPS JAPAN M1-07,M2-07 嶋ポジショントーク)
嶋 是一 (Yoshikazu SHIMA)
 
PDF
20250630_aws_reinforce_2025_aws_sheild_network_security_director
uedayuki
 
PDF
SIG-AUDIO 2025 Vol.02 オンラインセミナー SIG-Audioプレゼン資料_オーディオプラグイン開発_塩澤達矢.pdf
IGDA Japan SIG-Audio
 
PDF
2023年版Web3技術の理想と現実
Syuhei Hiya
 
PDF
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
LFDT Tokyo Meetup
 
PDF
ABC2025S LT講演「世界の窓から Androidこんにちは2025」アプリ自動生成の将来?ロボティクスの夢再び?
嶋 是一 (Yoshikazu SHIMA)
 
PDF
20250710_Devinで切り拓くDB革命_〜価値創出に集中せよ〜.pdf
Masaki Yamakawa
 
Hyperledger Fabric最新v3.x系での機能強化、変更点にキャッチアップ!
LFDT Tokyo Meetup
 
Hyperledger Fabric公式サンプル fabric-samples徹底解説
LFDT Tokyo Meetup
 
生成AIパネルトーク(Interop25Tokyo APPS JAPAN M1-07,M2-07 嶋ポジショントーク)
嶋 是一 (Yoshikazu SHIMA)
 
20250630_aws_reinforce_2025_aws_sheild_network_security_director
uedayuki
 
SIG-AUDIO 2025 Vol.02 オンラインセミナー SIG-Audioプレゼン資料_オーディオプラグイン開発_塩澤達矢.pdf
IGDA Japan SIG-Audio
 
2023年版Web3技術の理想と現実
Syuhei Hiya
 
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
LFDT Tokyo Meetup
 
ABC2025S LT講演「世界の窓から Androidこんにちは2025」アプリ自動生成の将来?ロボティクスの夢再び?
嶋 是一 (Yoshikazu SHIMA)
 
20250710_Devinで切り拓くDB革命_〜価値創出に集中せよ〜.pdf
Masaki Yamakawa
 

PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノロジーカンファレンス 2019講演資料)

  • 1. Copyright©2019 NTT corp. All Rights Reserved. PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ 澤田 雅彦 NTT OSSセンタ NTTデータ テクノロジーカンファレンス 2019 (2019/9/5)
  • 2. Copyright©2019 NTT corp. All Rights Reserved. 2018/7/1 開発開始 2019/4/1 Feature Freeze 2019/5/23 Beta 1 2019/6/20 Beta 2 2019/8/8 Beta 3 2019/9/X RC? 2019/10/X GA? 12のリリースと同時に9.4の コミュニティサポートが終わることに注意 2 PostgreSQL 12
  • 3. Copyright©2019 NTT corp. All Rights Reserved. 既存機能の大幅な改善や、 将来の機能拡張への基盤、 かゆい所に手が届くような機能が揃っている、 PostgreSQLの総合力が上がったバージョン。 ただ非互換に注意! 3 PostgreSQL 12はどんなバージョン?
  • 4. Copyright©2019 NTT corp. All Rights Reserved. 約180個の新機能 • テーブル・パーティショニングの改善 • CTE Inlining • Vacuum改善 • SQL/JSON Path • CREATE STATISTICS(拡張統計情報) • Pluggable Storage Engine(Table AM) • Generated Columns(生成列) • 非互換 4 PostgreSQL 12の新機能
  • 5. Copyright©2019 NTT corp. All Rights Reserved. • テーブル・パーティショニングの改善 • CTE Inlining • Vacuum改善 • Generated Columns(生成列) • SQL/JSON Path • CREATE STATISTICS(拡張統計情報) • Pluggable Storage Engine(Table AM) • 非互換 5 PostgreSQL 12の新機能
  • 6. Copyright©2019 NTT corp. All Rights Reserved. PostgreSQL 12でもテーブル・パーティショニングの改善は多い(全体の約 15%、PG11もほぼ同じ) 新機能一覧 • パーティション・プルーニングの性能改善 • パーティション・テーブルへの外部キー制約の実現 • パーティション・テーブルへのCOPYの性能改善 • ATTACH PARTITIONのロックが弱くなった – UPDATE/DELETE/INSERTと競合しなくなった • pg_partition_root(), pg_partition_ancestors() • パーティション境界に式を指定(テーブル作成時に評価) 6 テーブル・パーティショニングの改善
  • 7. Copyright©2019 NTT corp. All Rights Reserved. 7 プランニング時間 PostgreSQL11の新機能紹介より PostgreSQL10に 比べて早くなっている。 けど、まだプラン生成 時間が子テーブル数に 比例して伸びている
  • 8. Copyright©2019 NTT corp. All Rights Reserved. • これまでは、プランナは内部で使用するテーブルの管理情報(RangeTblEntry, RelOptInfo)を全ての子テーブルについて作成してた。 • PG12では、プルーニング情報を求めた後に興味のある子テーブルだけの管理情 報を作成するようにした。 • 数千規模の子テーブルがある場合に有用 8 子テーブルが多い時のプラン生成時間が大幅に改善 0 20 40 60 80 100 120 50 100 500 1000 2000 5000 10000 実行計画作成時間(MS) 子テーブル数 プラン生成時間(Range Partitioning) PG12 PG11 PG10
  • 9. Copyright©2019 NTT corp. All Rights Reserved. • テーブル・パーティショニングの改善 • CTE Inlining • Vacuum改善 • Generated Columns(生成列) • SQL/JSON Path • CREATE STATISTICS(拡張統計情報) • Pluggable Storage Engine(Table AM) • 非互換 9 PostgreSQL 12の新機能
  • 10. Copyright©2019 NTT corp. All Rights Reserved. • WITH句で指定したクエリ結果を一時テーブルみたいな形で扱うことがで きる – 複雑なSQLをより単純な部品に分解することで、SQLを読みやすくできる • 再帰SQLのときにも使う • PostgreSQLの実装では常にCTEの結果を一時テーブルとして持つ – work_memを使用 – クエリの意味は同じでもsubselectを使った時とは実行計画を異なる • MySQLも8.0からサポート 10 Common Table Expression (CTE)
  • 11. Copyright©2019 NTT corp. All Rights Reserved. -- CTEを利用(PG11まで) =# EXPLAIN WITH test AS (SELECT * FROM a WHERE c = 1) SELECT * FROM test WHERE d = 1; QUERY PLAN ------------------------------------------------------------------------ CTE Scan on test (cost=8.17..8.20 rows=1 width=8) Filter: (d = 1) CTE test -> Index Scan using a_pkey on a (cost=0.15..8.17 rows=1 width=8) Index Cond: (c = 1) (5 rows) 11 CTEとSubSelect - PostgreSQL 11まで - -- SubSelectを利用 =# EXPLAIN SELECT * FROM (SELECT * FROM a WHERE c = 1 and d = 1) as test; QUERY PLAN ---------------------------------------------------------------- Index Scan using a_pkey on a (cost=0.15..8.17 rows=1 width=8) Index Cond: (c = 1) Filter: (d = 1) (3 rows)
  • 12. Copyright©2019 NTT corp. All Rights Reserved. -- CTEを利用(PG12) =# EXPLAIN WITH test AS (SELECT * FROM a WHERE c = 1) SELECT * FROM test WHERE d = 1; QUERY PLAN ---------------------------------------------------------------------------------- Index Scan using a_pkey on a (cost=0.15..8.17 rows=1 width=8) Index Cond: (c = 1) Filter: (d = 1) (3 rows) 12 CTEとSubSelect - PostgreSQL 12から - -- SubSelectを利用 =# EXPLAIN SELECT * FROM (SELECT * FROM a WHERE c = 1 and d = 1) as test; QUERY PLAN ---------------------------------------------------------------- Index Scan using a_pkey on a (cost=0.15..8.17 rows=1 width=8) Index Cond: (c = 1) Filter: (d = 1) (3 rows)
  • 13. Copyright©2019 NTT corp. All Rights Reserved. • デフォルトでCTEのクエリを展開するようになった(CTE inlining) – 他のRDBMSもこっちの動作がデフォルトになっている – ただし再帰SQL、SELECT以外、volatile関数が入っている場合は強制的に MATERIALIZE(一時テーブル的な扱い)される • [ NOT ] MATERIALIZED句で動作を制御可能 13 PostgreSQL 12以降のCTE =# EXPLAIN WITH test AS MATERIALIZED (SELECT * FROM a WHERE c = 1) SELECT * FROM test WHERE d = 1; QUERY PLAN ------------------------------------------------------------------------ CTE Scan on test (cost=8.17..8.20 rows=1 width=8) Filter: (d = 1) CTE test -> Index Scan using a_pkey on a (cost=0.15..8.17 rows=1 width=8) Index Cond: (c = 1) (5 rows)
  • 14. Copyright©2019 NTT corp. All Rights Reserved. • テーブル・パーティショニングの改善 • CTE Inlining • Vacuum改善 • Generated Columns(生成列) • SQL/JSON Path • CREATE STATISTICS(拡張統計情報) • Pluggable Storage Engine(Table AM) • 非互換 14 PostgreSQL 12の新機能
  • 15. Copyright©2019 NTT corp. All Rights Reserved. • テーブルのスキャン、VACUUMは最適化済み • インデックスのVACUUM、末尾の切り詰めは依然時間がかかる • INDEX_CLEANUP、TRUNCATEでVACUUM処理の細かい制御が可能 – (テーブルの特性に応じて)時間がかかる処理をスキップできるようになった Vacuumの改善 テーブル スキャン インデックス VACUUM テーブル VACUUM 末尾の 切り詰め 長時間化に注意 1行でもゴミがあれば、 インデックスをフルスキャン 長時間化に注意 共有バッファをフルスキャン Visibility Mapで ゴミがあるページ のみをスキャン 15 ゴミがあるページ のみをVACUUM
  • 16. Copyright©2019 NTT corp. All Rights Reserved. • SKIP_LOCKED [ boolean ] – すでにロックされているテーブルをスキップする • TRUNCATE [ boolean ] – テーブルの切り詰めを行わない – 共有バッファのフルスキャンを回避 – テーブル毎に設定可能 • INDEX_CLEANUP [ boolean ] – インデックスのVACUUMを行わない – インデックスのVACUUMは常にフルスキャン – テーブル毎に設定可能 16 Vacuumの改善 - 新オプション -
  • 17. Copyright©2019 NTT corp. All Rights Reserved. • TRUNCATEオプション – テーブルの物理サイズが小さくならない – こういう時に「TRUNCATE false」を検討する • 高頻度で更新されるテーブル(一括削除とかがない=末尾の切り詰めが期待できない) • 共有バッファが大きい(数百GB) • ホットスタンバイでの競合を避けたい • INDEX_CLEANUPオプション – インデックスが肥大化する可能性がある • インデックスはテーブルよりも肥大化しにくい • REINDEX CONCURRENTLYでオンラインでShrinkすることも可能 – こういう時に「INDEX_CLEANUP false」を検討する • 大規模テーブルで頻繁に更新がかかる • 定期的にREINDEXできる時間がある 17 注意点と使い所
  • 18. Copyright©2019 NTT corp. All Rights Reserved. • テーブル・パーティショニングの改善 • CTE Inlining • Vacuum改善 • Generated Columns(生成列) • SQL/JSON Path • CREATE STATISTICS(拡張統計情報) • Pluggable Storage Engine(Table AM) • 非互換 18 PostgreSQL 12の新機能
  • 19. Copyright©2019 NTT corp. All Rights Reserved. • 他の列情報から計算式によって値を生成する列 • PG 12ではSTOREDのみ対応 – VIRTUALは未対応 • テーブル定義時に列に計算式を指定 • 行の書き込み時に計算式から算出されたデータが列に格納さ れる 19 Generated Columns(生成列)
  • 20. Copyright©2019 NTT corp. All Rights Reserved. =# CREATE TABLE people ( height_m numeric, weight_kg numeric, bmi numeric GENERATED ALWAYS AS (weight_kg / pow(height_m, 2)) STORED ); =# INSERT INTO people VALUES (1.7, 65); =# SELECT * FROM people; height_m | weight_kg | bmi ----------+-----------+--------------------- 1.7 | 65 | 22.4913494809688581 (1 row) =# UPDATE people SET weight_kg = 60; =# SELECT * FROM people ; height_m | weight_kg | bmi ----------+-----------+--------------------- 1.8 | 60 | 20.7612456747404844 (1 row) 20 Generated Columns(生成列)
  • 21. Copyright©2019 NTT corp. All Rights Reserved. • テーブル・パーティショニングの改善 • CTE Inlining • Vacuum改善 • Generated Columns(生成列) • SQL/JSON Path • CREATE STATISTICS(拡張統計情報) • Pluggable Storage Engine(Table AM) • 非互換 21 PostgreSQL 12の新機能
  • 22. Copyright©2019 NTT corp. All Rights Reserved. • XpathのJSON版 • SQL 2016 • JSONデータから特定の部分を指定し、抽出するための構文 (言語) • jsonb型のデータに対してのみ利用可能 – json型は非対応 • jsonb_path_exists(target jsonb, path jsonpath) • jsonb_path_match(target jsonb, path jsonpath) • jsonb_path_query(target jsonb, path jsonpath) • jsonb_path_query_array(target jsonb, path jsonpath) • jsonb_path_query_first(target jsonb, path jsonpath) 22 SQL/JSON path
  • 23. Copyright©2019 NTT corp. All Rights Reserved. { “data1”: { “a”: [1,2,3], “b”: { “c”: “cc” } }, “data2”: “d” } 23 ‘$.data1’ jsonb_path_query ------------------------------------ {"a": [1, 2, 3], "b": {"c": "cc"}} (1 row)
  • 24. Copyright©2019 NTT corp. All Rights Reserved. { “data1”: { “a”: [1,2,3], “b”: { “c”: “cc” } }, “data2”: “d” } 24 ‘$.data1.a’ jsonb_path_query ------------------ [1, 2, 3] (1 row)
  • 25. Copyright©2019 NTT corp. All Rights Reserved. { “data1”: { “a”: [1,2,3], “b”: { “c”: “cc” } }, “data2”: “d” } 25 ‘$.data1.a[1]’ jsonb_path_query ------------------ 2 (1 row)
  • 26. Copyright©2019 NTT corp. All Rights Reserved. { “data1”: { “a”: [1,2,3], “b”: { “c”: “cc” } }, “data2”: “d” } 26 ‘$.data1.a[*]’ jsonb_path_query ------------------ 1 2 3 (3 rows)
  • 27. Copyright©2019 NTT corp. All Rights Reserved. { “data1”: { “a”: [1,2,3], “b”: { “c”: “cc” } }, “data2”: “d” } 27 ‘$.data1.a ? (@ % 2 == 0)’ jsonb_path_query ------------------ 2 (1 row)
  • 28. Copyright©2019 NTT corp. All Rights Reserved. { “data1”: { “a”: [1,2,3], “b”: { “c”: “cc” } }, “data2”: “d” } 28 ‘$.data1.keyvalue() jsonb_path_query ---------------------------------------------- {"id": 32, "key": "a", "value": [1, 2, 3]} {"id": 32, "key": "b", "value": {"c": "cc"}} (2 rows)
  • 29. Copyright©2019 NTT corp. All Rights Reserved. https://www.postgresql.org/docs/12/functions-json.html 29 JSON/PATHの演算子と関数
  • 30. Copyright©2019 NTT corp. All Rights Reserved. • テーブル・パーティショニングの改善 • CTE Inlining • Vacuum改善 • Generated Columns(生成列) • SQL/JSON Path • CREATE STATISTICS(拡張統計情報) • Pluggable Storage Engine(Table AM) • 非互換 30 PostgreSQL 12の新機能
  • 31. Copyright©2019 NTT corp. All Rights Reserved. (例) コインとサイコロを投げ、コインが裏で3の目が出る確率は? コインを投げる事と、サイコロを投げる事は独立な事象と考えるこ とができる。(コインの表裏によってサイコロの出る目の確率は変わらない) P(A) = 1/2 P(B) = 1/6 P (A∩B) = P(A)P(B) = 1/2 * 1/6 = 1/12 31 行数見積もりの問題 - 事象の独立性 - 事象の独立性 P(A∩B) = P(A)P(B) PostgreSQLでは、(問い合わせ結果の)行数を推定する際に、 列の値の独立性を仮定している
  • 32. Copyright©2019 NTT corp. All Rights Reserved. 次のテーブルを考えてみる • 住所テーブル • 都道府県、市町村などが入っている 32 行数見積もりの問題 =# SELECT * FROM addresses; prefecture | city | town | chome ------------+------+------+----------------------------- 東京都 | 港区 | 港南 | 東京都 | 港区 | 港南 | 東京都 | 港区 | 港南 | 品川インターシティA棟 東京都 | 港区 | 港南 | 品川インターシティA棟 1階 東京都 | 港区 | 港南 | 品川インターシティA棟 2階 東京都 | 港区 | 港南 | 品川インターシティA棟 3階 東京都 | 港区 | 港南 | 品川インターシティA棟 4階 東京都 | 港区 | 港南 | 品川インターシティA棟 5階 東京都 | 港区 | 港南 | 品川インターシティA棟 6階 東京都 | 港区 | 港南 | 品川インターシティA棟 7階 (10 rows)
  • 33. Copyright©2019 NTT corp. All Rights Reserved. 33 行数見積もりの問題 QUERY PLAN ---------------------------------------------------------------------------------------- Seq Scan on addresses (cost=0.00..3476.01 rows=75 width=54) (actual time=9.343..33.347 rows=1257 loops=1) Filter: ((prefecture = '東京都'::text) AND (city = '千代田区'::text)) Rows Removed by Filter: 148144 Planning Time: 0.146 ms Execution Time: 33.456 ms (5 rows)(5 rows) WHERE prefecture = ‘東京都’ AND city = ‘千代田区’ を考える。都道府県と市町村には相関がある。 (東京都の行には千代田区が出やすい) 見積値 75件に対し、 実際には1257件取得。 約16倍、行数見積が間違っている
  • 34. Copyright©2019 NTT corp. All Rights Reserved. PostgreSQLは各条件を独立の事象だとみなし見積を行っている ため、結果行数を過小に見積もってしまった。 S(A)をAの選択率(Selectivity)とした時、 S(東京都) = 5.7% S(千代田区) = 0.8% S(東京都 ∩ 千代田区) = S(東京都)S(千代田区) = 5.7% * 0.8% = 0.05% 行数見積 = 全行数 * 選択率 = 149401 * 0.0005 ≒ 75 34 行数見積もりのズレ P (A∩B) = P(A)P(B)
  • 35. Copyright©2019 NTT corp. All Rights Reserved. • 相関関係のある複数列に跨った統計情報を作成できる – 例) “都道府県”列と”市町村”列の値の組み合わせに対して統計情報を作 成する • PostgreSQL 10で導入された機能 – Oracle Databaseには昔からある • 複数条件に対する行数見積をより正確に行うことができる • 作成できる統計情報 – ndistinct – dependencies – mcv (most common variables:最頻値) 35 CREATE STATISTICS(拡張統計情報)
  • 36. Copyright©2019 NTT corp. All Rights Reserved. 36 拡張統計情報を使ってみる =# CREATE STATISTICS stts ON prefecture, city FROM addresses; CREATE STATISTICS =# ANALYZE stts; --ANALYZE時に拡張統計情報が作成される ANALYZE =# EXPLAIN ANALYZE SELECT * FROM addresses WHERE prefecture = '東京都‘ AND city = '千代田区'; QUERY PLAN ------------------------------------------------------------------------------------- Seq Scan on addresses (cost=0.00..3476.01 rows=1290 width=54) (actual time=10.958..37.468 rows=1257 loops=1) Filter: ((prefecture = '東京都'::text) AND (city = '千代田区'::text)) Rows Removed by Filter: 148144 Planning Time: 0.493 ms Execution Time: 37.584 ms (5 rows) =# SELECT m.* FROM pg_statistic_ext JOIN pg_statistic_ext_data on (oid = stxoid), pg_mcv_list_items(stxdmcv) m WHERE m.values = ARRAY['東京都', '千代田区']; index | values | nulls | frequency | base_frequency -------+-------------------+-------+----------------------+----------------------- 2 | {東京都,千代田区} | {f,f} | 0.008633333333333333 | 0.0005001577777777778 (1 row) 正確に結果行数の 見積りができている
  • 37. Copyright©2019 NTT corp. All Rights Reserved. • テーブル・パーティショニングの改善 • CTE Inlining • Vacuum改善 • Generated Columns(生成列) • SQL/JSON Path • CREATE STATISTICS(拡張統計情報) • Pluggable Storage Engine(Table AM) • 非互換 37 PostgreSQL 12の新機能
  • 38. Copyright©2019 NTT corp. All Rights Reserved. • 独自のテーブル(Access Method)を定義、使用できるよう なった – インデックス(Index AM)は9.6から可能 • 夢が広がる機能 例えば • OracleライクなUNDOベースのテーブル • 列指向テーブル • インメモリテーブル • 他DBとの連携(RocksDB + PostgreSQLなど) • 分散テーブル 38 Pluggable Storage Engine (Table AM)
  • 39. Copyright©2019 NTT corp. All Rights Reserved. https://www.pgcon.org/2019/schedule/attachments/559_pgcon-2019-transaction-logging.pdf 39 MySQLのStorage Engineとの違い
  • 40. Copyright©2019 NTT corp. All Rights Reserved. 40 アーキテクチャ - これまで - https://anarazel.de/talks/2018-10-25-pgconfeu-pluggable-storage/pluggable.pdf
  • 41. Copyright©2019 NTT corp. All Rights Reserved. 41 アーキテクチャ - PG 12から - https://anarazel.de/talks/2018-10-25-pgconfeu-pluggable-storage/pluggable.pdf
  • 42. Copyright©2019 NTT corp. All Rights Reserved. • 公式にサポートしているのはHeapのみ • PostgreSQL 13では、なにか新しい種類のTable AMが入るか もしれない 42 PostgreSQL 12ではAPIが切られただけ
  • 43. Copyright©2019 NTT corp. All Rights Reserved. • zheap (EnterpriseDB社) – 行指向 – UNDOログ – タプルヘッダが小さい • ZedStore (Pivotal社) – 列指向 – UNDOログ – 圧縮 • In-memory table 43 どんなAccess Methodが今後入りそうか
  • 44. Copyright©2019 NTT corp. All Rights Reserved. • UNDOログを利用 – 古いタプルはすべてUNDO領域に退避 – Commitなら退避した古いタプルを消す、Rollbackならもとに戻す • In-place update • VACUUMがいらない • タプルヘッダが従来のテーブルよりも小さい – 25 bytes → 5 bytes – MVCCに必要なデータはUNDOログにある • ソースは公開されているので試してみるのもあり – https://github.com/EnterpriseDB/zheap 44 zheap
  • 45. Copyright©2019 NTT corp. All Rights Reserved. 目的は異なるが機能性は一部重複している • 目的の違い – FDWは外部データとの連携が目的(SQL/MEDの実装系) – Table AMはPostgreSQLのストレージ層の切り出し • 機能の違い – FDWでは、実行計画の作成(外部サーバが担当する部分の切り出し等)、外 部サーバからのデータ取得を担当 • GetForeignPaths、GetForeignJoinPath, ExecForeignScanなど – Table AMは、Executor⇔ストレージのI/Fのみ(今後変わる可能性あり) • scan_getnextslot, index_fetch_begin, scan_bitmap_next_block, tuple_insert, tuple_delete, scan_bitmapなど – FDWではDDLに対応していない 45 Foreign Data Wrapperとの違い
  • 46. Copyright©2019 NTT corp. All Rights Reserved. • テーブル・パーティショニングの改善 • CTE Inlining • Vacuum改善 • Generated Columns(生成列) • SQL/JSON Path • CREATE STATISTICS(拡張統計情報) • Pluggable Storage Engine(Table AM) • 非互換 46 PostgreSQL 12の新機能
  • 47. Copyright©2019 NTT corp. All Rights Reserved. • WITH OIDSの廃止 • recovery.confの廃止 • recovery_target_XXXの重複指定禁止 47 影響が大きそうな非互換
  • 48. Copyright©2019 NTT corp. All Rights Reserved. 対象者 CREATE TABLE ... WITH OIDSを使っている人 内容 • WITH OIDSが使えなくなった • WITH OIDSがあるテーブルがあるとpg_upgradeが実行 できない 対処方法 • WITH OIDSを使わなくても良い設計を検討する • ALTER TABLE ... SET WITHOUT OIDSでOIDSを取り除く 48 WITH OIDSの廃止
  • 49. Copyright©2019 NTT corp. All Rights Reserved. 対象者 リカバリまたはレプリケーションをする人(= 全員) 内容 • recovery.confはなくなりpostgresql.confに統合された • 代わりにrecovery.signalやstandby.signalファイルが必要 • recovery.confがあると起動しない 対処方法 • recovery.confに書いていたパラメータをpostgresql.confに書 くようにする • リカバリ時はrecovery.signal、スタンバイ時はstandby.signal を置くようにする • recovery_target_XXXは設定ファイルに必ず一つになるよう にすること 49 recovery.confの廃止
  • 50. Copyright©2019 NTT corp. All Rights Reserved. • SHOWコマンドでリカバリ関連の設定値が確認できる • リカバリやスタンバイサーバの設定値をreloadで反映できる – archive_cleanup_command – promote_trigger_file – recovery_end_command – recovery_min_apply_delay 50 大きな非互換だけどその恩恵は大きい
  • 51. Copyright©2019 NTT corp. All Rights Reserved. • 新機能による恩恵とアップグレードのコストのトレードオフ • これぞという機能があればアップグレードを検討 – 悩みをうまく解決してくれる機能があるかも • もれなく運用ツールの修正コストが付いてくることに留意す る 51 12へアップグレードするべき?
  • 52. Copyright©2019 NTT corp. All Rights Reserved. • テーブル・パーティショニングの改善 • CTE Inlining • Vacuum改善 • SQL/JSON Path • CREATE STATISTICS(拡張統計情報) • Pluggable Storage Engine(Table AM) • Generated Columns(生成列) • 非互換 52 まとめ
  • 53. Copyright©2019 NTT corp. All Rights Reserved. Thank you