Skip to main content
Copyright © 2014 NTT DATA Corporation 
2014年12月5日 
株式会社NTT DATA 
笠原 辰仁、澤田 雅彦 
NTT DATA と PostgreSQL が挑んだ総力戦 ~ PostgreSQL を極限まで使い切ったその先に見たものとは? ~ 
PostgreSQLカンファレンス2014
2 
Copyright © 2014 NTT DATA Corporation 
INDEX 
PostgreSQLとNTT DATA 
事例概要 
立ちはだかる壁 
その先に 
おわりに
3 
Copyright © 2014 NTT DATA Corporation 
OSSが世の中一般に広まり、活用され始める。 NTT DATA 含め、NTTグループとして戦略的にOSSを 活用していく体制を整え、OSS適用も活発化。 
認知・活用へ(199x - 2007頃) 
年度 
主な出来事 
1999 
【コミュニティ】 日本PostgreSQLユーザ会(JPUG)設立 
2001 
【PG】 PostgreSQL 7.1 (ログ先行書き込み(WAL)の実装) 
2005 
【PG】 PostgreSQL8.0 (Windows対応・PITR) 
2006 
【NTTG】 NTT OSSセンタ設立
4 
Copyright © 2014 NTT DATA Corporation 
OSSというだけで適用が進む時代が終わる。 NTT DATAでは全社展開のためモデル作成を実施。 
エンタープライズ分野での弱点をカバーすべく研究開 発、新規ソリューション開拓も活発に。 
普及・継続的取り組みへ(2008 - 2013頃) 
年度 
主な出来事 
2008 
【PG】 PostgreSQL 8.3(autovacuum 標準装備) 
2011 
【PG】 PostgreSQL 9.1(同期レプリケーション機能の採用) 
2012 
【コミュニティ】 PGECons 設立 
2013 
【NTTD】 GresCube 販売開始
5 
Copyright © 2014 NTT DATA Corporation 
そして今(2014~) 
NTT DATA では、OSSスタックが高い利用頻度に。 PostgreSQLのコモディティ化が進む。 
大規模システムでも、当たり前にPostgreSQLを使う今。 従来のPostgreSQLの当たり前の使い方だけでは 太刀打ちできない要件が立ちはだかる。
6 
Copyright © 2014 NTT DATA Corporation 
メインサイト 
今回ご紹介する事例 
認証 
データ 
システム基幹部分 
災対サイト 
業務・集計 
データ 
小売店 
モバイル 
POS 
POS 
PC 
社内外の他システム 
モバイル向け 
Web/AP 
社内向け 
Web/AP 
集配信 
認証盤 
オンライン 
APサーバ 
オンライン 
帳票サーバ 
バッチ 
APサーバ 
モバイル向け 
Web/認証基盤 
オンライン 
APサバ 
オンライン 
帳票ーバ 
バッチ・取引 
APサバ 
業務・集計 
データ 
非同期 
レプリケーション 
PostgreSQL 
販売 店舗情報など 
売上 請求情報など 
PostgreSQL 
世界有数のエネルギー元売会社の情報系システム 
販売情報等をもとに、集計等をほぼリアルタイムで行う
7 
Copyright © 2014 NTT DATA Corporation 
特徴(2) OSSメイン & 拡張機能をフル活用 
PostgreSQLの拡張機能 
pg_statsinfo 
性能情報監視用 
pg_stat_statement 
実行SQLの性能情報監視用 
auto_explain 
スロークエリの実行計画捕捉用 
pg_hint_plan 
実行計画制御用 
pg_dbms_stats 
統計情報固定化用 
pg_bigm 
全文検索(2-gram)用 
pg_reorg 
オンラインテーブル再編成メンテ用 
pgfincore (試験時のみ) 
キャッシュヒット効率向上用 
ミドルウェア 
OS 
RHEL 6.2 
DBMS 
PostgreSQL9.2 
AP 
Tomcat 
およそ利用可能な拡張モジュールは全て取り入れた
8 
Copyright © 2014 NTT DATA Corporation 
迫りくる要件・トラブル 
無停止 
メンテを 
DRサイト 
用意! 
リスクと 対峙 
プラット フォーム 
トラブル 
守れ! 
大量SQL 
の性能
9 
Copyright © 2014 NTT DATA Corporation 
リスクと 
対峙 
無停止メンテを 
無停止 
メンテを 
DRサイト 
用意! 
プラット フォーム 
トラブル 
守れ! 
大量SQL 
の性能 
無停止 
メンテを 
ハードなメンテもオンライン で実施したい 
VACUUM FULL、REINDEX 
はどうしよう?
10 
Copyright © 2014 NTT DATA Corporation 
どうするメンテナンス設計!? 
~数GBの 
小規模テーブル 
数百GB以上の 
大規模テーブル 
システム性能への影響 小 
→auto vacuumに任せる 
システム性能への影響 
→メンテナンス枠にて手動 
で実施 
VACUUM 
24時間DBアクセス 
昼夜問わず大量バッチ 
何は無くともまずVACUUM設計 システムへの影響をミニマムに!
11 
Copyright © 2014 NTT DATA Corporation 
万が一に備えて 
そこで、外部モジュール!地味に、便利なコマンド! 
pg_reorg 
オンラインVACUUM FULL 
オンラインCLUSTER 
自作ツール 
CREATE INDEX CONCURRENTLY ALTER INDEX 
でスワップ! 
VACUUMができなかったら? インデックスが荒れてしまったら? 
排他ロック要らず!
12 
Copyright © 2014 NTT DATA Corporation 
無停止メンテの実現に向けて 
必要なメンテナンスと影響を見極める 
想定外の事態にも備えておく 
想定外のリソース枯渇を抑える。 
VACUUMをユーザの制御下に! 
いざという時にオンラインでメンテ! 
外部モジュール等でPostgreSQLをカバー
13 
Copyright © 2014 NTT DATA Corporation 
無停止 
メンテを 
リスクと 
対峙 
プラット フォーム 
トラブル 
守れ! 
大量SQL 
の性能 
DRサイト用意! 
DRサイト 
用意! 
DRサイト 用意! 
東日本、西日本間でDR 
PostgreSQLのDRはどのよう に実現する?
14 
Copyright © 2014 NTT DATA Corporation 
災害対策(Disaster Recovery)を検討せよ 
災害時にも止められない! 
→災害の被害を受けてもサービスを継続するために、遠隔地に メインサイトのコピー(災対サイトの構築)を作る! 
東日本(メインサイト) から 西日本(災対サイト) 
DR対象は(ほぼ)システム全体 
課題はPostgreSQLのメイン->災対へのデータ同期・・・ 
DBデータ 
西日本 
DBデータ 
東日本
15 
Copyright © 2014 NTT DATA Corporation 
やっぱり Streaming-Replication ! 
アーカイブログ 転送 
SR 
HWレベルでの 
レプリケーション 
決 
○高機能 (運用楽そう) 
△実績がない… 検証必要 
×運用が面倒 
△実績がない… 
検証必要 
×価格が高い 
運用 
導入 
○運用楽 ! 
頼れるサポート 
(Fujii Masao)
16 
Copyright © 2014 NTT DATA Corporation 
・・・でも本当に大丈夫か?SR 
データ 
アーカイブログ 
WAL 
圧縮して高速に転送 
解凍・リカバリ 
マスタ 
スタンバイ 
最大負荷量から必要な帯域をサイジング 
初期同期はNW経由・・でもOKそうだ 
・・ もしレプリケーションが追いつかなくなったら? 
データ 
WAL 
PostgreSQLが自動でアーカイブログからの 復旧に切り替え! 想定時間内にキャッチアップ!
17 
Copyright © 2014 NTT DATA Corporation 
すごかった!SR 
今のところレプリケーション起因の問題はなし 
PostgreSQLのSRは 
DR用途にも十分実用的! 
いいね!Streaming-Replication!
18 
Copyright © 2014 NTT DATA Corporation 
守れ!大量SQLの性能! 
無停止 
メンテを 
DRサイト 
用意! 
リスクと 
対峙 
プラット フォーム 
トラブル 
守れ! 
大量SQL 
の品質 
守れ! 
大量SQL 
の性能 
対象は数万本のSQL 
性能を守るのは 
数名のPG有識者
19 
Copyright © 2014 NTT DATA Corporation 
10Mに およぶ AP 
シビアな状況が我々を悩ませた… 
数万の SQL 
1000人 規模の 開発体制 
タイトな 
スケジュール 
ポスグレ 経験者 少な目 
SQL性能 どう守る? 
迅速な SQL チューン?
20 
Copyright © 2014 NTT DATA Corporation 
10Mに およぶ AP 
シビアな状況が我々を悩ませた… 
数万の SQL 
1000人 規模の 開発体制 
タイトな 
スケジュール 
ポスグレ 経験者 少な目 
SQL性能 どう守る? 
迅速な SQL チューン? 
 複雑すぎるSQLを書いてしまう → SQLのメンテナンス性、可読性低下 
 SQLは書いたけど、多くのSQLで性能問題が発生 → 期間内にすべての性能問題を解決できない 性能要件を満たさず、トラブルを引き起こすSQL(= 問題SQL)を 撲滅するために、我々が用意したものは…?
21 
Copyright © 2014 NTT DATA Corporation 
5つの関門を用意 
? 
1 
? 
2 
3 
? 
4 
? 
5 
SQLは1~5の関門を通り、 
一人前のSQL(=使用可能なSQL)になる 
!? 
?
22 
Copyright © 2014 NTT DATA Corporation 
1つ目 - SQLガイドライン 
PJが持っていたSQLガイドラインで、SQLのメンテナンス性を担保 
PostgreSQLのノウハウで、“PostgreSQL向けのSQL”に 
SQLガイドライン 
•1行当たり最大○○文字 
•コメントには/*…*/を使用する 
•ORDER BYには列名を記載する : 
SQLガイドライン 
PostgreSQLのノウハウ 
•NULLと文字列を連結すると 空文字になる 
•異なるデータ型で比較しないこと :
23 
Copyright © 2014 NTT DATA Corporation 
チェック項目 
結果 
テーブルのJOIN数チェック 
OK 
直積使用チェック 
OK 
同じテーブルを複数回見ているかチェック 
OK 
中間一致使用チェック 
中間一致はフルスキャンになり性能問 題を起こす可能性があります。 
pg_bigmインデックスを利用しましょう 
: 
: 
2つ目 - SQLチェックツール 
とはいえ、ヒューマンエラーはある(´Д`lli) 
“SQLガイドラインに従ったSQL“になっているか20以上の項目を自動で判別 
NGの場合は、チェック観点を表示 
■SQL静的チェック結果(イメージ図)
24 
Copyright © 2014 NTT DATA Corporation 
3つ目 - 実行計画チェックツール 
サービス開始後、SQLの性能問題が起きないために、 
“実行計画”をチェック 
<実行計画> 
Sort 
->Nested Loop (cost = … 
-> Index Scan (cost = … 
-> Seq Scan (cost = … 
: 
見積もりコストは高くなり すぎていない? 
インデックス使われてる? 
ただし! 
サービス開始後に生成される“リアル”な実行計画が必要!
25 
Copyright © 2014 NTT DATA Corporation 
4つ目 - HINT句でアジリティチューニング 
HINT句を使い直接実行計画を制御することで、 
アジリティなSQLチューニングを可能に 
○ HINT句を使用するメリット 
SQLを書き換えるよりも改修時間が短い! 
•実行計画を確認して、使用するインデックスやスキャン方法を変えるだけ 
SQLの実行結果の内容は変わらない! 
•HINTを付与するだけなので、SQLのリテスト不要 
/*+ IndexScan(hoge) */ 
SELECT * FROM hoge 
WHERE id = 9999;
26 
Copyright © 2014 NTT DATA Corporation 
大量SQLの性能を守れました 
SQLガイドライン 
1 
SQLチェックツール 
2 
3 
アジリティSQLチューニング 
4 
SQL書き換え 
5 
チェック済みの実行計画をサービス開始後も使用 
ドキュメントと ツールによる 性能問題防止 
遅いSQLの 
性能問題解決
27 
Copyright © 2014 NTT DATA Corporation 
リアルな実行計画?PGを騙す? 
実行計画チェックの実現、大量SQLの性能担保にあった 
2つの課題 
■ 2つの課題 
1.ダミーの統計情報を生成しPostgreSQLに設定する仕組みがない → PostgreSQLを騙す仕組み 
2.PostgreSQLを騙すことができても一時的な効果でしかない → PostgreSQLを騙し続ける仕組み
28 
Copyright © 2014 NTT DATA Corporation 
「統計情報カスタマイズ機能」作りました 
ユーザがテーブルに“任意の統計情報”を設定することが可能 
BIG!! 
大規模テーブルを 
スキャンする実行計画 
実行計画 
作成 
<統計情報> 
•20億件 
•500GB : 
空 
DBA 
統計情報 設定 
統計情報カスタマイズ 
設定する統計情報は 
「業務Tmへのヒアリングで見積もる」 
+ 
「一部は機械的に生成」
29 
Copyright © 2014 NTT DATA Corporation 
プランナ 
pg_dbms_stats 
PostgreSQL 
本来の 
統計情報 
実行計画 
“独自に設定された” 
“固定化された” 
統計情報 
生成 
pg_dbms_stats × 統計情報カスタマイズ機能 
統計情報カスタマイズ機能はpg_dbms_statsの 
追加機能として開発しました 
DBA 
・テーブル行数 
・テーブルサイズ 
・列幅 
・列の固有値 
・列のヒストグラム、MCV 
など 
■pg_dbms_stats × 統計情報カスタマイズ機能 
直接設定!
30 
Copyright © 2014 NTT DATA Corporation 
プラットフォームトラブル 
無停止 
メンテを 
DRサイト 
用意! 
リスクと 
対峙 
プラット フォーム 
トラブル 
守れ! 
大量SQL 
の性能 
プラット 
フォーム 
トラブル 
様々なトラブルが 発生! 
原因はPG? 
それとも…?
31 
Copyright © 2014 NTT DATA Corporation 
リソース使用量に異常発生! 
PostgreSQLの 
サーバログ確認 
APサーバの 
ログ確認 
DBサーバの 
カーネルログ 
確認 
他のリソース使用 
状況確認 
OK 
OK 
OK 
OK 
試験中にDBサーバに異変が(´Д`lli) 
CPUのsysが高騰している(常に80%以上) 
→PostgreSQLに問題はなさそうなので、 
Linuxの性能解析ツール(perf)で調べてみることに
32 
Copyright © 2014 NTT DATA Corporation 
カーネルサイドからのアプローチ 
perf topの状況を見ると、PostgreSQL以外に原因がありそう 
■perf top結果(一部抜粋) 
320878.00 29.0% SpinPause /usr/java/…/libjvm.so 
187781.00 17.0% _spin_lock_irq [kernel.kallsyms] 
143784.00 13.0% read_hpet [kernel.kallsyms] 
109362.00 9.9% ParallelTaskTerminator /usr/java/…/libjvm.so 
35295.00 3.2% native_write_msr_safe [kernel.kallsyms] 
33563.00 3.0% intel_idle 
25783.00 2.3% _spin_lock 
19725.00 1.8% _spin_lock_irqsave 
11848.00 1.1% find_busiest_group 
2835.00 0.3% compaction_alloc [kernel.kallsyms] 
2782.00 0.3% unmap_vmas [kernel.kallsyms] 
2603.00 0.2% rb_next 
•調べてみるとRHEL6.2にあったTransparent Huge Page(THP) のバグを踏んでいたよう 
•THPを無効にすることによりCPUのsys高騰が解消した 
もしかして、 
HugePage関連? 
Linuxカーネル 
技術者
33 
Copyright © 2014 NTT DATA Corporation 
再び異常発生!また!? 
試験中にDBサーバのレスポンスが急激に悪化 ヽ(ヽ゜ロ゜) 
vmstatを見るとswapが大量発生 
vmstatの結果(一部抜粋) 
procs -------------memory------------ --swap-- ---io--- 
r b swpd free buff cache si so bi 
00:13:39 22 6 1446440 23304532 108560 66972348 504 1374 15280 … 
00:13:44 11 6 1451608 23112444 108648 67165456 786 1281 19406 … 
00:13:49 10 6 1457416 23168188 108800 67330992 125 1184 18972 … 
00:13:54 14 6 1466048 22865104 108892 67517832 660 1794 22452 … 
00:13:59 28 5 1471792 22766112 108980 67579072 130 1203 14629 … 
00:14:04 11 3 1475952 22519940 109068 67685576 46 842 10079 … 
00:14:09 27 1 1482372 22400092 109180 67703616 182 1323 6529 …
34 
Copyright © 2014 NTT DATA Corporation 
DBサーバのメモリ使用量が多い事は、これまでも話題に上がっていた 
なので、まずはメモリ使用量を削減する対策を実施 
shared_buffersを小さくする 
work_memを小さくする 
コネクション数削減 
PostgreSQL以外のプロセスのメモリ使用量も確認・削減 
など 
メモリの使過ぎが原因かも!
35 
Copyright © 2014 NTT DATA Corporation 
え!?あれ!? 
メモリが空いているにも関わらず、swapが起きている! 
これには別の原因がありそう! 
vmstatの結果(一部抜粋) 
procs -------------memory------------ --swap-- ---io--- 
r b swpd free buff cache si so bi 
00:13:39 22 6 1446440 23304532 108560 66972348 504 1374 15280 … 
00:13:44 11 6 1451608 23112444 108648 67165456 786 1281 19406 … 
00:13:49 10 6 1457416 23168188 108800 67330992 125 1184 18972 … 
00:13:54 14 6 1466048 22865104 108892 67517832 660 1794 22452 … 
00:13:59 28 5 1471792 22766112 108980 67579072 130 1203 14629 … 
00:14:04 11 3 1475952 22519940 109068 67685576 46 842 10079 … 
00:14:09 27 1 1482372 22400092 109180 67703616 182 1323 6529 … 
最近コミュニティで、 
似たような事象が 
報告されていたような。 
PostgreSQL技術者
36 
Copyright © 2014 NTT DATA Corporation 
リモートのメモリが使えない!空いているのに! 
メモリ (32GB) 
メモリ (32GB) 
メモリ (32GB) 
メモリ (32GB) 
メモリを確保する際、設定状況によってはリモートのメモリを使 うことができず、ローカルメモリをスワップしてしまう 
CPU 
CPU 
CPU 
CPU 
メモリの余りが ない… 
メモリインタリーブを有効にすることで解決! 
ローカルメモリ 
リモートメモリ 
リモートメモリ 
リモートメモリ
37 
Copyright © 2014 NTT DATA Corporation 
解決に至るアクティビティ 
他の技術者との連携 
コミュニティの情報をキャッチアップ
38 
Copyright © 2014 NTT DATA Corporation 
リスクと対峙 
無停止 
メンテを 
DRサイト 
用意! 
ラスト 
リゾート 
プラット フォーム 
トラブル 
守れ! 大量SQL の性能 
リスクと 対峙 
新規機能盛りだくさん 
色々便利だけど・・・
39 
Copyright © 2014 NTT DATA Corporation 
チャレンジにはリスクが伴う 
例えば 
最終テストに差し掛かっていたある日、 
PostgreSQLがSEGVで落ちた。 
→ 再現も難しい・・ 
→ PostgreSQLに懸念の目が・・ 
新しい 機能! 
新しい 仕組み! 
+ 
= 
未知の 
トラブル 
PostgreSQL 大丈夫?・・・ 
周りの人
40 
Copyright © 2014 NTT DATA Corporation 
リスクに立ち向かう 
そこはOSS 
ソースコードとコアダンプがある。開発元と共に原因を特定。 
パッチを書いて、根本対処 
Program received signal SIGSEGV, Segmentation fault. 
pg_detoast_datum_packed (datum=0x2) at fmgr.c:2273 
2273 if (VARATT_IS_COMPRESSED(datum) || VARATT_IS_EXTERNAL(datum)) 
(gdb) bt 
#0 pg_detoast_datum_packed (datum=0x2) at fmgr.c:2273 
#1 0x00000000006d5c24 in bpchargt (fcinfo=0x7fffdc6b4f80) at varchar.c:801 
#2 0x000000000072127f in FunctionCall2Coll (flinfo=<value optimized out>, collation=<value optimized out>, 
arg1=<value optimized out>, arg2=<value optimized out>) at fmgr.c:1327 
#3 0x00000000006c972f in ineq_histogram_selectivity (root=0xfca988, vardata=0x7fffdc6b54a0, 
opproc=0x7fffdc6b5410, isgt=1 '¥001', constval=16558024, consttype=1042) at selfuncs.c:836 
・ 
・ 
・ 
(gdb) p *(Form_pg_statistic) ((char *) vardata->statsTuple->t_data + vardata->statsTuple- >t_data->t_hoff) 
$2 = {starelid = 900400380, staattnum = 12, stainherit = 0 '¥000', stanullfrac = 0, stawidth = 4, stadistinct = 2, stakind1 = 1, stakind2 = 3, 
stakind3 = 0, stakind4 = 0, stakind5 = 0, staop1 = 1752, staop2 = 1754, staop3 = 0, staop4 = 0, staop5 = 0} 
・ 
・ 
・ 
hash = hash_create("dbms_stats relation statistics cache", 
MAX_REL_CACHE, 
&ctl, HASH_ELEM | HASH_CONTEXT); 
・ 
・
41 
Copyright © 2014 NTT DATA Corporation 
リスクを制御する 
エンジニアの 力 
自力解決・サポート連携でリスクと対峙・軽減する → とても大事 
必要以上にリスクを背負わない → これも大事 
エンジニアの力が試されるところ 
有益な 
効果 
リスク
42 
Copyright © 2014 NTT DATA Corporation 
跳ね返した 
無停止 
メンテを 
DRサイト 
用意! 
リスクと 
対峙 
プラット フォーム 
トラブル 
守れ! 
大量SQL 
の性能
43 
Copyright © 2014 NTT DATA Corporation 
限界まで使い倒した後に見えたもの 
「ポテンシャルを引き出すこと」 PostgreSQLの魅力の一つは豊富な拡張機能 外部モジュールは最大限活用すべし 
「石橋を叩いて備えること」 問題はどうしても発生してしまう 捕捉手段と効果的な対策を持っておくことが大事 
「OSSであることを生かすこと」 機能がなくとも、開発でカバーできる 最後に求められるのは製品能力ではなく、現場能力 
ミッションクリティカルな環境で、強く感じた3か条
44 
Copyright © 2014 NTT DATA Corporation 
PostgreSQLとNTTデータ - この先に - 
パラレルクエリ カラムナストア 
BlockRange INdex 
双方向レプリケーション FDW+JOIN Pushdown パーティション機能強化 
監査強化 権限分掌 プロファイラ 
より強固に 
より高速に 
より広大に 
進化を続ける PostgreSQL を武器に 
さらに高いハードルに挑んでいる
45 
Copyright © 2014 NTT DATA Corporation 
PostgreSQLオリジナルの 機能・性能 
RDBMSとしての 機能・性能 
PostgreSQLとNTTデータ – 新領域へ - 
商用の代替ではない 
PostgreSQL オンリーの領域に挑んでいる 
? 
異種製品 + FDW 
JSON型 
Custom Plan API
46 
Copyright © 2014 NTT DATA Corporation 
おわりに 
PostgreSQL 
× 
NTT DATA はこれからも 
PostgreSQL & コミュニティ 
とともに歩んでいきます