Más contenido relacionado
La actualidad más candente (20)
Similar a PostgreSQL 12の話 (20)
Más de Masahiko Sawada (20)
PostgreSQL 12の話
- 1. Copyright©2019 NTT Corp. All Rights Reserved.
PostgreSQL 12の話
NTT OSSセンタ
澤田 雅彦
Middlewares Deep Talks @AWS Loft Tokyo
- 2. 2Copyright©2019 NTT Corp. All Rights Reserved.
約170個の新機能(リリースノートより)
正式版は今年秋頃にリリース予定
最近の新バージョンと目玉機能
9.6 : パラレルクエリ、Vacuum改善
10 : 宣言的テーブルパーティショニング、ロジカルレプリケーション
11 : テーブルパーティショニングの強化、パラレルクエリの強化、SQLスト
アド・プロシージャ
PostgreSQL 12 betaが5/23にリリース
- 3. 3Copyright©2019 NTT Corp. All Rights Reserved.
• テーブル・パーティショニングの改善
• CTE Inlining
• Pluggable Storage Engine
• Chained Transaction
• JSON/Path
• Generated Columns (STOREDのみ)
• 拡張統計情報の強化(MCVリスト)
• REINDEX CONCURRENTLY
• CREATE INDEX、REINDEX、VACUUM FULL、CLUSTERのモ
ニタリング
新機能いろいろ(今日は下線の機能を紹介)
- 4. 4Copyright©2019 NTT Corp. All Rights Reserved.
PostgreSQL 12でもテーブル・パーティショニングの改善は多い(全
体の約15%、PG11もほぼ同じだった)
• パーティション・プルーニングの性能改善
• パーティション・テーブルへの外部キー制約
• パーティション・テーブルへのCOPYの性能改善
• ATTACH PARTITIONのロックが弱くなった
• AccessExclusiveLock -> ShareUpdateExclusiveLock
• pg_partition_root(), pg_partition_ancestors(), pg_partition_root()
• パーティション境界に式を指定(テーブル作成時に評価)
テーブル・パーティショニングの改善
- 5. 5Copyright©2019 NTT Corp. All Rights Reserved.
パーティション・プルーニングの問題
PostgreSQL11の新機能紹介より
PostgreSQL10に
比べて早くなっている。
けど、まだプラン生成
時間が子テーブル数に
比例して伸びている
- 6. 6Copyright©2019 NTT Corp. All Rights Reserved.
• これまで、プランナは内部で使用するテーブルの管理情報(
RangeTblEntry, RelOptInfo)を全ての子テーブルについて作成してた。
• PG12では、プルーニング情報を求めた後に興味のある子テーブルだけの
管理情報を作成するようにした。
• 数千規模の子テーブルがある場合に有用
子テーブルが多い時のプラン生成時間が大幅に改善
0
20
40
60
80
100
120
50 100 500 1000 2000 5000 10000
実行計画作成時間(MS)
Range Partitioning
PG12 PG11 PG10
- 7. 7Copyright©2019 NTT Corp. All Rights Reserved.
• WITH句で指定したクエリ結果を一時テーブルみたいな形で扱うこと
ができる
• 複雑なSQLをより単純な部品に分解することで、SQLを読みやすくできる
• 再帰SQLのときにも使う
• PostgreSQLの実装では常にCTEの結果を一時テーブルとして持つ
• work_memを使用
• クエリの意味は同じでもsubselectを使った時とは実行計画を異なる
• MySQLも8.0からサポート
Common Table Expression (CTE)
- 8. 8Copyright©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)
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)
- 9. 9Copyright©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)
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)
- 10. 10Copyright©2019 NTT Corp. All Rights Reserved.
• デフォルトでCTEのクエリを展開するようになった(CTE inlining)
• 他のRDBMSもこっちの動作がデフォルトになっていると思う
• ただし再帰SQL、SELECT以外、volatile関数が入っている場合は強制的
にMATERIALIZE(一時テーブル的な扱い)される
• 明示的にMATERIALIZED句をつけると、PostgeSQL10までと同じ動
作になる
• WITH句を使って結合順序を変えたり、SQLチューニングする時は
MATERIALIZED句を使っても良さそう
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)
- 11. 11Copyright©2019 NTT Corp. All Rights Reserved.
• 独自のテーブル(Access Method)を定義、使用できる
ようになった
• これまではインデックスでは可能だった
• 夢が広がる機能
• 例えば、
• 追記型以外を採用したテーブル
• 列指向テーブル
• インメモリテーブル
• 他のDBとの連携(RocksDB + PostgreSQL = PgRocks?)
Pluggable Storage Engine(Table AM)
- 12. 12Copyright©2019 NTT Corp. All Rights Reserved.
Table AMの概要
https://anarazel.de/talks/2018-10-25-pgconfeu-pluggable-storage/pluggable.pdf
- 13. 13Copyright©2019 NTT Corp. All Rights Reserved.
• Heapのみ
• 従来のテーブル
• PostgreSQL 12では、インタフェースが切られただけで
、新しい種類のテーブルは提供されていない
• 新しい種類のテーブルはPostgreSQL 13以降
サポート中のAccess Method
- 14. 14Copyright©2019 NTT Corp. All Rights Reserved.
• ZHeap (EnterpriseDB社)
• 行指向
• UNDOログ
• タプルヘッダが小さい(Heapに比べて)
• ZedStore (Pivotal社)
• 列指向
• UNDOログ
• 圧縮
• 分析用途等に適しているが、最大限効果を出すためには
Optimizer、Executorの改良も必要
• In-memory storage
どんなAccess Methodが今後入るか?
- 15. 15Copyright©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
ZHeap
- 16. 16Copyright©2019 NTT Corp. All Rights Reserved.
目的は異なるが機能性は一部重複している
• 目的の違い
• FDWは外部データとの連携が目的
• SQL標準にある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に対応していない
Foreign Data Wrapperとの違い
- 17. 17Copyright©2019 NTT Corp. All Rights Reserved.
COMMIT [ AND [NO] CHAIN ]
ROLLBACK [ AND [NO] CHAIN ]
• 「AND CHAIN」を指定すると、トランザクション分離レベル、
READ_WRITE/READ_ONLY、DEFERRABLEが引き継がれて、新しいト
ランザクションが開始される
• SQL標準の機能(“Chained Transaction”)
• Stored Procedure内でトランザクションの設定を変えて頻繁にコミ
ットをする時に便利
• MySQLもサポートしてる
Chained Transaction
- 18. 18Copyright©2019 NTT Corp. All Rights Reserved.
=# SHOW transaction_isolation ; --デフォルトはread committed
transaction_isolation
-----------------------
read committed
(1 row)
=# BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE ; -- serializableでトランザクションを開始
BEGIN
=# SHOW transaction_isolation ; -- serializableになっていることを確認
transaction_isolation
-----------------------
serializable
(1 row)
=# COMMIT AND CHAIN; -- AND CHAINを指定してCOMMIT
COMMIT
=# SHOW transaction_isolation ; -- トランザクション分離レベルが引き継がれてserializableのまま
transaction_isolation
-----------------------
serializable
(1 row)
=# COMMIT; -- 普通のCOMMIT
COMMIT
=# SHOW transaction_isolation ; -- read committedに戻っている
transaction_isolation
-----------------------
read committed
(1 row)
実行例
- 19. 19Copyright©2019 NTT Corp. All Rights Reserved.
• CHAINする前後のトランザクションに特別な関係性はない
• いくつかの設定が引き継がれるだけ
• Jim Grayのトランザクション本では、Chained Transactionはカーソルを開いた
ままにすると解説している
注意点
Transaction Processing: Concepts and
Techniques, Chained Transactions(P193)
- 20. 20Copyright©2019 NTT Corp. All Rights Reserved.
• XPathのJSON版
• JSONデータから特定の部分を指定し、抽出するための
構文(言語)
• jsonb型のデータに対してのみ利用可能
• json型には対応していない
• SELECT jsonb_path_query(event_jb, ‘$.event.speakers[*]’)
SQL/JSON path
- 21. 21Copyright©2019 NTT Corp. All Rights Reserved.
{ "event": {
"name": "Middleware Deep Talks",
"speakers": [
{ "name": "yoku0825",
"title": "ぼくらが8.0に至ったみちのり(踏破)"
},
{ "name": "澤田雅彦",
"title": "PostgreSQL 12の話"
},
{ "name": "Jun Ohtani",
"title": "What''s new Elastic Stack 7.0?"
},
{ "name": "星井祥吾",
"title": "Apache Cassandraの特性と自動化運用"
},
{ "name": "Noritaka Sekiyama",
"title": "S3整合性モデルとHadoop/Sparkの話"
}
],
"DDTL": {
"date" : "2019-05-23",
"time" : "18:00",
"place" : "AWS Loft Tokyo"
}
}
}
- 22. 22Copyright©2019 NTT Corp. All Rights Reserved.
{ "event": {
"name": "Middleware Deep Talks",
"speakers": [
{ "name": "yoku0825",
"title": "ぼくらが8.0に至ったみちのり(踏破)"
},
{ "name": "澤田雅彦",
"title": "PostgreSQL 12の話"
},
{ "name": "Jun Ohtani",
"title": "What''s new Elastic Stack 7.0?"
},
{ "name": "星井祥吾",
"title": "Apache Cassandraの特性と自動化運用"
},
{ "name": "Noritaka Sekiyama",
"title": "S3整合性モデルとHadoop/Sparkの話"
}
],
"DDTL": {
"date" : "2019-05-23",
"time" : "18:00",
"place" : "AWS Loft Tokyo"
}
}
}
Query : $.event.name
- 23. 23Copyright©2019 NTT Corp. All Rights Reserved.
{ "event": {
"name": "Middleware Deep Talks",
"speakers": [
{ "name": "yoku0825",
"title": "ぼくらが8.0に至ったみちのり(踏破)"
},
{ "name": "澤田雅彦",
"title": "PostgreSQL 12の話"
},
{ "name": "Jun Ohtani",
"title": "What''s new Elastic Stack 7.0?"
},
{ "name": "星井祥吾",
"title": "Apache Cassandraの特性と自動化運用"
},
{ "name": "Noritaka Sekiyama",
"title": "S3整合性モデルとHadoop/Sparkの話"
}
],
"DDTL": {
"date" : "2019-05-23",
"time" : "18:00",
"place" : "AWS Loft Tokyo"
}
}
}
Query : $.event.speakers
- 24. 24Copyright©2019 NTT Corp. All Rights Reserved.
{ "event": {
"name": "Middleware Deep Talks",
"speakers": [
{ "name": "yoku0825",
"title": "ぼくらが8.0に至ったみちのり(踏破)"
},
{ "name": "澤田雅彦",
"title": "PostgreSQL 12の話"
},
{ "name": "Jun Ohtani",
"title": "What''s new Elastic Stack 7.0?"
},
{ "name": "星井祥吾",
"title": "Apache Cassandraの特性と自動化運用"
},
{ "name": "Noritaka Sekiyama",
"title": "S3整合性モデルとHadoop/Sparkの話"
}
],
"DDTL": {
"date" : "2019-05-23",
"time" : "18:00",
"place" : "AWS Loft Tokyo"
}
}
}
Query : $.event.speakers[1]
- 25. 25Copyright©2019 NTT Corp. All Rights Reserved.
{ "event": {
"name": "Middleware Deep Talks",
"speakers": [
{ "name": "yoku0825",
"title": "ぼくらが8.0に至ったみちのり(踏破)"
},
{ "name": "澤田雅彦",
"title": "PostgreSQL 12の話"
},
{ "name": "Jun Ohtani",
"title": "What''s new Elastic Stack 7.0?"
},
{ "name": "星井祥吾",
"title": "Apache Cassandraの特性と自動化運用"
},
{ "name": "Noritaka Sekiyama",
"title": "S3整合性モデルとHadoop/Sparkの話"
}
],
"DDTL": {
"date" : "2019-05-23",
"time" : "18:00",
"place" : "AWS Loft Tokyo"
}
}
}
Query : $.event.speakers[1].title
- 26. 26Copyright©2019 NTT Corp. All Rights Reserved.
{ "event": {
"name": "Middleware Deep Talks",
"speakers": [
{ "name": "yoku0825",
"title": "ぼくらが8.0に至ったみちのり(踏破)"
},
{ "name": "澤田雅彦",
"title": "PostgreSQL 12の話"
},
{ "name": "Jun Ohtani",
"title": "What''s new Elastic Stack 7.0?"
},
{ "name": "星井祥吾",
"title": "Apache Cassandraの特性と自動化運用"
},
{ "name": "Noritaka Sekiyama",
"title": "S3整合性モデルとHadoop/Sparkの話"
}
],
"DDTL": {
"date" : "2019-05-23",
"time" : "18:00",
"place" : "AWS Loft Tokyo"
}
}
}
Query : $.event.DDTL.*
- 27. 27Copyright©2019 NTT Corp. All Rights Reserved.
{ "event": {
"name": "Middleware Deep Talks",
"speakers": [
{ "name": "yoku0825",
"title": "ぼくらが8.0に至ったみちのり(踏破)"
},
{ "name": "澤田雅彦",
"title": "PostgreSQL 12の話"
},
{ "name": "Jun Ohtani",
"title": "What''s new Elastic Stack 7.0?"
},
{ "name": "星井祥吾",
"title": "Apache Cassandraの特性と自動化運用"
},
{ "name": "Noritaka Sekiyama",
"title": "S3整合性モデルとHadoop/Sparkの話"
}
],
"DDTL": {
"date" : "2019-05-23",
"time" : "18:00",
"place" : "AWS Loft Tokyo"
}
}
}
Query : $.event.speakers[*] ? (@.name = “yoku0825”)
- 28. 28Copyright©2019 NTT Corp. All Rights Reserved.
{ "event": {
"name": "Middleware Deep Talks",
"speakers": [
{ "name": "yoku0825",
"title": "ぼくらが8.0に至ったみちのり(踏破)"
},
{ "name": "澤田雅彦",
"title": "PostgreSQL 12の話"
},
{ "name": "Jun Ohtani",
"title": "What''s new Elastic Stack 7.0?"
},
{ "name": "星井祥吾",
"title": "Apache Cassandraの特性と自動化運用"
},
{ "name": "Noritaka Sekiyama",
"title": "S3整合性モデルとHadoop/Sparkの話"
}
],
"DDTL": {
"date" : "2019-05-23",
"time" : "18:00",
"place" : "AWS Loft Tokyo"
}
}
}
Query : $.event.speakers[*] ? (@.name start with “澤田”)
- 29. 29Copyright©2019 NTT Corp. All Rights Reserved.
• PostgreSQL 12は今秋リリース予定
• 例年5月にBeta、7,8月くらいにRCで9月正式リリース
• リリースノートは公開されているので、追加された機能
を確認できます
• PostgreSQL公式ドキュメント(英語)にあります
• 正式リリースされるバージョンと大きく変わることはないはず
• 来週はPGCon@Ottawaが開催されます
最後に
- 30. 30Copyright©2019 NTT Corp. All Rights Reserved.
Vacuum、Replication slotでいくつか機能開発をしました
• インデックスのVacuumをスキップする機能
• Vacuumの高速化(Vacuum処理時間の大半はインデックスの
Vacuumなので、それをスキップできるようにした)
• Replication Slotをコピーする機能
• Logical Replicationやバックアップにも役に立ちます
その他、分散Tx機能(Atomic Commit)、透過的暗号化機能
(TDE)にも取り組んでいるので、興味があれば話しましょ
う!
YOUはなにかコントリビュートしてないの?
- 31. 31Copyright©2019 NTT Corp. All Rights Reserved.
• JSONPath - Xpath for JSON
• https://goessner.net/articles/JsonPath/
• zheap: less bloat, fewer writes, and just plain smaller
• https://www.pgcon.org/2018/schedule/attachments/501_zheap-
a-new-storage-format-postgresql-5.pdf
• PostgreSQL 12
• http://www.sai.msu.su/~megera/postgres/talks/pg12-stachka-
2019.pdf
• Pluggable Storage in PostgreSQL
• https://anarazel.de/talks/2018-10-25-pgconfeu-pluggable-
storage/pluggable.pdf
参考資料