Hackers Champloo 2016 postgresql-9.6

100
ハッカーズチャンプルー ハッカーズチャンプルー 2016 2016 (2016-06-25) (2016-06-25) PostgreSQL 9.6 PostgreSQL 9.6 やってくる! やってくる! ぬこ@横浜 ぬこ@横浜 (@nuko_yokohama) (@nuko_yokohama) http://www.yunphoto.net

Transcript of Hackers Champloo 2016 postgresql-9.6

Page 1: Hackers Champloo 2016 postgresql-9.6

ハッカーズチャンプルーハッカーズチャンプルー 20162016(2016-06-25)(2016-06-25)

PostgreSQL 9.6PostgreSQL 9.6 ががやってくる!やってくる!

ぬこ@横浜ぬこ@横浜 (@nuko_yokohama)(@nuko_yokohama)

http://www.yunphoto.net

Page 2: Hackers Champloo 2016 postgresql-9.6

2

自己紹介「 PostgreSQL ラーメン」

でググってください。

Page 3: Hackers Champloo 2016 postgresql-9.6

3

Page 4: Hackers Champloo 2016 postgresql-9.6

4

自己紹介某通信系 SI 会社@横浜 で働いてます。JPUG( 日本 PostgreSQL ユーザ会 ) 枠で、たまに登壇したりしているPostgreSQL おじさんです。

PostgreSQL の変な使い方を探るのが趣味( 漢数字型 , あいまい全文検索 , neo4j_fdw, 数当てゲーム , スーパーユーザ強制ロギング HOOK, 履歴保存データ型などなど )

Page 5: Hackers Champloo 2016 postgresql-9.6

5

今日は今日は JPUGJPUG 枠として枠として沖縄に来ました。沖縄に来ました。

初の沖縄なので、ちょっと初の沖縄なので、ちょっとテンション上がってます。テンション上がってます。

http://www.yunphoto.net

Page 6: Hackers Champloo 2016 postgresql-9.6

6

目次

はじめにPostgreSQL の概要と歴史PostgreSQL 9.6 の新機能

おわりに

Page 7: Hackers Champloo 2016 postgresql-9.6

7

はじめに

Page 8: Hackers Champloo 2016 postgresql-9.6

8

DBMS の話とか地味ですまんな

Page 9: Hackers Champloo 2016 postgresql-9.6

9

でも DBMS 自体は重要なミドルウェアというのは今も昔も変わりないのです

Page 10: Hackers Champloo 2016 postgresql-9.6

10

さて

Page 11: Hackers Champloo 2016 postgresql-9.6

11

PostgreSQL を知ってる?

使っている?仕事で使ってる?

Page 12: Hackers Champloo 2016 postgresql-9.6

12

PostgreSQL の概要と歴史

Page 13: Hackers Champloo 2016 postgresql-9.6

13

PostgreSQL の概要

MySQL と並ぶ OSS DBMSライセンスは BSD ライクなもの高度なクエリにも対応性能面でも商用 DBMS とも遜色なし9.0 以降はレプリケーションも対応多種多様なデータ型サポート非常に高い拡張性活発な開発コミュニティ

Page 14: Hackers Champloo 2016 postgresql-9.6

14

要するに、無料で使えるスゲー ORDBMS

Page 15: Hackers Champloo 2016 postgresql-9.6

15

PostgreSQL の歴史(古代~近世)

POSTGRESプロジェクト

の時代

Postgres95の時代

※SQL サポート

PostgreSQLの時代

※6.0 から開始1986年

1995年1997年

2015年

POSTGRES プロジェクトからの年齢だと

何気にアラサー・・・

Page 16: Hackers Champloo 2016 postgresql-9.6

16

6.0 ~発展途上の時代

GEQOマルチバイト文字セット

MVCC

7.0 ~やっと実用的に

WALTOAST

VACUUM 改善

8.0 ~商用レベルへWindows 対応

PITR自動 VACUUM

HOT

9.0 ~エンタープライズ化

レプリケーション外部表

メニーコア性能向上マテリアライズドビュー

JSON 対応

1997年

2000年

2005年

2010年

PostgreSQL の歴史(近代)

昔の (7.x 時代 ) の感覚でPostgreSQL 使えねーと

思ってる人もまだいるのかなあ。

Page 17: Hackers Champloo 2016 postgresql-9.6

17

9.0レプリケーション

ストアド改良列トリガ排他制約

64bit Windows 対応

9.1同期レプリケーション

外部データラッパ (FDW)WITH 句+更新文

UNLOGGED TABLE

9.2パフォーマンス向上

カスケードレプリケーションIndex Only Scan範囲型サポート

JSON 型サポート

9.3マテリアライズドビュー更新可能ビュー更新 FDW

JSON 型の機能拡張

エンタープライズ向け用途エンタープライズ向け用途実験的な高度な機能実験的な高度な機能

2010年

2011年

2012年

2013年

PostgreSQL の歴史(現代)

レプリケーションが本体機能になったことで色々な案件で

使われるようになったのかな?

Page 18: Hackers Champloo 2016 postgresql-9.6

18

9.4JSONB

ALTER SYSTEMマテビュー改善

ロジカル・デコーディングWAL バッファ並列挿入

9.5BRIN

UPSERTRow Level Security

Import foreign schemapg_rewind

9.6

さて、何が入るのか!

そして・・・そして・・・ 9.4, 9.59.4, 9.5そして開発中のそして開発中の 9.69.6 に至るに至る

2014年

2015年

2016年

PostgreSQL の歴史(現代)

9.4, 9.5 でも面白い機能がいろいろ入りました

Page 19: Hackers Champloo 2016 postgresql-9.6

19

まずは・・・

祝・ PostgreSQL9.6 beta1 リリースPostgreSQL 9.6 beta1 Release!

私たちは喜んでいます私たちは喜んでいます

(2016-05-12)

Page 20: Hackers Champloo 2016 postgresql-9.6

20

PostgreSQL 9.6( 開発中 )

開発自体は昨年から開始数回の commitfest で取り込む機能を議論

2015/11, 2016/01, 2016/032016/05/12 beta1 リリース2016/06/23 beta2 リリース

以降、 beta→RC2016/09 9.6.0 リリース (予定? )

なんと、一昨日beta2 リリース!

Page 21: Hackers Champloo 2016 postgresql-9.6

21

余談ですが、ちょっと前にコミュニティでは

次を 9.6 beta2 にするか10.0 beta2にするか議論してました

結局、 9.6 になったみたい

Page 22: Hackers Champloo 2016 postgresql-9.6

22

PostgreSQL 9.6 の新機能

Page 23: Hackers Champloo 2016 postgresql-9.6

23

PostgreSQL 9.6 新機能新機能カテゴリ 項目数 備考

サーバ 67 性能向上 33項目、監視 11項目

レプリケーションとリカバリ 5

クエリ 3

ユーティリティコマンド 13

権限管理 3

データ型 9

関数 17

サーバサイド言語 8

クライアント・インタフェース 4

クライアント・アプリケーション 25 psqlは 12 項目

サーバ・アプリケーション 3

ソースコード 20

追加モジュール 21 postgres_fdwは 7項目

beta1時点の情報合計 198項目

Page 24: Hackers Champloo 2016 postgresql-9.6

24

Parallel sequential scans, joins and aggregatesElimination of repetitive scanning of old data by autovacuumSynchronous replication now allows multiple standby servers for increased reliabilityFull-text search for phrasesSupport for remote joins, sorts, and updates in postgres_fdwSubstantial performance improvements, especially in the area of improving scalability on many-CPU servers

PostgreSQL 9.6 主な新機能

Page 25: Hackers Champloo 2016 postgresql-9.6

25

PostgreSQL 9.6 主な新機能

Parallel sequential scans, joins and aggregatesElimination of repetitive scanning of old data by autovacuumSynchronous replication now allows multiple standby servers for increased reliabilityFull-text search for phrasesSupport for remote joins, sorts, and updates in postgres_fdwSubstantial performance improvements, especially in the area of improving scalability on many-CPU servers

Page 26: Hackers Champloo 2016 postgresql-9.6

26

パラレルクエリ

今、一番 HOT な機能。beta1から beta2で

GUC等が変更されてました。

Page 27: Hackers Champloo 2016 postgresql-9.6

27

tmp=# EXPLAIN (ANALYZE, VERBOSE) SELECT AVG(data) FROM tmp; Aggregate (cost=16925.00..16925.01 rows=1 width=4) (actual time=187.215..187.215 rows=1 loops=1) Output: avg(data) -> Seq Scan on public.tmp (cost=0.00..14425.00 rows=1000000 width=4) (actual time=0.043..87.114 rows=1000000 loops=1) Output: id, data Planning time: 0.041 ms Execution time: 187.249 ms

PostgreSQL 9.5 まで

1 つのクエリを 1プロセスで順々に処理していた。

SeqScan Aggregate

Page 28: Hackers Champloo 2016 postgresql-9.6

28

tmp=# EXPLAIN (ANALYZE, VERBOSE) SELECT AVG(data) FROM tmp; Finalize Aggregate (cost=10633.55..10633.56 rows=1 width=32) (actual time=116.537..116.537 rows=1 loops=1) Output: avg(data) -> Gather (cost=10633.33..10633.54 rows=2 width=32) (actual time=114.831..116.524 rows=3 loops=1) Output: (PARTIAL avg(data)) Workers Planned: 2 Workers Launched: 2 -> Partial Aggregate (cost=9633.33..9633.34 rows=1 width=32) (actual time=110.293..110.294 rows=1 loops=3) Output: PARTIAL avg(data) Worker 0: actual time=104.469..104.470 rows=1 loops=1 Worker 1: actual time=111.816..111.816 rows=1 loops=1 -> Parallel Seq Scan on public.tmp (cost=0.00..8591.67 rows=416667 width=4) (actual time=3.734..66.547 rows=333333 loops=3) Output: id, data Worker 0: actual time=11.160..65.808 rows=295156 loops=1 Worker 1: actual time=0.014..57.334 rows=248600 loops=1 Planning time: 0.046 ms Execution time: 116.608 ms

PostgreSQL 9.6 から

1 つのクエリでも複数プロセスを使って処理可能になった。

Paralell SeqScan

Partial Aggregate

Gather Final Aggregate

Worker

Worker

Worker

Worker

Page 29: Hackers Champloo 2016 postgresql-9.6

29

パラレルスキャン関連のパラメータパラレルスキャンパラメータ

パラメータ名 意味 デフォルト値 備考

max_worker_processes ワーカープロセス数の最大値

8 変更のためには再起動が必要

max_parallel_workers_per_gather

並列度の最大値 2 beta2で、名前が変わった。0 にすると並列化しなくなる。

force_parallel_mode 並列処理を強制させる。 of

parallel_setup_cost ワーカプロセス起動の推定コスト

1000

parallel_tuple_cost ワーカプロセスから別プロセスへ1タプルを転送する推定コスト

0.1

min_parallel_relation_size 並列化する最小のテーブルサイズ

8 (MB) beta2で追加

これと検索対象のテーブルサイズに依存

Page 30: Hackers Champloo 2016 postgresql-9.6

30

並列数の決定には、サーバの CPU 数は何も関係していない!(重要)

おおまかに言えば、テーブルサイズ(ページ数)がmin_parallel_relation_size( デフォルト: 1000) ページを

超えると並列スキャンを行う。以降、 3 倍毎に並列数が増加する。

並列数の決定

倍数も今後調整可能になるのかな・・・?

Page 31: Hackers Champloo 2016 postgresql-9.6

31

テーブルサイズとパラメータによる並列数決定の例

並列数の決定

テーブルサイズ(ページ数)

max_worker_processes

max_parallel_workers_per_gather

ワーカ起動数

補足

1640 8 2 0 ページ数は 1000 を超えているが・・・

3279 8 2 2 3000 を超えたのでワーカを2 つ起動する

9837 8 4 3 3000*3を超えたのでワーカを 3 つ起動する

9837 8 0 0 max_parallel_workers_per_gather が 0 なので起動しない

9837 1 3 1 max_worker_processes が1 に制限されている。

1 じゃないの?→次スライド参照

beta1 での検証結果です

Page 32: Hackers Champloo 2016 postgresql-9.6

32

bench=# SHOW parallel_setup_cost ; parallel_setup_cost --------------------- 1000(1 row)

bench=# EXPLAIN ANALYZE SELECT AVG(abalance) FROM pgbench_accounts ; QUERY PLAN Aggregate (cost=2890.00..2890.01 rows=1 width=32) (actual time=20.053..20.054 rows=1 loops=1) -> Seq Scan on pgbench_accounts (cost=0.00..2640.00 rows=100000 width=4) (actual time=0.006..6.521 rows=100000 loops=1) Planning time: 0.208 ms Execution time: 20.093 ms(4 rows)

パラレルクエリ用変数の調整

前スライドでページ数が 1600 のときにワーカが起動しないのは、 cost 上パラレルクエリで実施するよりも、フツーにSeqScan したほうが低いと判断されたから。

Page 33: Hackers Champloo 2016 postgresql-9.6

33

bench=# SET parallel_setup_cost TO 300;SETbench=# EXPLAIN ANALYZE SELECT AVG(abalance) FROM pgbench_accounts ; QUERY PLAN Finalize Aggregate (cost=2675.41..2675.42 rows=1 width=32) (actual time=12.707..12.708 rows=1 loops=1) -> Gather (cost=2675.29..2675.40 rows=1 width=32) (actual time=12.434..12.698 rows=2 loops=1) Workers Planned: 1 Workers Launched: 1 -> Partial Aggregate (cost=2375.29..2375.30 rows=1 width=32) (actual time=9.743..9.743 rows=1 loops=2) -> Parallel Seq Scan on pgbench_accounts (cost=0.00..2228.24 rows=58824 width=4) (actual time=0.007..6.190 rows=50000 loops=2) Planning time: 0.049 ms Execution time: 13.414 ms(8 rows)

パラレルクエリ用変数の調整

paralell_setup_cost/paralell_tuple_cost を調整することで、パラレルクエリに変更が可能。上の例は paralell_setup_cost を 1000→300 に調整。

Page 34: Hackers Champloo 2016 postgresql-9.6

34

パラレルスキャン対象でない実行計画パラレルスキャン対象外の SQL 関数を使っているときmax_worker_processes, max_parallel_workers_per_gather等のパラメータ設定他、細々とした制約があるっぽい

パラレルスキャンできない時

Page 35: Hackers Champloo 2016 postgresql-9.6

35

特定の SQL 関数を含む場合、パラレルスキャンの実行計画が選択されない。

一番身近な関数だと、シーケンス制御関数のnextval(), currval(), setval(), lastval() などが

パラレルスキャン対象外となる。

パラレルスキャンできない SQL関数の一覧は、以下の SQL 文で取得可能。

パラレルスキャンできないSQL 関数

SELECT proname FROM pg_proc WHERE proparallel = 'u';

Page 36: Hackers Champloo 2016 postgresql-9.6

36

PostgreSQL 9.6 新機能

Parallel sequential scans, joins and aggregatesElimination of repetitive scanning of old data by autovacuumSynchronous replication now allows multiple standby servers for increased reliabilityFull-text search for phrasesSupport for remote joins, sorts, and updates in postgres_fdwSubstantial performance improvements, especially in the area of improving scalability on many-CPU servers

Page 37: Hackers Champloo 2016 postgresql-9.6

37

autovacuum 改善

Page 38: Hackers Champloo 2016 postgresql-9.6

38

9.5 までの autovacuum ではXID 周回を防ぐための vacuum 時に

全ページを処理していた。

9.6 からは frozen tuples しか含まないページを Visibility Map を参照して効率的に処理をスキップできる。

autovacuum 改善

Page 39: Hackers Champloo 2016 postgresql-9.6

39

この改善の恩恵

変更がほとんどないような巨大なテーブルの

autovacuum 時のコストを大きく削減する。

目立たないけど、とても重要な改善

autovacuum 改善

Page 40: Hackers Champloo 2016 postgresql-9.6

40

PostgreSQL 9.6 新機能

Parallel sequential scans, joins and aggregatesElimination of repetitive scanning of old data by autovacuumSynchronous replication now allows multiple standby servers for increased reliabilityFull-text search for phrasesSupport for remote joins, sorts, and updates in postgres_fdwSubstantial performance improvements, especially in the area of improving scalability on many-CPU servers

Page 41: Hackers Champloo 2016 postgresql-9.6

41

複数同期スタンバイサーバ

Page 42: Hackers Champloo 2016 postgresql-9.6

42

Master

async

async

PostgreSQL 9.5 まで

同期レプリケーション可能なスレーブサーバは 1 台のみ。

Slave

Slave

Slave

sync

Page 43: Hackers Champloo 2016 postgresql-9.6

43

Master

sync

sync

PostgreSQL 9.6 から

同期レプリケーション可能なスレーブサーバが N台に!

Slave

Slave

Slave

sync

( N台構成のフェールオーバ機構、作るの大変そう・・・)

Page 44: Hackers Champloo 2016 postgresql-9.6

44

primary_conninfo = '2(standby1, standby2, standby3)'

synchronous_standby_names の書き方複数同期させる場合には recovery.conf の primary_conninfo にN(name, name, ...) みたいに書く。

primary_conninfo = 'standby1, standby2, standby3'

従来の記法も対応している。この場合は、同期サーバ数は 1になる。

Page 45: Hackers Champloo 2016 postgresql-9.6

45

PostgreSQL 9.6 新機能

Parallel sequential scans, joins and aggregatesElimination of repetitive scanning of old data by autovacuumSynchronous replication now allows multiple standby servers for increased reliabilityFull-text search for phrasesSupport for remote joins, sorts, and updates in postgres_fdwSubstantial performance improvements, especially in the area of improving scalability on many-CPU servers

Page 46: Hackers Champloo 2016 postgresql-9.6

46

PostgreSQL 自体に全文検索機能は昔からある。

Page 47: Hackers Champloo 2016 postgresql-9.6

47

9.6 から入った機能フレーズ検索ts_phrase()<-> 演算子

Page 48: Hackers Champloo 2016 postgresql-9.6

48

tsearch=# SELECT data FROM animal WHERE to_tsvector('english', data) @@ to_tsquery('english', 'dog'); data -------------------------------------------------- I like cats and dogs. In my bed, four dogs and five cats are sleeping. Miss Magee's dog is very strong.(3 rows)

tsearch=# SELECT data FROM animal WHERE to_tsvector('english', data) @@ to_tsquery('english', 'dog & cat'); data -------------------------------------------------- I like cats and dogs. In my bed, four dogs and five cats are sleeping.(2 rows)

これまでの全文検索

複数のワードの指定はできたが、語順を意識した検索は不可(dog, cat の順に出現する文書も cat, dog の順に出現する文書も両方ヒットしていた )

Page 49: Hackers Champloo 2016 postgresql-9.6

49

tsearch=# SELECT data FROM animal WHERE to_tsvector('japanese', data) @@ tsquery_phrase( to_tsquery('japanese', 'dog'), to_tsquery('japanese', 'cat'), 3); data -------------------------------------------------- In my bed, four dogs and five cats are sleeping.(1 row)

tsearch=# SELECT dataFROM animalWHERE to_tsvector('japanese', data) @@ tsquery_phrase( to_tsquery('japanese', 'cat'), to_tsquery('japanese', 'dog'), 3); data ----------------------- I like cats and dogs.(1 row)

フレーズ検索

それぞれ、「 dog→cat 」「 cat→dog 」の順序で並んだテキストが検索されている。

フレーズ検索関数 tsquery_phrase() を使う。

Page 50: Hackers Champloo 2016 postgresql-9.6

50

tsearch=# SELECT dataFROM animalWHERE to_tsvector(data) @@ (to_tsquery('like') <-> to_tsquery('cat')); data ----------------------- I like cats and dogs.(1 row)

<-> 演算子

X <-> Y はtsquery_phrase( X, Y, 1) と同義です。

全文検索用演算子として、 9.6では 新たに

<-> という演算子が追加された。

※ 演算子が簡単に追加できるのも PostgreSQLのいいところ。

Page 51: Hackers Champloo 2016 postgresql-9.6

51

閑話休題

Page 52: Hackers Champloo 2016 postgresql-9.6

52

なんかさっきから英文の例しかないんだけど

日本語全文検索は?

Page 53: Hackers Champloo 2016 postgresql-9.6

53

PostgreSQL本体機能だけでは日本語全文検索はできない (絶望 )

Page 54: Hackers Champloo 2016 postgresql-9.6

54

追加モジュールtextseach_ja を使えば日本語全文検索は可能

http://textsearch-ja.projects.pgfoundry.org/textsearch_ja.html

しかし、公式には 9.0 で開発が止まっている(泣)

Page 55: Hackers Champloo 2016 postgresql-9.6

55

が、少し修正すれば一応、 PostgreSQL 9.6 でも

textsearch_ja は動くようです(検証中)

Page 56: Hackers Champloo 2016 postgresql-9.6

56

9.6 + textsearch_ja

とりあえず、フレーズ検索を使っても動くようです。

tsearch=# SELECT ts_rank_cd( to_tsvector('japanese', data), tsquery_phrase( to_tsquery('japanese', 'セリヌンティウス '), to_tsquery('japanese', 'メロス '), 3) ), ts_headline('japanese', data, tsquery_phrase(to_tsquery( 'japanese', 'セリヌンティウス '), to_tsquery('japanese', 'メロス '), 10))FROM meros WHERE to_tsvector('japanese', data) @@ tsquery_phrase( to_tsquery('japanese', 'セリヌンティウス '), to_tsquery('japanese', 'メロス '), 3); ts_rank_cd | ts_headline 0.1 | <b>セリヌンティウス </b>。」 <b>メロス </b>は眼に涙を浮べて言った。「私を殴れ。ちから一ぱいに頬を殴れ。私は、途中で一度、悪い(1 row)

\

tsquery_phrase() と textsearch_ja の組み合わせ例

Page 57: Hackers Champloo 2016 postgresql-9.6

57

PostgreSQLPostgreSQL でのでの全文検索については全文検索については

それだけでそれだけで 11 時間くらい時間くらい話せるほどネタが多いので話せるほどネタが多いので全文検索に興味があったら全文検索に興味があったらまた沖縄に呼んでくださいまた沖縄に呼んでください

Page 58: Hackers Champloo 2016 postgresql-9.6

58

PostgreSQL 9.6 新機能

Parallel sequential scans, joins and aggregatesElimination of repetitive scanning of old data by autovacuumSynchronous replication now allows multiple standby servers for increased reliabilityFull-text search for phrasesSupport for remote joins, sorts, and updates in postgres_fdwSubstantial performance improvements, especially in the area of improving scalability on many-CPU servers

Page 59: Hackers Champloo 2016 postgresql-9.6

59

postgres_fdw 改善リモート側での結合・ソート・更新

Page 60: Hackers Champloo 2016 postgresql-9.6

60

postgres_fdw とは別の PostgreSQL データベース内の表を

通常の表のように扱えるFDW(Foreign Data Wrapper) の一種

9.3から利用可能DBLINK みたいな機能。

透過的に SQL で書けるというのがメリットです

Page 61: Hackers Champloo 2016 postgresql-9.6

61

local

PostgreSQL 9.5 まで

remote サーバのテーブルから結果を受け取って、local 側で結合やソートを実施更新時はカーソルを使って 1 行ずつ更新・・・

remote

外部テーブル 実テーブル結合やソートを含むクエリ

結合処理ソート処理

結果

Page 62: Hackers Champloo 2016 postgresql-9.6

62

local

PostgreSQL 9.6 から

remote サーバで結合やソートを実施。サーバ間転送量の削減になるかも!更新文もカーソルを使わず remote サーバでそのまま実行。

remote

外部テーブル 実テーブル結合やソートを含むクエリ

そのまま結果

結合処理ソート処理

Page 63: Hackers Champloo 2016 postgresql-9.6

63

bench=# EXPLAIN ANALYZE VERBOSE SELECT AVG(a.data1), AVG(a.data2) FROM table_a a JOIN table_b b ON (a.id = b.id) WHERE a.data1 = 10000 ; QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------------ Aggregate (cost=349.93..349.94 rows=1 width=8) (actual time=1741.557..1741.558 rows=1 loops=1) Output: avg(a.data1), avg(a.data2) -> Hash Join (cost=238.80..349.12 rows=161 width=8) (actual time=99.229..1741.404 rows=11 loops=1) Output: a.data1, a.data2 Hash Cond: (b.id = a.id) -> Foreign Scan on public.table_b b (cost=100.00..197.75 rows=2925 width=4) (actual time=1.066..1648.609 rows=1000000 loops=1) Output: b.id, b.data1, b.data2 Remote SQL: SELECT id FROM public.table_b -> Hash (cost=138.66..138.66 rows=11 width=12) (actual time=0.807..0.807 rows=11 loops=1) Output: a.data1, a.data2, a.id Buckets: 1024 Batches: 1 Memory Usage: 9kB -> Foreign Scan on public.table_a a (cost=100.00..138.66 rows=11 width=12) (actual time=0.794..0.796 rows=11 loops=1) Output: a.data1, a.data2, a.id Remote SQL: SELECT id, data1, data2 FROM public.table_a WHERE ((data1 = 10000)) Planning time: 1.559 ms Execution time: 1748.602 ms(16 rows)

9.5 での実行計画例(結合)

結合処理はローカル側で行っている。結合処理のソースはリモートからローカルに転送されている。

Page 64: Hackers Champloo 2016 postgresql-9.6

64

bench=# EXPLAIN ANALYZE VERBOSE SELECT AVG(a.data1), AVG(a.data2) FROM table_a a JOIN table_b b ON (a.id = b.id) WHERE a.data1 = 10000 ; QUERY PLAN ----------------------------------------------------------------------------------------------------------------------------------------------------- Aggregate (cost=342.59..342.60 rows=1 width=64) (actual time=0.560..0.561 rows=1 loops=1) Output: avg(a.data1), avg(a.data2) -> Foreign Scan (cost=100.00..341.78 rows=161 width=8) (actual time=0.552..0.554 rows=10 loops=1) Output: a.data1, a.data2 Relations: (public.table_a a) INNER JOIN (public.table_b b) Remote SQL: SELECT r1.data1, r1.data2 FROM (public.table_a r1 INNER JOIN public.table_b r2 ON (((r1.id = r2.id)) AND ((r1.data1 = 10000)))) Planning time: 0.123 ms Execution time: 0.789 ms(8 rows)

9.6 での実行計画例(結合)

【ポイント】リモートサーバで結合 SQL を実行その結果、ローカルサーバに転送される行数は 10行!実行時間も 2000倍以上向上!

Page 65: Hackers Champloo 2016 postgresql-9.6

65

local

PostgreSQL 9.5 まで

remote サーバのテーブルから結果を受け取って、local 側で結合やソートを実施

remote

外部テーブル 実テーブル結合やソートを含むクエリ

結合処理ソート処理

結果1000000+10 件の

レコードが転送される

Page 66: Hackers Champloo 2016 postgresql-9.6

66

local

PostgreSQL 9.6 から

サーバ間転送量の削減→大幅な性能の向上!

remote

外部テーブル 実テーブル結合やソートを含むクエリ

そのまま結果

結合処理

結合結果の 10件のみレコードが転送される

Page 67: Hackers Champloo 2016 postgresql-9.6

67

PostgreSQL 9.6 新機能

Parallel sequential scans, joins and aggregatesElimination of repetitive scanning of old data by autovacuumSynchronous replication now allows multiple standby servers for increased reliabilityFull-text search for phrasesSupport for remote joins, sorts, and updates in postgres_fdwSubstantial performance improvements, especially in the area of improving scalability on many-CPU servers

Page 68: Hackers Champloo 2016 postgresql-9.6

68

様々な性能改善(特に CPU が多い環境での改善)

Page 69: Hackers Champloo 2016 postgresql-9.6

69

性能改善項目(一部)

frozen タプルのみのページの再 vacuum 抑止vacuum 時の無駄なヒープ切り詰め抑止btree vacuum 時のスタンバイへの影響低減特定の GROUP BY 改善ORDER BY 後まで SELECT 式評価を遅延カーネル・ディスク・バッファ管理改善

他いろいろ・・・ 性能改善については個人の環境では

なかなか試せない・・・

Page 70: Hackers Champloo 2016 postgresql-9.6

70

性能改善項目

性能改善項目に関しては、今後、 PostgreSQL に強い企業さんや           (PostgreSQL Enterprise Consotium)

あたりが、今後検証結果を出してくれるんじゃないかなーと

期待しています。

Page 71: Hackers Champloo 2016 postgresql-9.6

71

その他

GUC の変更システムカタログの変更SQL コマンドの改善psql の改善contrib の改善

Page 72: Hackers Champloo 2016 postgresql-9.6

72

GUC の変更

Page 73: Hackers Champloo 2016 postgresql-9.6

73

パラメータ名 変更の種別 内容 ぬこメモ

autovacuum_max_workers 最大値の変更 8388607 から 262143 になった。 10 より大きくしたことない気がするのでわりとどうでもいい。

backend_flush_after 新規追加 ディスクフラッシュに関するパラメータ? 通常はデフォルト値 (16 ページ ) のままでいいのかなあ?

bgwriter_flush_after 新規追加 上のパラメータの bgwriter 版? これも通常はデフォルト (64 ページ ) のままでいいのかなあ?

checkpoint_flush_after 新規追加 上のパラメータの checkpointer 版? これも ( 略 )(32 ページ ) の ( 略 )

debug_assertions 既定値変更 既定値が on から ofに変更 開発者向けオプション。

force_parallel_mode 新規追加 パラレルスキャンを強制? enable_* パラメータみたいなものかな?

idle_in_transaction_session_timeout 新規追加 一定時間の idle in transaction session を切断 運用ミスによるロングトランザクション防止に使えそう?

max_connections 最大値の変更 8388607 から 262143 になった。 これもせいぜい 1000 くらいまでしか上げないからなあ・・・

max_parallel_workers_per_gather 新規追加 同期実行するワーカ数上限値 パラレルスキャンに関する重要なパラメータ。beta2 で名称変更。

max_prepared_transactions 最大値の変更 8388607 から 262143 になった。 このパラメータ自体チューニングで使ったこと、あったけなあ・・・

max_replication_slots 最大値の変更 8388607 から 262143 になった。 レプリケーションスロット数をそんな大きな値に設定したことがそもそもない。

max_wal_senders 最大値の変更 8388607 から 262143 になった。 wal sender プロセス数って、もうちょっと上限小さくてもいいんじゃないかなあという気も。

max_worker_processes 最大値の変更 8388607 から 262143 になった。 ワーカプロセス数って、もうちょっと上限 ( 略 )

min_parallel_relation_size 新規追加 パラレルスキャン対象とする最小ページ数 beta2 で追加。

old_snapshot_threshold 新規追加 非常に古いスナップショット読み込み挙動のフラグ? きちんと調べて、どういうときにデフォルト (-1) 以外之設定が必要か理解しないと・・・

9.5 と 9.6 のパラメータ差分

Page 74: Hackers Champloo 2016 postgresql-9.6

74

パラメータ名 変更の種別 内容 ぬこメモ

parallel_setup_cost 新規追加 パラレルスキャンのコスト推定パラメータ パラレルスキャンのチューニング時に重要なパラメータになるのか、だいたいの場合デフォルトでいいのかくらいは調べておかないと。

parallel_tuple_cost 新規追加 パラレルスキャンのコスト推定パラメータ パラレルスキャンのチューニング時に重要なパラメータになるのか ( 略 )

replacement_sort_tuples 新規追加 ソート方式 ( クイックソート / 外部ソート ) の切り替え閾値 ( タプル数 )

既存の work_men/maintenance_work_mem との関係も調べるのかな。

server_version 設定値変更 バージョン番号の変更 現状は 9.6 beta2

server_version_num 設定値変更 バージョン番号値の変更 90600

superuser_reserved_connections 最大値の変更 8388607 から 262143 になった。 max_connection と同じ話か。

synchronous_commit 値域の追加 値域に remote_apply の追加 WAL 反映完了まで待つモードの追加。各スレーブへの検索で同じ結果が保証されるはず。

synchronous_standby_names 説明の変更 複数同期スタンバイに対応した説明変更 これも早く自分で動かしてみないとなあ。

syslog_sequence_numbers 新規追加 syslog でメッセージ分割したときの通番付与フラグ? あんまり syslog 出力って使ってないんだよなー。

syslog_split_messages 新規追加 syslog でメッセージ分割するかどうかのフラグ? あんまり syslog(略 )

wal_level 値域の変更 archive,hot_standby が replica に統一された。 過去に PITR やレプリケーション設定方法を書いているドキュメントへの影響がw

wal_writer_delay 説明の変更 説明文の変更のみ。 フラッシュ関係のパラメータ追加とかが関係しているのかな。

wal_writer_flush_after 新規追加 wal_writer の制御パラメータ またフラッシュ関係のパラメータか!

今回はこのうち2 つの GUC を紹介します。

Page 75: Hackers Champloo 2016 postgresql-9.6

75

idle_in_transaction_session_timeout

SET idle_in_transaction_session_timeout = 3000;SETBEGIN;BEGINSELECT 1; ?column? ---------- 1(1 row)

SELECT pg_sleep(3); pg_sleep ---------- (1 row)

SELECT 2; ?column? ---------- 2(1 row)

\! sleep 3SELECT 3;psql:timeout.sql:7: FATAL: terminating connection due to idle-in-transaction timeout

運用ミスで idel in transaction 状態が長時間継続するときに強制切断することができる。

Idle in transaction が3 秒以上になったら

セッションを切断するこの場合は、

query 実行中なので3 秒以上でもセッションは

切断されない。

この場合は、Idle in transaction状態で

3 秒経過する。

Idle in transaction状態で3 秒経過したので

セッションが切断される。

Page 76: Hackers Champloo 2016 postgresql-9.6

76

wal_level の変更9.6 では wal_level の値域が変更になった。

値域 9.5 まで 9.6 説明

minial ○ ○ デフォルト値。最も WAL サイズが小さくなるが、 PITR やレプリケーションはできない。

archive ○ - PITR 用。9.6 でも隠し設定値として使用可能。

hot_standby ○ - レプリケーション用9.6でも隠し設定値として使用可能。

replica - ○ 9.6 から追加されたレプリケーション /PITRの WAL 形式が 9.6 で統一された。

logcal ○ ○ ロジカルデコーディング用の WAL 形式。最もサイズが大きくなる。

Page 77: Hackers Champloo 2016 postgresql-9.6

77

PostgreSQL も毎年進化しているので数年前に本で書いたことが

すぐに時代遅れになる (´ ・ω ・ `)

Page 78: Hackers Champloo 2016 postgresql-9.6

78

システムカタログの変更

Page 79: Hackers Champloo 2016 postgresql-9.6

79

システムカタログ

テーブル / ビュー名 変更種別 変更内容 ぬこメモ

pg_aggregate 列の追加 aggcombinefn, aggserialfn, aggdeserialfn, aggserialtype の追加

パラレル集約の関係?要調査

pg_am 全面変更 個々のアクセスメソッド用フラグが消えて、ハンドラ関数ポインタに置き換わったみたい。

インデックスのサポート能力って SQL からどうやって見ればいいのだろう。

pg_config カタログの追加 pg_config 相当の情報 リモートから config が参照可能になったってことだね。

pg_init_privs カタログの追加 システム内オブジェクトの初期権限管理用のカタログ?

普段使うものではない?要調査

pg_proc 列の追加 proparallelの追加 名前からすると、関数が並列処理に対応するかどうかのフラグ? CREATE FUNCTION に影響あるのかな。

pg_replication_slots 列の追加 confirmed_flush_lsn の追加。 ロジカルレプリケーション利用者が受信した場所を示す列かな。

pg_stat_activity 列の変更 waiting が wait_event_type とwait_event に分離した。

監視方式にも影響でるのかな?

pg_stat_progress_vacuum カタログの追加 VACUUM処理進捗表示のためのカタログ

PostgreSQL: Documentation: 9.6: Progress Reporting を見ればいいのだな。

pg_stat_wal_receiver カタログの追加 名前のとおり、 wal reciever の挙動に関する稼働統計情報かな。

これを使うと、どういう監視が出来るようになるのかなあ。

Page 80: Hackers Champloo 2016 postgresql-9.6

80

pg_stat_vacuum_progressbench=# SELECT p.relname, v.phase, v.heap_blks_total, v.heap_blks_scanned, v.heap_blks_vacuumed, v.index_vacuum_count FROM pg_stat_progress_vacuum as v JOIN pg_class as p ON (v.relid = p.oid);-[ RECORD 1 ]------+-----------------relname | pgbench_accountsphase | scanning heapheap_blks_total | 16394heap_blks_scanned | 8844heap_blks_vacuumed | 0index_vacuum_count | 0

phase, heap_blks_total, heap_blks_scanned の結果からVACUUM 処理の状況を判断する。VACUUM が完了すると、このビューからレコードは見えなくなる。

Page 81: Hackers Champloo 2016 postgresql-9.6

81

SQL コマンドの改善

Page 82: Hackers Champloo 2016 postgresql-9.6

82

SQL コマンドの改善COPYが RETURNING に対応EXTENSION 削除時の依存オブジェクトの削除CREATE EXTENSION の CASCADE オプション追加CREATE ACCESS METHOD の実装CREATEUSER/NOCREATEUSER オプションを CREATE ROLE 等から削除VACUUM に DISABLE_PAGE_SKIPPING オプションが追加etc...

今回はこのうち1 つだけ紹介します。

Page 83: Hackers Champloo 2016 postgresql-9.6

83

COPY が RETURNING に対応test=# TABLE book; id | title | price ----+------------------+------- 1 | 働けメロス | 600 2 | 我輩はぬこである | 550 3 | リア充 | 780(3 rows)

test=# COPY (DELETE FROM book RETURNING *) TO '/tmp/book.txt';COPY 3test=# TABLE book; id | title | price ----+-------+-------(0 rows)

test=# \q[nuko@localhost test]$ cat /tmp/book.txt 1 働けメロス 6002 我輩はぬこである 5503 リア充 780

RETURNING 句:更新結果を返却することが可能。9.6 からは RETURNING の結果を COPY TO でファイルに直接書き込むことが可能になった。

Page 84: Hackers Champloo 2016 postgresql-9.6

84

psql の改善

Page 85: Hackers Champloo 2016 postgresql-9.6

85

PostgreSQL 標準の CUI 対話的ターミナル

多彩なメタコマンド、タブ補完・・・おそらく、商用含む RDBMS 標準の

対話的ターミナルとしては一番使いやすいんじゃないかと思う。

psql って何?

個人の感想です

Page 86: Hackers Champloo 2016 postgresql-9.6

86

直前クエリの実行結果をクエリとして再実行(\gexec)直前のエラー詳細出力クロスタブ表示(\crosstabview)タブ補完の改善SHOW_CONTEXT メッセージ出力制御etc...

psql の改善(一部)

今回は面白い追加機能を2 つ紹介します。

Page 87: Hackers Champloo 2016 postgresql-9.6

87

psql の改善 (\gexec)test=# SELECT 'CREATE TABLE table_' || generate_series(1,4) || '(id int primary key, data jsonb)'; ?column? ------------------------------------------------------ CREATE TABLE table_1(id int primary key, data jsonb) CREATE TABLE table_2(id int primary key, data jsonb) CREATE TABLE table_3(id int primary key, data jsonb) CREATE TABLE table_4(id int primary key, data jsonb)(4 rows)

test=# \gexecCREATE TABLECREATE TABLECREATE TABLECREATE TABLEtest=# \d List of relations Schema | Name | Type | Owner --------+---------+-------+------- public | table_1 | table | nuko public | table_2 | table | nuko public | table_3 | table | nuko public | table_4 | table | nuko(4 rows)

名前の違うテーブルを多数生成する例

Page 88: Hackers Champloo 2016 postgresql-9.6

88

psql の改善 (\crosstabview)tmp=# TABLE sales ; date | item | sales ------------+-------+------- 2016-05-16 | Ramen | 1650 2016-05-16 | Curry | 2500 2016-05-16 | Udon | 500 2016-05-16 | Soba | 600 2016-05-17 | Ramen | 2400 2016-05-17 | Curry | 800 2016-05-18 | Ramen | 1400 2016-05-18 | Curry | 1600 2016-05-18 | Udon | 1000(9 rows)

tmp=# \crosstabview date item sales date | Ramen | Curry | Udon | Soba ------------+-------+-------+------+------ 2016-05-16 | 1650 | 2500 | 500 | 600 2016-05-17 | 2400 | 800 | | 2016-05-18 | 1400 | 1600 | 1000 | (3 rows)

直前クエリの結果から、クロスタブっぽい表示にする謎機能

Page 89: Hackers Champloo 2016 postgresql-9.6

89

\crosstab の間違った応用例

psql でオセロゲームを作れということか・・・

Page 90: Hackers Champloo 2016 postgresql-9.6

90

contrib 改善(追加モジュールの改善 )

Page 91: Hackers Champloo 2016 postgresql-9.6

91

auto_explain の ratio 指定bloom インデックスの追加cube での K 近傍検索対応hstore と JSON 変換intarray のプラン改善用評価関数追加pageinspect に関数追加pgcrypto 関数の引数追加pg_trgm の機能追加etc...

contrib の改善(一部)

今回はこのうち1 つだけ紹介します。

Page 92: Hackers Champloo 2016 postgresql-9.6

92

auto_explain というのは閾値を超えたスロークエリの実行計画を出力

閾値が低すぎるとログ量が多くなる→性能に影響が出てしまう・・・

9.6 での改善は、 ratio を指定して一定の割合のみログ出力するというもの

auto_explain の ratio 指定

Page 93: Hackers Champloo 2016 postgresql-9.6

93

これは 2月末のPostgreSQL

Newbie-hackerthonのときの測定結果

pgbench で測定。sample_ratio によるtps への影響軽減を確認できた。

Page 94: Hackers Champloo 2016 postgresql-9.6

94

おわりに

Page 95: Hackers Champloo 2016 postgresql-9.6

95

PostgreSQL 9.6 は地味だが今後、化ける機能を含む

重要なリリースになりそう!

メニー CPU 環境での更なる性能向上が見込めるはず

Page 96: Hackers Champloo 2016 postgresql-9.6

96

Let's Download & Testing PostgreSQL 9.6!

Page 97: Hackers Champloo 2016 postgresql-9.6

97

ご清聴ご清聴ありがとうありがとう

ございましたございました

http://www.yunphoto.net

Page 98: Hackers Champloo 2016 postgresql-9.6

98

PostgreSQL 9.6beta1 /beta2 Documentationhttps://www.postgresql.org/docs/9.6/static/release-9-6.htmlhttps://www.postgresql.org/docs/devel/static/release-9-6.htmlCommitfest 2016-03https://commitfest.postgresql.org/9/篠田の虎の巻 5 「 PostgreSQL 9.6 新機能検証結果」http://community.hpe.com/hpeb/attachments/hpeb/JapanEnterpriseTopics/195.6/1/PostgreSQL%209.6%20New%20Features%20ja%2020160530-1.pdfMichael Paquier - Open source developer based in Japanhttp://michael.otacoo.com/永安さんの PostgreSQL Deep DivePostgreSQL 9.6 のパラレルシーケンシャルスキャンを検証するhttp://pgsqldeepdive.blogspot.jp/2015/12/parallel-seq-scan.htmlmasahiko sawada さんの Qiita ページPostgreSQL のマルチ同期レプリケーションhttp://qiita.com/sawada_masahiko/items/748dfe3dd1cbf92f601c

参考にしたもの

Page 99: Hackers Champloo 2016 postgresql-9.6

99

私も微力ながらPostgreSQL 9.6 新機能に関する調査・検証結果をブログで公開中です

http://d.hatena.ne.jp/nuko_yokohama/

Page 100: Hackers Champloo 2016 postgresql-9.6

100

Question?

http://www.yunphoto.net