More Related Content
PDF
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料) PDF
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料) PDF
PDF
PPTX
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料) PPTX
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料) PPTX
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料) PPTX
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ... What's hot
PPTX
PostgreSQLの統計情報について(第26回PostgreSQLアンカンファレンス@オンライン 発表資料) PPTX
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ... PPTX
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料) PPTX
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~ PDF
PPTX
監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性 PPTX
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料) PDF
PDF
PDF
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料) PDF
[B23] PostgreSQLのインデックス・チューニング by Tomonari Katsumata PDF
最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料) PDF
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料) PDF
pg_stat_activityの不可解な観測結果の謎 (第47回 PostgreSQLアンカンファレンス@オンライン 発表資料) PDF
PostgreSQLの運用・監視にまつわるエトセトラ PDF
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(PostgreSQL Conference Japa... PDF
PostgreSQL初心者がパッチを提案してからコミットされるまで(第20回PostgreSQLアンカンファレンス@オンライン 発表資料) PPTX
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料) PDF
オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料) PDF
PostgreSQL: XID周回問題に潜む別の問題 Similar to 使ってみませんか?pg_hint_plan
PDF
PDF
PostgreSQL17対応版 EXPLAINオプションについて (第49回PostgreSQLアンカンファレンス@東京 発表資料) PDF
Pgunconf 20121212-postgeres fdw PDF
PDF
PostgreSQL 13でのpg_stat_statementsの改善について(第12回PostgreSQLアンカンファレンス@オンライン 発表資料) PDF
pg_bigm(ピージーバイグラム)を用いた全文検索のしくみ PDF
PDF
YugabyteDBの実行計画を眺める(NewSQL/分散SQLデータベースよろず勉強会 #3 発表資料) PPTX
Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料) PDF
PPTX
PDF
PDF
PostgreSQL SQLチューニング入門 実践編(pgcon14j) PDF
Hadoop上の多種多様な処理でPigの活きる道 (Hadoop Conferecne Japan 2013 Winter) PDF
PDF
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料) PDF
db tech showcase 2019 D10 Oracle Database New Features PDF
ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料) PDF
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会 PDF
NTT DATA と PostgreSQL が挑んだ総力戦 More from NTT DATA OSS Professional Services
PDF
Global Top 5 を目指す NTT DATA の確かで意外な技術力 PDF
Spark SQL - The internal - PDF
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~ PDF
PDF
HDFS Router-based federation PDF
PostgreSQL10を導入!大規模データ分析事例からみるDWHとしてのPostgreSQL活用のポイント PDF
Apache Hadoopの新機能Ozoneの現状 PDF
Distributed data stores in Hadoop ecosystem PDF
Structured Streaming - The Internal - PDF
Apache Hadoopの未来 3系になって何が変わるのか? PDF
Apache Hadoop and YARN, current development status PDF
HDFS basics from API perspective PDF
SIerとオープンソースの美味しい関係 ~コミュニティの力を活かして世界を目指そう~ PDF
PPTX
PDF
Application of postgre sql to large social infrastructure jp PDF
Application of postgre sql to large social infrastructure PDF
Apache Hadoop 2.8.0 の新機能 (抜粋) PDF
データ活用をもっともっと円滑に!~データ処理・分析基盤編を少しだけ~ PDF
商用ミドルウェアのPuppet化で気を付けたい5つのこと 使ってみませんか?pg_hint_plan
- 1.
Copyright © 2013NTT DATA Corporation
2013年2月16日 NTTデータ 基盤システム事業本部
使ってみませんか? pg_hint_plan
PostgreSQLアンカンファレンス@東京
第25回しくみ+アプリケーション勉強会 - 2.
2
Copyright ©2013 NTT DATA Corporation
目次
pg_hint_planの紹介
デモ
HINT句とコミュニティ
HINT句とNTTデータ - 3.
- 4.
4
Copyright ©2013 NTT DATA Corporation
pg_hint_planとは?
PostgreSQLでHINT句を使えるようにする外部モジュール
開発元
NTT OSSセンタ
公開日
2012年12月
ライセンス
BSD
対応バージョン
PostgreSQL9.1、9.2
公開先
http://en.sourceforge.jp/projects/pghintplan/
pg_hint_plan - 5.
5
Copyright ©2013 NTT DATA Corporation
統計 情報
プランとは?
シーケンシャルスキャン
インデックススキャン
インデックスオンリースキャン
SQLの実行方法にも複数ある
PostgreSQLは、統計情報から最適な方法を選択してSQL実行
プランとは、SQLを実行する方法のこと
どのようにSQL を実行するのが 最適だろう? - 6.
6
Copyright ©2013 NTT DATA Corporation
プラン選択の課題
どのプランを選ぶかはPostgreSQL任せ
PostgreSQLが最適なプランを選んでくれなくて性能劣化
DBの状況変化に伴い、突然不適切なプランが選ばれて性能劣化
商用DBは、プラン選択をDB任せにせず、ユーザに制御させる機能を提供
PostgreSQLではGUCパラメータである程度制御可能だが、柔軟でない
柔軟なプラン制御を外部ツールで実現
HINT句
統計情報
の固定化
DBに指示(HINT)を与えて、どのプランを選ぶかユーザ が思い通りに制御 → pg_hint_plan
一度最適なプランを選んだら、ずっとそのプランを選ぶ ように統計情報を固定化 → pg_dbms_stats - 7.
7
Copyright ©2013 NTT DATA Corporation
統計 情報
HINT句のイメージ
シーケンシャルスキャン
インデックススキャン
インデックスオンリースキャン
インデックススキャンを 選ぶように!
HINT
選択 - 8.
8
Copyright ©2013 NTT DATA Corporation
pg_hint_planでのHINT句の指定
HINT句は、クエリ先頭のブロックコメント /*+ ... */ 内に指定
クエリ先頭以外の/*+ */は、HINT句と見なされない
商用DBとはHINT句の指定場所が異なるため注意
/*+
SeqScan(t1)
IndexScan(t2 t2_pkey)
*/
SELECT /*+ IndexScan(t1 t1_pkey) */
* FROM table1 t1 JOIN table2 t2 ON (t1.key = t2.key);
table1はシーケンシャルスキャン、 table2は主キーインデックスt2_pleyの
インデックスキャンを指示するHINT句
クエリ先頭以外の HINT句は無視される - 9.
9
Copyright ©2013 NTT DATA Corporation
pg_hint_planがサポートするHINT句の種類
商用DBで特に使われるHINT句をサポート
カテゴリ
説明
スキャン方法
テーブルをどの方法でスキャンするか?
結合方法
テーブルをどの方法で結合するか?
結合順序
テーブルをどの順序で結合するか?
パラメータ設定
プラン作成中だけ使うパラメータ設定 - 10.
10
Copyright ©2013 NTT DATA Corporation
pg_hint_planがサポートするHINT句の種類
スキャン方法のHINT句
書式
説明
SeqScan
シーケンシャルスキャンを選択
TidScan
TIDスキャンを選択
IndexScan
インデックススキャンを選択
スキャンにどのインデックスを使うか指定可能
IndexOnlyScan
インデックスオンリースキャンを選択(PostgreSQL9.2以降)
スキャンにどのインデックスを使うか指定可能
BitmapScan
ビットマップスキャンを選択
スキャンにどのインデックスを使うか指定可能 - 11.
11
Copyright ©2013 NTT DATA Corporation
pg_hint_planがサポートするHINT句の種類
スキャン方法のHINT句
書式
説明
NoSeqScan
シーケンシャルスキャン以外で最小コストのスキャンを選択
NoTidScan
TIDスキャン以外で最小コストのスキャンを選択
NoIndexScan
インデックススキャン以外で最小コストのスキャンを選択
NoIndexOnlyScan
インデックスオンリースキャン以外で最小コストのスキャンを選択
(PostgreSQL9.2以降)
NoBitmapScan
ビットマップスキャン以外で最小コストのスキャンを選択 - 12.
12
Copyright ©2013 NTT DATA Corporation
pg_hint_planがサポートするHINT句の種類
結合方法のHINT句
書式
説明
NestLoop
ネストループ結合を選択
HashJoin
ハッシュ結合を選択
MergeJoin
マージ結合を選択
NoNestLoop
ネストループ結合以外で最小コストの結合を選択
NoHashJoin
ハッシュ結合以外で最小コストの結合を選択
NoMergeJoin
マージ結合以外で最小コストの結合を選択 - 13.
13
Copyright ©2013 NTT DATA Corporation
pg_hint_planがサポートするHINT句の種類
結合順序のHINT句
パラメータ設定のHINT句
書式
説明
Leading
テーブルを指定した通りの順番で結合
書式
説明
Set
プラン作成中だけGUCパラメータを指定した値に変更 - 14.
- 15.
15
Copyright ©2013 NTT DATA Corporation
インストールと設定
インストールはいつものやり方
$ tar zxf pg_hint_plan92-1.0.0.tar.gz
$ cd pg_hint_plan92-1.0.0
$ make ※USE_PGXS=1を未指定でも自動的にpgxsを使ってビルド
$ su
# make install
PostgreSQLがpg_hint_planをロードするようにパラメータ設定
$ vi $PGDATA/postgresql.conf
shared_preload_libraries = 'pg_hint_plan'
※custom_variable_classesはv9.2以降廃止されたため、設定不要 - 16.
16
Copyright ©2013 NTT DATA Corporation
HINT句お試し
単純なSQLでHINT句を使用
=# CREATE TABLE hoge (a int, b int);
=# INSERT INTO hoge SELECT x, x FROM generate_series(1,10000) x;
=# CREATE INDEX aaa_idx ON hoge (a);
=# CREATE INDEX bbb_idx ON hoge (b);
=# VACUUM ANALYZE hoge;
=# EXPLAIN ANALYZE
SELECT * FROM hoge WHERE a < 9000 AND b > 10;
/*+ BitmapScan(hoge) */
/*+ SeqScan(hoge) */
/*+ IndexScan(hoge aaa_idx) */
/*+ IndexScan(hoge bbb_idx) */ - 17.
17
Copyright ©2013 NTT DATA Corporation
HINT句お試し
複雑なSQLでHINT句を使用
不適切なプランが選ばれた例としてコミュニティで報告されていたものをデモ用 に変更
http://www.postgresql.org/message-id/E1TSyAf-0006st- DI@wrigleys.postgresql.org
=# CREATE TABLE goods (id text primary key, price int, num int);
=# (10万件のデータ挿入)
=# CREATE INDEX goods_price_idx ON goods(price);
=# VACUUM ANALYZE goods;
ID、値段、個数の3列を持つ商品テーブルをイメージ
id列は、ランダムな英数字10文字
price列は、0~10万のランダムな数字
num列は、0~10のランダムな数字 or NULL - 18.
18
Copyright ©2013 NTT DATA Corporation
HINT句お試し
複雑なSQLでHINT句を使用
/*+ HashJoin(goods ANY_subquery) */
EXPLAIN ANALYZE
SELECT
*
FROM
goods
WHERE
id IN ( SELECT id FROM goods ORDER BY price LIMIT 605 )
AND
num IS NULL
ORDER BY
price DESC
LIMIT 1;
値段が安い商品605件のうち
在庫がない(個数がNULLである)商品で
最も値段が高い商品を
1件だけ検索する
HINT句未指定だと、プランナが不適切なプランを選択して、 低性能
現状プランナのよい改善案はなく、WITH句を使ったSQLに 書き換えることで問題を回避する必要がある - 19.
19
Copyright ©2013 NTT DATA Corporation
pg_hint_planの制約
HINT句で制御できないケース
HINT句で選択できるプランは、プランナが選択候補として挙げられるプランのみ
インデックス未定義の場合、インデックススキャンを選択できない
FULL OUTER JOINでは、ネストループ結合は選択できない
PL/pgSQLにおける制限
PL/pgSQL関数内のクエリに直接HINT句を指定しても無視される
関数実行時のSELECTにHINT句を指定すること
ただし、関数内のクエリがそのまま実行されるとは限らないため、HINT句が期待どお り動作するかは保証外
ドキュメントに、制約が詳細に列挙されているため、
pg_hint_plan利用時には読んでおくこと! - 20.
- 21.
21
Copyright ©2013 NTT DATA Corporation
HINT句とPostgreSQLコミュニティ
http://wiki.postgresql.org/wiki/OptimizerHintsDiscussion - 22.
22
Copyright ©2013 NTT DATA Corporation
HINT句に対するコミュニティのスタンス
PostgreSQLがHINT句をサポートすることを、長年多くの人々が望んできた が、コミュニティの現在の公式なスタンスは、
他DBと同じやり方でHINT句を実装することに興味がない
「他DBにはあるから、PostgreSQLにもあるべき」という提案は歓迎しな い
他DBのHINT句には問題がある。問題を改善するアイデアがあるなら、 価値ある議論ができるかも - 23.
23
Copyright ©2013 NTT DATA Corporation
コミュニティが考えるHINT句の問題
アプリケーションのコードがメンテナンスしにくくなる。クエリに指定され たHINT句は、多大なリファクタリングを必要とする
アップグレードを邪魔する。今日役立ってるHINT句は、アップグレード後 に性能劣化の原因になるかもしれない
DBAが、真の問題を解決する代わりに、HINT句に頼り切ってしまう。こ の悪い癖をHINT句は助長する
HINT句はデータサイズに対してスケールしない。テーブルが小さいとき に正しかったHINTは、大きくなったときに間違ってしまう
PostgreSQLのプランナの改善を邪魔する。HINT句の利用者は、クエリ の問題をコミュニティに報告しなくなる - 24.
24
Copyright ©2013 NTT DATA Corporation
コミュニティが考えるHINT句の使いどころ
メンテナンス性を気にする必要のない単発クエリ
様々なプランをテストして、プランナがどう動くのか見るための方法
プランナのバグの対策
既知の実装上のバグ
理論上の問題。プラン見積もりの上限など - 25.
- 26.
26
Copyright ©2013 NTT DATA Corporation
NTTデータがHINT句を必要とする理由
性能の安定化
基幹系システムでは、最高性能より性能の安定性の方が重要
プランが変化することによる突然の性能向上/劣化を避けたい
HINT句でプランを固定化し、性能を安定化させたい!
クエリチューニングの(最終)手段
どう頑張っても最適なプランを選んでくれないクエリのチューニング
プランナのバグは修正済だが、マイナーバージョンのリリースまで時間が あり、システム開発に間に合わない場合のチューニング
商用DBからPostgreSQLへのマイグレーションの促進
HINT句のリスクは承知済。リスクのシステムへの影響を見切った上で利用 - 27.
- 28.
28
Copyright ©2013 NTT DATA Corporation
まとめ
HINT句は使い方次第で
魔法の杖にも
トラブルの元凶にもなります。
効果とリスクを正しく理解し、
pg_hint_planで
PostgreSQLの一歩進んだ使い方を! - 29.