SlideShare a Scribd company logo
PostgreSQL13を検証してみた
2
自己紹介
● 竹内 尚也
DB(Oracle, PostgreSQL) に特化したお仕事を最近までし
ていました。今は主に PHP と MySQL で会計関連の Web
システムを作るバイトをしています。
python と PHP 要員
として来ました。
前職で DB の経験あるよね?
はい。 Oracle と PostgreSQL なら
じゃあ MySQL やって
え?
3
アジェンダ
1.はじめに
2.ポスグレ 13 の新機能を検証
1.log_statement_sample_rate
2.pgbench でパーティション
3.SQL をコピペしやすくなった
3.終わりに
4
1. はじめに
● 今は MySQL をやってるので PostgreSQL の最新情報
をしらない !!
・今の自分の知識だともう古いかもしれない…。
・ MySQL との比較的なので発表できないかネタ探し。
・気がついたら MySQL オンリー資料になってた。
・今更新しい検証をする時間がない。
13 のお手軽な新機能検証なら
すぐにできて、ネタ的にもよくね !?
5
2. ポスグレ 13 の新機能を検証
● とりあえず気になったのを触れてみた。
 まだ β 版もないので、 Git からソースをビルドしました。
今回検証したのは次の 3 つです。
● log_statement_sample_rate
●
pgbench でパーティション
●
SQL をコピペしやすくなった
6
2-1.log_statement_sample_rate
● スロークエリのログ出力を抑制
 今までは…
スロークエリが多すぎると、ログ肥大化 & 可読性の低下に繋がる。
 13 からは…
このパラメータでスロークエリの出力量を抑制できる!
※ 実は 12beta 版でも実装され、正式版で廃止されたのが 13 で蘇った。
7
2-1.log_statement_sample_rate
● 関連するパラメータ
log_min_duration_statement
昔からあるパラメータ。指定した時間以上かかった SQL を記録する。
log_min_duration_sample
追加されたパラメータ。指定した時間以上かかった SQL を記録する。
出力量は「 log_statement_sample_rate 」によって抑制される。
「 log_min_duration_statement 」より優先度は低い。
log_statement_sample_rate
追加されたパラメータ。
「 log_statement_sample_rate 」の出力ログ量を割合で抑制する。
1.0 は全てを記録、 0 の場合何も記録しない。
log_min_duration_statement より
高い値にした場合、無視される。
8
2-1.log_statement_sample_rate
● 検証 ~意図的にスロークエリを実行~
パラメータの設定
・ log_min_duration_statement = -1 ( 無効化 )
・ log_min_duration_sample = 500ms
・ log_statement_sample_rate = < 色々変えて試す >
実行する SQL
SELECT pg_sleep(1) AS label01;
SELECT pg_sleep(1) AS label02;
SELECT pg_sleep(1) AS label03;
SELECT pg_sleep(1) AS label04;
SELECT pg_sleep(1) AS label05;
SELECT pg_sleep(1) AS label06;
SELECT pg_sleep(1) AS label07;
SELECT pg_sleep(1) AS label08;
SELECT pg_sleep(1) AS label09;
SELECT pg_sleep(1) AS label10;
ラベルを付けて 10 個のうち
どの SQL が記録されたか確認する。
9
2-1.log_statement_sample_rate
● 検証 ~意図的にスロークエリを実行~
log_statement_sample_rate = 1.0 の場合
全てのクエリが記録される。
LOG: duration: 1001.968 ms statement: SELECT pg_sleep(1) AS label01;
LOG: duration: 1001.845 ms statement: SELECT pg_sleep(1) AS label02;
…
LOG: duration: 1001.822 ms statement: SELECT pg_sleep(1) AS label09;
LOG: duration: 1002.205 ms statement: SELECT pg_sleep(1) AS label10;
log_statement_sample_rate = 0.5 の場合
試行回数が少ないせいか、 7 割ほどログが記録される。順番も不規則。
LOG: duration: 1001.541 ms statement: SELECT pg_sleep(1) AS label02;
LOG: duration: 1002.212 ms statement: SELECT pg_sleep(1) AS label03;
LOG: duration: 1001.598 ms statement: SELECT pg_sleep(1) AS label04;
LOG: duration: 1001.119 ms statement: SELECT pg_sleep(1) AS label05;
LOG: duration: 1001.363 ms statement: SELECT pg_sleep(1) AS label06;
LOG: duration: 1002.117 ms statement: SELECT pg_sleep(1) AS label08;
LOG: duration: 1001.350 ms statement: SELECT pg_sleep(1) AS label10;
10
2-1.log_statement_sample_rate
● もっと試行回数を増やしたい
大量のクエリ実行の SQL ファイルを生成するバッチを作成
rm -rf sample.sql
for i in {1..1000}; do
echo "SELECT ${i}, pg_sleep(1) AS test;" >> sample.sql
done
log_statement_sample_rate = 0.5 の場合
「 test 」を含む行数をカウントする。
→509 行 (= 約半分 ) 取得されている。
$ grep -ic "test" postgresql-2019-12-06_200041.log
509
[sample.sal]
SELECT 1, pg_sleep(1) AS test;
SELECT 2, pg_sleep(1) AS test;
…
SELECT 1000, pg_sleep(1) AS test;
11
2-1.log_statement_sample_rate
● 別接続の場合どうなるか
大量の psql 接続 + スロークエリを実行するバッチを作成
for i in {1..1000}; do
psql -c "SELECT ${i}, pg_sleep(1) AS test2;"
done
log_statement_sample_rate = 0.5 の場合
「 test 」を含む行数をカウントする。
→512 行 (= 約半分 ) 取得されている。
$ grep -ic "test" postgresql-2019-12-06_202546.log
512
=全接続の SQL から指定された割合のログになるよう抑制している。
1 クエリ毎に psql 接続している。
12
2-2.pg_bench でパーティション
● pg_bench でパーティションテーブルが作れる
--partitions=<NUM>
pgbench_accounts テーブルに生成するパーティション数を指定する。
デフォルトは 0 で、パーティションは生成されない。
--partition-method=<NAME>
使用するパーティションの手法を指定する。
現在は「 range 」と「 hash 」が選べる。
13
2-2.pg_bench でパーティション
● さっそく作ってみた
100 万行の pgbench_accounts を 10 パーティションで区切る
$ pgbench -i -s 10 --partitions=10 --partition-method=range
スケールは「 -s 10 」なので
10 * 10 万行の 100 万行になるよ
14
2-2.pg_bench でパーティション
● 結果を見てみると
=# d+ pgbench_accounts
Partitioned table "public.pgbench_accounts"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
----------+---------------+-----------+----------+---------+----------+--------------+-------------
aid | integer | | not null | | plain | |
bid | integer | | | | plain | |
abalance | integer | | | | plain | |
filler | character(84) | | | | extended | |
Partition key: RANGE (aid)
Indexes:
"pgbench_accounts_pkey" PRIMARY KEY, btree (aid)
Partitions: pgbench_accounts_1 FOR VALUES FROM (MINVALUE) TO (100001),
pgbench_accounts_10 FOR VALUES FROM (900001) TO (MAXVALUE),
pgbench_accounts_2 FOR VALUES FROM (100001) TO (200001),
pgbench_accounts_3 FOR VALUES FROM (200001) TO (300001),
pgbench_accounts_4 FOR VALUES FROM (300001) TO (400001),
pgbench_accounts_5 FOR VALUES FROM (400001) TO (500001),
pgbench_accounts_6 FOR VALUES FROM (500001) TO (600001),
pgbench_accounts_7 FOR VALUES FROM (600001) TO (700001),
pgbench_accounts_8 FOR VALUES FROM (700001) TO (800001),
pgbench_accounts_9 FOR VALUES FROM (800001) TO (900001)
レンジパーティションとして 10 個に分割されている。
15
2-3.SQL をコピペしやすくなった
● 複数行の SQL はコピペしてもそのまま使いにくい
postgres=# SELECT
postgres-# '2019-12-01'::date + g
postgres-# FROM
postgres-# generate_series(0, 3) AS g;
?column?
------------
2019-12-01
2019-12-02
2019-12-03
2019-12-04
(4 rows)
2019/12/1 から 3 日後までの 4 日間を表示する SQL
そのままコピペして使えない。この辺りを削除しなければいけない。
16
2-3.SQL をコピペしやすくなった
● 13 の新機能「 SET PROMPT2 」を使うと
postgres=# set PROMPT2 ''
postgres=# SELECT
'2019-12-01'::date + g
FROM
generate_series(0, 3) AS g;
2 行目以降を空白など好きな文字列にできる。
※ コピペしやすくなった
空白以外も指定可能
postgres=# set PROMPT2 '> '
postgres=# SELECT
> '2019-12-01'::date + g
> FROM
> generate_series(0, 3) AS g;
17
3. 終わりに
● 12 もいいけど 13 も面白そうな情報が色々出てるよ。
● ログ出力の抑制は、使い所に注意が必要そう。
log_min_duration_statement と組み合わせるといい
感じにいけるか?
● pgbench で簡単にパーティションテーブルが生成でき
るので、パーティションの検証がしやすくなりそう。
● コピペがしやすくなったのはブログとかで記事を投稿し
ている身としては大変ありがたい。
Ad

Recommended

PDF
DynamoDB MyNA・JPUG合同DB勉強会 in 東京
Yuko Mori
 
PDF
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)
Satoshi Yamada
 
PDF
Chugokudb study-20150131
Toshi Harada
 
PPTX
Powershell勉強会 v2 (もっと新しいバージョンがあります)
Tetsu Yama
 
PPT
Maatkit で MySQL チューニング
Kensuke Nagae
 
PPTX
Powershell勉強会 v5 (こちらが最新です。)
Tetsu Yama
 
PPTX
Powershell勉強会 v3 (もっと新しいバージョンがあります)
Tetsu Yama
 
PDF
Aerospike紹介-LT用
Joongjin Bae
 
PPTX
Powershell勉強会 v4 (もっと新しいバージョンがあります。)
Tetsu Yama
 
PPTX
Powershell 超絶基礎 勉強会 v1 (もっと新しいバージョンがあります)
Tetsu Yama
 
PPTX
Powershell基礎_20180521用
Tetsu Yama
 
PDF
MyNA JPUG study 20160220-postgresql-json-datatype
Toshi Harada
 
PPT
20090107 Postgre Sqlチューニング(Sql編)
Hiromu Shioya
 
PDF
PostgreSQLとPythonとSQL
Satoshi Yamada
 
PDF
Lt ingaoho-jsonb+postgeres fdw
Toshi Harada
 
PDF
JSONBはPostgreSQL9.5でいかに改善されたのか
NTT DATA OSS Professional Services
 
PDF
Pgunconf 20121212-postgeres fdw
Toshi Harada
 
PDF
PostgreSQL 10 新機能 @オープンセミナー香川 2017
Shigeru Hanada
 
PDF
PostgreSQLの関数属性を知ろう
kasaharatt
 
PDF
PostgreSQL 10 新機能 @OSC 2017 Fukuoka
Shigeru Hanada
 
PDF
PGCon.jp 2014 jsonb-datatype-20141205
Toshi Harada
 
PDF
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
Satoshi Nagayasu
 
PDF
Osc2015 hokkaido postgresql-semi-stuructured-datatype
Toshi Harada
 
PDF
Chugoku db 17th-postgresql-9.6
Toshi Harada
 
PDF
RailsエンジニアのためのSQLチューニング速習会
Nao Minami
 
PPTX
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
Miki Shimogai
 
PPTX
SQLチューニング入門 入門編
Miki Shimogai
 
PPTX
Ruby on Rails on MySQL チューニング入門
だいすけ さとう
 
PDF
PostgreSQL13 新機能紹介
Satoshi Hirata
 
PDF
20171103 pg con-jp-lt-plpgsql
Toshi Harada
 

More Related Content

What's hot (20)

PPTX
Powershell勉強会 v4 (もっと新しいバージョンがあります。)
Tetsu Yama
 
PPTX
Powershell 超絶基礎 勉強会 v1 (もっと新しいバージョンがあります)
Tetsu Yama
 
PPTX
Powershell基礎_20180521用
Tetsu Yama
 
PDF
MyNA JPUG study 20160220-postgresql-json-datatype
Toshi Harada
 
PPT
20090107 Postgre Sqlチューニング(Sql編)
Hiromu Shioya
 
PDF
PostgreSQLとPythonとSQL
Satoshi Yamada
 
PDF
Lt ingaoho-jsonb+postgeres fdw
Toshi Harada
 
PDF
JSONBはPostgreSQL9.5でいかに改善されたのか
NTT DATA OSS Professional Services
 
PDF
Pgunconf 20121212-postgeres fdw
Toshi Harada
 
PDF
PostgreSQL 10 新機能 @オープンセミナー香川 2017
Shigeru Hanada
 
PDF
PostgreSQLの関数属性を知ろう
kasaharatt
 
PDF
PostgreSQL 10 新機能 @OSC 2017 Fukuoka
Shigeru Hanada
 
PDF
PGCon.jp 2014 jsonb-datatype-20141205
Toshi Harada
 
PDF
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
Satoshi Nagayasu
 
PDF
Osc2015 hokkaido postgresql-semi-stuructured-datatype
Toshi Harada
 
PDF
Chugoku db 17th-postgresql-9.6
Toshi Harada
 
PDF
RailsエンジニアのためのSQLチューニング速習会
Nao Minami
 
PPTX
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
Miki Shimogai
 
PPTX
SQLチューニング入門 入門編
Miki Shimogai
 
PPTX
Ruby on Rails on MySQL チューニング入門
だいすけ さとう
 
Powershell勉強会 v4 (もっと新しいバージョンがあります。)
Tetsu Yama
 
Powershell 超絶基礎 勉強会 v1 (もっと新しいバージョンがあります)
Tetsu Yama
 
Powershell基礎_20180521用
Tetsu Yama
 
MyNA JPUG study 20160220-postgresql-json-datatype
Toshi Harada
 
20090107 Postgre Sqlチューニング(Sql編)
Hiromu Shioya
 
PostgreSQLとPythonとSQL
Satoshi Yamada
 
Lt ingaoho-jsonb+postgeres fdw
Toshi Harada
 
JSONBはPostgreSQL9.5でいかに改善されたのか
NTT DATA OSS Professional Services
 
Pgunconf 20121212-postgeres fdw
Toshi Harada
 
PostgreSQL 10 新機能 @オープンセミナー香川 2017
Shigeru Hanada
 
PostgreSQLの関数属性を知ろう
kasaharatt
 
PostgreSQL 10 新機能 @OSC 2017 Fukuoka
Shigeru Hanada
 
PGCon.jp 2014 jsonb-datatype-20141205
Toshi Harada
 
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
Satoshi Nagayasu
 
Osc2015 hokkaido postgresql-semi-stuructured-datatype
Toshi Harada
 
Chugoku db 17th-postgresql-9.6
Toshi Harada
 
RailsエンジニアのためのSQLチューニング速習会
Nao Minami
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
Miki Shimogai
 
SQLチューニング入門 入門編
Miki Shimogai
 
Ruby on Rails on MySQL チューニング入門
だいすけ さとう
 

Similar to PostgreSQL13を検証してみた (20)

PDF
PostgreSQL13 新機能紹介
Satoshi Hirata
 
PDF
20171103 pg con-jp-lt-plpgsql
Toshi Harada
 
PPTX
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
NTT DATA Technology & Innovation
 
PDF
KOF2015 PostgreSQL 9.5
Toshi Harada
 
PPTX
監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性
Ohyama Masanori
 
PPTX
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
NTT DATA Technology & Innovation
 
PDF
pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
20130203 OSS-DB Exam Silver 技術解説無料セミナー
Kazuko Itoda
 
PDF
20130203 oss-db-lpi
Shinichi Matsuda
 
PDF
Kof2016 postgresql-9.6
Toshi Harada
 
PDF
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
Yoshiyuki Asaba
 
PDF
PostgreSQL 13でのpg_stat_statementsの改善について(第12回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
OSC沖縄2014_JPUG資料
kasaharatt
 
PDF
[db tech showcase Tokyo 2014] D21: Postgres Plus Advanced Serverはここが使える&9.4新機...
Insight Technology, Inc.
 
PDF
YugabyteDBの実行計画を眺める(NewSQL/分散SQLデータベースよろず勉強会 #3 発表資料)
NTT DATA Technology & Innovation
 
PDF
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012
Shigeru Hanada
 
PPTX
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
20190518 27th-chugoku db-lt-pg12
Toshi Harada
 
PDF
最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)
NTT DATA Technology & Innovation
 
PDF
PostgreSQL15 新機能紹介
Satoshi Hirata
 
PostgreSQL13 新機能紹介
Satoshi Hirata
 
20171103 pg con-jp-lt-plpgsql
Toshi Harada
 
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
NTT DATA Technology & Innovation
 
KOF2015 PostgreSQL 9.5
Toshi Harada
 
監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性
Ohyama Masanori
 
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
NTT DATA Technology & Innovation
 
pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
20130203 OSS-DB Exam Silver 技術解説無料セミナー
Kazuko Itoda
 
20130203 oss-db-lpi
Shinichi Matsuda
 
Kof2016 postgresql-9.6
Toshi Harada
 
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
Yoshiyuki Asaba
 
PostgreSQL 13でのpg_stat_statementsの改善について(第12回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
OSC沖縄2014_JPUG資料
kasaharatt
 
[db tech showcase Tokyo 2014] D21: Postgres Plus Advanced Serverはここが使える&9.4新機...
Insight Technology, Inc.
 
YugabyteDBの実行計画を眺める(NewSQL/分散SQLデータベースよろず勉強会 #3 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012
Shigeru Hanada
 
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
20190518 27th-chugoku db-lt-pg12
Toshi Harada
 
最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQL15 新機能紹介
Satoshi Hirata
 
Ad

Recently uploaded (7)

PPTX
Protect Your IoT Data with UbiBot's Private Platform.pptx
ユビボット 株式会社
 
PDF
Forguncy 10 製品概要資料 - ノーコードWebアプリ開発プラットフォーム
フォーガンシー
 
PPTX
色について.pptx .
iPride Co., Ltd.
 
PDF
AI技術共有会2025-06-05_DeepResearchの理解と実践.pdf
Takuma Oda
 
PDF
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
NTT DATA Technology & Innovation
 
PPTX
勉強会_ターミナルコマンド入力迅速化_20250620. pptx. .
iPride Co., Ltd.
 
PPTX
Vibe Codingを始めよう 〜Cursorを例に、ノーコードでのプログラミング体験〜
iPride Co., Ltd.
 
Protect Your IoT Data with UbiBot's Private Platform.pptx
ユビボット 株式会社
 
Forguncy 10 製品概要資料 - ノーコードWebアプリ開発プラットフォーム
フォーガンシー
 
色について.pptx .
iPride Co., Ltd.
 
AI技術共有会2025-06-05_DeepResearchの理解と実践.pdf
Takuma Oda
 
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
NTT DATA Technology & Innovation
 
勉強会_ターミナルコマンド入力迅速化_20250620. pptx. .
iPride Co., Ltd.
 
Vibe Codingを始めよう 〜Cursorを例に、ノーコードでのプログラミング体験〜
iPride Co., Ltd.
 
Ad

PostgreSQL13を検証してみた

  • 2. 2 自己紹介 ● 竹内 尚也 DB(Oracle, PostgreSQL) に特化したお仕事を最近までし ていました。今は主に PHP と MySQL で会計関連の Web システムを作るバイトをしています。 python と PHP 要員 として来ました。 前職で DB の経験あるよね? はい。 Oracle と PostgreSQL なら じゃあ MySQL やって え?
  • 3. 3 アジェンダ 1.はじめに 2.ポスグレ 13 の新機能を検証 1.log_statement_sample_rate 2.pgbench でパーティション 3.SQL をコピペしやすくなった 3.終わりに
  • 4. 4 1. はじめに ● 今は MySQL をやってるので PostgreSQL の最新情報 をしらない !! ・今の自分の知識だともう古いかもしれない…。 ・ MySQL との比較的なので発表できないかネタ探し。 ・気がついたら MySQL オンリー資料になってた。 ・今更新しい検証をする時間がない。 13 のお手軽な新機能検証なら すぐにできて、ネタ的にもよくね !?
  • 5. 5 2. ポスグレ 13 の新機能を検証 ● とりあえず気になったのを触れてみた。  まだ β 版もないので、 Git からソースをビルドしました。 今回検証したのは次の 3 つです。 ● log_statement_sample_rate ● pgbench でパーティション ● SQL をコピペしやすくなった
  • 6. 6 2-1.log_statement_sample_rate ● スロークエリのログ出力を抑制  今までは… スロークエリが多すぎると、ログ肥大化 & 可読性の低下に繋がる。  13 からは… このパラメータでスロークエリの出力量を抑制できる! ※ 実は 12beta 版でも実装され、正式版で廃止されたのが 13 で蘇った。
  • 7. 7 2-1.log_statement_sample_rate ● 関連するパラメータ log_min_duration_statement 昔からあるパラメータ。指定した時間以上かかった SQL を記録する。 log_min_duration_sample 追加されたパラメータ。指定した時間以上かかった SQL を記録する。 出力量は「 log_statement_sample_rate 」によって抑制される。 「 log_min_duration_statement 」より優先度は低い。 log_statement_sample_rate 追加されたパラメータ。 「 log_statement_sample_rate 」の出力ログ量を割合で抑制する。 1.0 は全てを記録、 0 の場合何も記録しない。 log_min_duration_statement より 高い値にした場合、無視される。
  • 8. 8 2-1.log_statement_sample_rate ● 検証 ~意図的にスロークエリを実行~ パラメータの設定 ・ log_min_duration_statement = -1 ( 無効化 ) ・ log_min_duration_sample = 500ms ・ log_statement_sample_rate = < 色々変えて試す > 実行する SQL SELECT pg_sleep(1) AS label01; SELECT pg_sleep(1) AS label02; SELECT pg_sleep(1) AS label03; SELECT pg_sleep(1) AS label04; SELECT pg_sleep(1) AS label05; SELECT pg_sleep(1) AS label06; SELECT pg_sleep(1) AS label07; SELECT pg_sleep(1) AS label08; SELECT pg_sleep(1) AS label09; SELECT pg_sleep(1) AS label10; ラベルを付けて 10 個のうち どの SQL が記録されたか確認する。
  • 9. 9 2-1.log_statement_sample_rate ● 検証 ~意図的にスロークエリを実行~ log_statement_sample_rate = 1.0 の場合 全てのクエリが記録される。 LOG: duration: 1001.968 ms statement: SELECT pg_sleep(1) AS label01; LOG: duration: 1001.845 ms statement: SELECT pg_sleep(1) AS label02; … LOG: duration: 1001.822 ms statement: SELECT pg_sleep(1) AS label09; LOG: duration: 1002.205 ms statement: SELECT pg_sleep(1) AS label10; log_statement_sample_rate = 0.5 の場合 試行回数が少ないせいか、 7 割ほどログが記録される。順番も不規則。 LOG: duration: 1001.541 ms statement: SELECT pg_sleep(1) AS label02; LOG: duration: 1002.212 ms statement: SELECT pg_sleep(1) AS label03; LOG: duration: 1001.598 ms statement: SELECT pg_sleep(1) AS label04; LOG: duration: 1001.119 ms statement: SELECT pg_sleep(1) AS label05; LOG: duration: 1001.363 ms statement: SELECT pg_sleep(1) AS label06; LOG: duration: 1002.117 ms statement: SELECT pg_sleep(1) AS label08; LOG: duration: 1001.350 ms statement: SELECT pg_sleep(1) AS label10;
  • 10. 10 2-1.log_statement_sample_rate ● もっと試行回数を増やしたい 大量のクエリ実行の SQL ファイルを生成するバッチを作成 rm -rf sample.sql for i in {1..1000}; do echo "SELECT ${i}, pg_sleep(1) AS test;" >> sample.sql done log_statement_sample_rate = 0.5 の場合 「 test 」を含む行数をカウントする。 →509 行 (= 約半分 ) 取得されている。 $ grep -ic "test" postgresql-2019-12-06_200041.log 509 [sample.sal] SELECT 1, pg_sleep(1) AS test; SELECT 2, pg_sleep(1) AS test; … SELECT 1000, pg_sleep(1) AS test;
  • 11. 11 2-1.log_statement_sample_rate ● 別接続の場合どうなるか 大量の psql 接続 + スロークエリを実行するバッチを作成 for i in {1..1000}; do psql -c "SELECT ${i}, pg_sleep(1) AS test2;" done log_statement_sample_rate = 0.5 の場合 「 test 」を含む行数をカウントする。 →512 行 (= 約半分 ) 取得されている。 $ grep -ic "test" postgresql-2019-12-06_202546.log 512 =全接続の SQL から指定された割合のログになるよう抑制している。 1 クエリ毎に psql 接続している。
  • 12. 12 2-2.pg_bench でパーティション ● pg_bench でパーティションテーブルが作れる --partitions=<NUM> pgbench_accounts テーブルに生成するパーティション数を指定する。 デフォルトは 0 で、パーティションは生成されない。 --partition-method=<NAME> 使用するパーティションの手法を指定する。 現在は「 range 」と「 hash 」が選べる。
  • 13. 13 2-2.pg_bench でパーティション ● さっそく作ってみた 100 万行の pgbench_accounts を 10 パーティションで区切る $ pgbench -i -s 10 --partitions=10 --partition-method=range スケールは「 -s 10 」なので 10 * 10 万行の 100 万行になるよ
  • 14. 14 2-2.pg_bench でパーティション ● 結果を見てみると =# d+ pgbench_accounts Partitioned table "public.pgbench_accounts" Column | Type | Collation | Nullable | Default | Storage | Stats target | Description ----------+---------------+-----------+----------+---------+----------+--------------+------------- aid | integer | | not null | | plain | | bid | integer | | | | plain | | abalance | integer | | | | plain | | filler | character(84) | | | | extended | | Partition key: RANGE (aid) Indexes: "pgbench_accounts_pkey" PRIMARY KEY, btree (aid) Partitions: pgbench_accounts_1 FOR VALUES FROM (MINVALUE) TO (100001), pgbench_accounts_10 FOR VALUES FROM (900001) TO (MAXVALUE), pgbench_accounts_2 FOR VALUES FROM (100001) TO (200001), pgbench_accounts_3 FOR VALUES FROM (200001) TO (300001), pgbench_accounts_4 FOR VALUES FROM (300001) TO (400001), pgbench_accounts_5 FOR VALUES FROM (400001) TO (500001), pgbench_accounts_6 FOR VALUES FROM (500001) TO (600001), pgbench_accounts_7 FOR VALUES FROM (600001) TO (700001), pgbench_accounts_8 FOR VALUES FROM (700001) TO (800001), pgbench_accounts_9 FOR VALUES FROM (800001) TO (900001) レンジパーティションとして 10 個に分割されている。
  • 15. 15 2-3.SQL をコピペしやすくなった ● 複数行の SQL はコピペしてもそのまま使いにくい postgres=# SELECT postgres-# '2019-12-01'::date + g postgres-# FROM postgres-# generate_series(0, 3) AS g; ?column? ------------ 2019-12-01 2019-12-02 2019-12-03 2019-12-04 (4 rows) 2019/12/1 から 3 日後までの 4 日間を表示する SQL そのままコピペして使えない。この辺りを削除しなければいけない。
  • 16. 16 2-3.SQL をコピペしやすくなった ● 13 の新機能「 SET PROMPT2 」を使うと postgres=# set PROMPT2 '' postgres=# SELECT '2019-12-01'::date + g FROM generate_series(0, 3) AS g; 2 行目以降を空白など好きな文字列にできる。 ※ コピペしやすくなった 空白以外も指定可能 postgres=# set PROMPT2 '> ' postgres=# SELECT > '2019-12-01'::date + g > FROM > generate_series(0, 3) AS g;
  • 17. 17 3. 終わりに ● 12 もいいけど 13 も面白そうな情報が色々出てるよ。 ● ログ出力の抑制は、使い所に注意が必要そう。 log_min_duration_statement と組み合わせるといい 感じにいけるか? ● pgbench で簡単にパーティションテーブルが生成でき るので、パーティションの検証がしやすくなりそう。 ● コピペがしやすくなったのはブログとかで記事を投稿し ている身としては大変ありがたい。