自己紹介 名前 喜田紘介 ( きだこうすけ ) 所属 日本 PostgreSQLユーザ会広報 企画担当 株式会社アシストデータベース技術本部 近況 2014 年度より JPUGの理事になりました 仕事では 新規構築するシステムのDBをどうすべきか? というRDBMS 選択支援や 商用 DBからOSS

Similar documents
PostgreSQL SQL チューニング入門 ~ Explaining Explain より ~ 2012 年 11 月 30 日 株式会社アシスト 田中健一朗

はじめに コースの概要と目的 Oracle をより効率的に使用するための SQL のチューニング方法について説明します また 索引の有無 SQL の 記述方法がパフォーマンスにどのように影響するのかを実習を通して理解します 受講対象者 アプリケーション開発者 / データベース管理者の方 前提条件 S

pg_monz 監視アイテム一覧 :Template App PostgreSQL Template App PostgreSQL アプリケーション LLD アイテムトリガー監視タイプ更新間隔ヒストリトレンドデフォルト説明ステータス pg.get pgsql.get.pg.bgwriter Zabb

第 5 章 結合 結合のパフォーマンスに影響を与える結合の種類と 表の結合順序について内部動作を交えて 説明します 1. 結合処理のチューニング概要 2. 結合の種類 3. 結合順序 4. 結合処理のチューニングポイント 5. 結合関連のヒント

今さら聞けない!? Oracle入門 ~後編~

スライド 1

今さら聞けない!? Oracle入門 ~前編~

第 7 章 ユーザー データ用表領域の管理 この章では 表や索引を格納するユーザー データ用表領域の作成や 作成後のメンテナンスに ついて解説します 1. ユーザー データ用表領域の管理概要 2. ユーザー データ用表領域作成時の考慮事項 3. ユーザー データ用表領域の作成 4. ユーザー データ

日本 PostgreSQL ユーザ会第 28 回しくみ + アプリケーション勉強会 Zabbix を使って PostgreSQL を監視してみよう 2014 年 2 月 1 日 TIS 株式会社中西剛紀 (Yoshinori Nakanishi)

はじめに コース概要と目的 Oracle データベースのパフォーマンス問題の分析方法 解決方法を説明します 受講対象者 データベース管理者の方を対象としています 前提条件 データベース アーキテクチャ データベース マネジメント を受講された方 もしくは同等の知識 をお持ちの方 テキスト内の記述につ

スライド 1

PostgreSQL 9.4 評価検証報告 SRA OSS, Inc. 日本支社高塚遙 :55 ~ 16:30 PostgreSQL 9.4 最新情報セミナー Copyright 2014 SRA OSS, Inc. Japan All rights reserved. 1

PGECons技術ドキュメントテンプレート Ver.3

ソフト活用事例③自動Rawデータ管理システム

スライド 1

PostgreSQL Plus 管理者ガイド

MaxGauge_診断分析プロセス

PostgreSQL 9.3パーティションの効果検証

PostgreSQL10 を導入! 大規模データ分析事例からみる DWH としての PostgreSQL 活用のポイント 2017/12/5 株式会社 NTT データ 2017 NTT DATA

ShikumiBunkakai_2011_10_29

第 3 章 メディア障害とバックアップ リカバリ この章では メディア障害の発生に備えたバックアップ方法と 障害時の基本的なリカバリ方法につい て説明します 1. メディア リカバリ概要 2. ファイルの多重化 3. アーカイブ モードの設定 4. バックアップ概要 5. 一貫性バックアップ ( オ

データセンターの効率的な資源活用のためのデータ収集・照会システムの設計

メール全文検索アプリケーション Sylph-Searcher のご紹介 SRA OSS, Inc. 日本支社技術部チーフエンジニア Sylpheed 開発者 山本博之 Copyright 2007 SRA OSS, Inc. Japan All right

PowerPoint プレゼンテーション

Microsoft Word - nvsi_050090jp_oracle10g_vlm.doc

スライド 1

データベース暗号化ツール「D’Amo」性能検証

プレポスト【問題】

OracleDBA(パフォーマンスチューニング(SQL編) - コピー

第6回 2014/04/15 OSSユーザーのための勉強会 PostgreSQLの優位性 株式会社アシスト データベース技術本部 喜田 紘介 Copyright 2014 K.K.Ashisuto All Rights Reserved. 1

スライド 1

PowerPoint プレゼンテーション

内容 Visual Studio サーバーエクスプローラで学ぶ SQL とデータベース操作... 1 サーバーエクスプローラ... 4 データ接続... 4 データベース操作のサブメニューコンテキスト... 5 データベースのプロパティ... 6 SQL Server... 6 Microsoft

Microsoft Word - CBSNet-It連携ガイドver8.2.doc

PowerPoint プレゼンテーション

Oracle Un お問合せ : Oracle Data Integrator 11g: データ統合設定と管理 期間 ( 標準日数 ):5 コースの概要 Oracle Data Integratorは すべてのデータ統合要件 ( 大量の高パフォーマンス バッチ ローブンの統合プロセスおよ

HDC-EDI Manager Ver レベルアップ詳細情報 < 製品一覧 > 製品名バージョン HDC-EDI Manager < 対応 JavaVM> Java 2 Software Development Kit, Standard Edition 1.4 Java 2

Microsoft Word - nvsi_050110jp_netvault_vtl_on_dothill_sannetII.doc

Oracle 入門 ~ 研修受講後のスキルアップサポート ~ 対応バージョン :Oracle 10gR1 ~ 12cR1 本資料は アシスト Oracle 研修をご受講いただいたお客様からのご質問や 研修ではご案内できなかった情報などを FAQ にまとめたものです 研修受講後のスキルアップの一助とし

OWI(Oracle Wait Interface)の概要

PHP 開発ツール Zend Studio PHP アフ リケーションサーハ ー Zend Server OSC Tokyo/Spring /02/28 株式会社イグアスソリューション事業部

BOM for Windows Ver

PowerGres Plus V9.1 のご紹介 PostgreSQL をベースに信頼性とセキュリティをプラス SRA OSS,Inc. 日本支社マーケティング部 2015/10 Copyright 2015 SRA OSS, Inc. Japan All rights reserved. 1

使用する前に

Oracle Data Pumpのパラレル機能

アジェンダ Oracle サーバの見える化はなぜ必要? WebSAMApplicationNavigator で簡単 安心に監視を実現 Oracle 監視の導入コスト 2 NEC Corporation 2009

1. はじめに (1) 本書の位置づけ 本書ではベジフルネット Ver4 の導入に関連した次の事項について記載する ベジフルネット Ver4 で改善された機能について 新機能の操作に関する概要説明 ベジフルネット Ver4 プログラムのインストールについて Ver4 のインストール手順についての説明

ERDAS IMAGINE における処理速度の向上 株式会社ベストシステムズ PASCO CORPORATION 2015

会社紹介 関電システムソリュションズ株式会社 設立 2004年10月1日 関電情報システム株式会社 1967年4月設立 と株式会社関西テレコムテクノロジ 1986年5月設立 は2004年10月1日に合併し関電システムソリュションズ株式会社となりました 資本金 売上高 株主構成 従業員数 9,000万

Enterprise Cloud + 紹介資料

インテル(R) Visual Fortran コンパイラ 10.0

改版履歴 版数 改版日付 改版内容 /03/14 新規作成 2013/03まで製品サイトで公開していた WebSAM DeploymentManager Ver6.1 SQL Server 2012 製品版のデータベース構築手順書 ( 第 1 版 ) を本 書に統合しました 2

2010年4月~6月 協業実績報告

McAfee Application Control ご紹介

Oracle Database 10g Release 2を使用したデータベース・パフォーマンス

HULFT8 for Windows/UNIX/Linux/zLinux の機能で発生する不具合について

スライド 1

要求受付機能 管理番号内容対象バージョン 314 トレースログに重複してメッセージが出力される場合がある 6.3.2~ 大量のファイルトリガ情報が登録されている状態でファイルトリガプロセスを起動するとファイルトリガプロセスが停止する場合がある 7.2.0~7.3.1 ユーティリティ

自 己 日 高 用 自 言 方 2

変更履歴 項番版数内容更新日 版新規作成 2013 年 11 月 18 日 1

TALON Tips < カレンダー ( 月別 ) の画面を表示する > 株式会社 HOIPOI 第 1.1 版 p. 1

Microsoft PowerPoint pptx

BOM for Windows Ver.6.0 リリースノート

~~~~~~~~~~~~~~~~~~ wait Call CPU time 1, latch: library cache 7, latch: library cache lock 4, job scheduler co

Slide 1

Linkexpress トラブル初期調査資料 採取コマンド使用手引書

第 3 章代表的なチューニングポイント 3 Q. ストアド プロシージャを使用した SQL 共有率の向上 A. ストアド プロシージャを使用した場合 同じストアド プロシージャを実行する複数のユーザーが 同じ共有 PL/SQL 領域を使用します また ストアド プロシージャは解析済みで格納されている

PostgreSQLによる データベースサーバ構築技法

Maser - User Operation Manual

Exam : 1z0-882 日本語 (JPN) Title : Oracle Certified Professional, MySQL 5.6 Developer Vendor : Oracle Version : DEMO 1 / 4 Get Latest & Valid 1z0-882-JP

Transcription:

第 4 回中国地方 DB 勉強会 2014/07/13 まずやっとく PostgreSQL のチューニング 日本 PostgeSQL ユーザ会喜田紘介 Copyright 2014 K.K.Ashisuto All Rights Reserved. 1

自己紹介 名前 喜田紘介 ( きだこうすけ ) 所属 日本 PostgreSQLユーザ会広報 企画担当 株式会社アシストデータベース技術本部 近況 2014 年度より JPUGの理事になりました 仕事では 新規構築するシステムのDBをどうすべきか? というRDBMS 選択支援や 商用 DBからOSSへの移行の前段階として オブジェクトやSQL 差異のレクチャーや データベースの診断 評価を行う移行アセスメント支援を主に担当しています この夏やりたいこと PG9.4の検証 マラソンとトライアスロンの練習 歌とギターの練習 ( 初心者 ) Copyright 2014 K.K.Ashisuto All Rights Reserved. 2

本日お話すること RDBMSの基本構造に沿いながら マニュアルレベルでPostgreSQLのチューニングポイントを解説 PostgreSQLでの実行計画の見方 SQLチューニングの方法を解説 最新バージョン9.4betaの話を少し SQL Copyright 2014 K.K.Ashisuto All Rights Reserved. 3

DB チューニングと SQL チューニング DB チューニング 構築段階からある程度の設定が可能で 大まかな設定でも効果が得られる 設定方法 : パラメータチューニングが主評価指標 :OS 情報 (CPU I/Oなど ) ベンチマークによるTPS 測定 SQL チューニング 実行時間が長いSQLを対象に 最適な実行計画をとることによる高速化を目指す 正しく行う事で非常に高い効果が期待できる 設定方法 :SQL 修正 統計情報の調整評価指標 : 実行計画の確認該当処理のTAT 測定 SQL TPS 単位時間あたりに実行されたトランザクション数 トランザクションの内容はベンチマークによって様々である 設定変更前後で同じベンチマークを実行したTPSを評価指標とするなど データベース性能を計測する上でしばしば用いる TAT システムに処理要求を送ってから 結果の出力が終了するまでの時間 実行時間が長いSQLではTATを目標時間内に抑えるようチューニングを実施する ( 参考 :IT 用語辞典 e-words) Copyright 2014 K.K.Ashisuto All Rights Reserved. 4

データベースのチューニングポイント Copyright 2014 K.K.Ashisuto All Rights Reserved. 5

RDBMS のアーキテクチャ PostgreSQL データベースのアーキテクチャからチューニングポイントを考える メモリ - キャッシュヒット率 - WAL 生成タイミング - ソート等の一時領域 SQL 処理における PostgreSQL の動作 クライアントマシン Web サーバーなど 共有バッファ 共有メモリ WAL バッファ ディスク I/O - チェックポイント間隔の調整 バックエンドプロセス - オブジェクトのメンテナンス work_mem maintenance_work_mem writer wal writer プロセス データベース WAL ファイル - VACUUM 関連 - writerプロセス 処理毎に行う動作効率化する動作 Copyright 2014 K.K.Ashisuto All Rights Reserved. 6

代表的なチューニングポイント ( メモリ ) オンキャッシュで効率よく処理できる状態を目指す 各メモリ領域の割り当てが不適切だと ディスク I/O が頻発 SQL 処理における PostgreSQL の動作 最適化は難しいが 大まかな設定でも 大きな効果が得られる 考えることは 3 つ クライアントマシン Web サーバーなど 共有バッファ 共有メモリ WAL バッファ キャッシュヒット率が適切か WAL 生成のタイミング バックエンドプロセス ( ただし最近は自動調整で問題なし ) ディスクソートの有無を把握する (SQL チューニング寄り ) work_mem maintenance_work_mem writer データベース wal writer WAL ファイル Copyright 2014 K.K.Ashisuto All Rights Reserved. 7

代表的なチューニングポイント ( ディスク I/O) 性能を引き出す上で一番の要となるポイント チェックポイントによる性能影響は 非常に大きい SQL 処理における PostgreSQL の動作 オブジェクトに対しての適切な メンテナンスも大事 チェックポイント間隔を適切にする クライアントマシン Web サーバーなど 共有バッファ 共有メモリ WAL バッファ WALとの関係を知っておくことチェックポイント間隔を調整する バックエンドプロセス work_mem maintenance_work_mem writer wal writer オブジェクトのメンテナンス ( 本日は省略 ) データベース WAL ファイル テーブル ( ページ ) の余裕率を検討テーブルの再作成インデックスの再作成 tables Copyright 2014 K.K.Ashisuto All Rights Reserved. 8

代表的なチューニングポイント ( プロセス ) 最適を求める場合 各プロセスの動作を細かく調整 ( 製品固有のことが多い ) PostgreSQL 固有の VACUUM 処理 writer の動作も調整可能 SQL 処理における PostgreSQL の動作 VACUUM 処理の最適化 共有メモリ 自動 VACUUMがきちんと動くこと VACUUM FULLは不要 クライアントマシン Web サーバーなど 共有バッファ WAL バッファ VACUUM/ANALYZE の閾値 writer の動作 ( 本日は省略 ) バックエンドプロセス ダーティバッファの書き出しは常時 work_mem maintenance_work_mem writer wal writer ( ただし ここまで調整することは稀 ) vacuum データベース WAL ファイル vacuum vacuum Copyright 2014 K.K.Ashisuto All Rights Reserved. 9

設定方法と確認方法の基本 DB チューニングの基本はパラメータ設定 データベースクラスタ ($PGDATA) 配下の postgresql.conf を調整 反映されるタイミングを知っておく パラメータ毎に DB の再起動 / 設定のリロード / 即時など 反映されるタイミングが異なる SQL で確認可能 ( 公式のドキュメントでパラメータ一覧が存在しない ) /* pg_settings ビューを参照 */ postgres=# \x postgres=# SELECT name,setting,unit,context FROM pg_settings; SELECT distinct context FROM pg_settings; internal 変更不可( 構築時設定確認用 ) postmaster サーバ起動時 sighup 設定ファイルの再読み込み backend セッション確立時に決定 superuser スーパユーザ権限で動的変更可能 user 一般ユーザで動的変更可能 現状を確認するには統計情報ビューを参照 pg_stats* や pg_statsio* を参照することで 現状が適切かどうかが判断できる 場合によっては 動作させてログを見ることも必要 Copyright 2014 K.K.Ashisuto All Rights Reserved. 10

DB チューニングの実践 Copyright 2014 K.K.Ashisuto All Rights Reserved. 11

キャッシュヒット率を高く保つ アクセスデータ範囲を shared_buffers に収める postgresql.conf の shared_buffers は物理メモリの25%-40% 程度とする OSのファイルキャッシュも使うため 厳密な調整でなくても良い 物理メモリが数十 GBを超える場合や Windowsの場合などに注意が必要 キャッシュヒット率の確認 SQL で累計のキャッシュヒット率を確認する /* データベース単位でキャッシュヒット率を確認 */ postgres=# SELECT datname,round(blks_hit*100/(blks_hit+blks_read), 2) AS cache_hit_ratio FROM pg_stat_database WHERE blks_read > 0; datname cache_hit_ratio -----------+----------------- template1 99.00 postgres 99.00 /* テーブル単位でキャッシュヒット率を確認 */ postgres=# SELECT relname, ROUND(heap_blks_hit*100/(heap_blks_hit+heap_blks_read), 2) AS cache_hit_ratio FROM pg_statio_user_tables WHERE heap_blks_read > 0 ORDER BY cache_hit_ratio; relname cache_hit_ratio ------------+----------------- emp 99.00 dept 99.00 キャッシュヒット率を高めるための工夫 事前に表全体 ( またはWHERE 句で絞って )SELECTし ウォームアップ 索引やパーティションで必要な範囲のみにアクセスする Copyright 2014 K.K.Ashisuto All Rights Reserved. 12

WAL 生成のタイミングを知る WAL 生成のタイミングを知り wal_buffers パラメータを調整 postgresql.conf の wal_buffers は最近のバージョンでは自動調整される 旧バージョンでは デフォルトのWALファイルサイズの16MB 以上にしてみる ( 推奨 32MB) WALがファイルに書かれるタイミングは以下 トランザクションがコミットされたとき WALバッファが一杯になったとき これを減らしつつ効率的なのは wal_buffers > WALセグメント ( ファイル ) サイズ wal_writer_delay パラメータに指定された時間経過 ( デフォルト200ms) 1 トランザクションでの更新が多い場合 コミット以外のタイミングでの書き込み発生に注意 同時接続数が多い場合も コミット前に wal_buffers を超える可能性が高い 明確な確認方法は特に用意されていない WAL 生成量はファイル作成時刻などからある程度推測可能 しかし WALがいつ書かれたかは確認する手段がない Postgres Plusは待機イベントの確認が可能で WAL 生成が起因する場合は調整を検討 Copyright 2014 K.K.Ashisuto All Rights Reserved. 13

ディスクソートの発生を避ける メモリ上でソートが行えるよう work_mem パラメータを調整 work_mem はセッションごとに確保される領域であるため SET コマンドで処理に応じて 調整するのが望ましい postgres=# SET work_mem TO '256MB'; postgres=# SELECT ORDER BY ; /* バッチ処理などで大量のソートが発生する場合 SET コマンドでパラメータの変更を行う */ 適切な work_mem が割り当てられていると 実行計画の決定時により良いプランを選択 ソート処理の詳細を確認 trace_sort パラメータを有効にし ログ出力から詳細を確認 LOG: internal sort ended, 330 KB used: CPU 0.00s/0.09u sec elapsed 0.15 sec STATEMENT: SELECT l.logno,e.empname,l.status FROM log_master l,emp e WHERE e.empno=l.empno; LOG: external sort ended, 269 disk blocks used: CPU 0.03s/0.20u sec elapsed 0.30 sec STATEMENT: SELECT l.logno,e.empname,l.status FROM log_master l,emp e WHERE e.empno=l.empno; メモリ上でソートができている ディスクソートが発生している EXPLAIN ANALYZE コマンドで確認 -> Sort (cost=15016.32..15266.32 rows=100000 width=11) (actual time=128.817.. ( 略 ) Sort Key: l.empno Sort Method: external sort Disk: 2152kB -> Sort (cost=163.66..168.66 rows=2000 width=50) (actual time=1.600..10.439 rows=99951 loops=1) Sort Key: e.empno Sort Method: quicksort Memory: 330kB ディスクソートが発生している メモリ上でソートができている Copyright 2014 K.K.Ashisuto All Rights Reserved. 14

チェックポイント間隔の調整 チェックポイントの目的と目指すべき姿 チェックポイントでは キャッシュされたデータが漏れなくデータファイルに書き出される クラッシュリカバリ時 チェックポイント以降のWALを適用すれば最新に戻せる 大量のI/Oが発生するため パフォーマンスの観点ではなるべく避けたい パフォーマンス観点での理想は 絶対クラッシュしないからチェックポイントもいらない システム 現実的には クラッシュリカバリ時に許容できる時間をもとにチェックポイント間隔を調整 クラッシュリカバリ 共有バッファ WAL バッファ 共有バッファ WAL バッファ 共有バッファ WAL バッファ 障害発生 writer wal writer writer wal writer チェックポイント データベース WAL ファイル データベース WAL ファイル データベース WAL ファイル Copyright 2014 K.K.Ashisuto All Rights Reserved. 15

チェックポイント間隔の調整 チェックポイント間隔をパラメータで指定 checkpoint_segments を 16 個以上としてみる checkpoint_segments は WAL ファイルが何個溜まったらチェックポイントするか WAL ファイル 1 つで 16MB 16 個 = 256MB 毎にチェックポイント checkpoint_timeout を 30 分以上としてみる checkpoint_timeout は checkpoint_segments の閾値に達しなくてもチェックポイントする時間 更新が少ない時間帯でも 30 分に一回はチェックポイントしておく チェックポイントが行われるタイミングは以下 checkpoint_segments パラメータで指定した数の WAL ファイルが生成されたとき checkpoint_timeout パラメータで指定した時間が経過したとき CHECKPOINT コマンドで明示的に実行 データベースの正常停止 その他のチェックポイント関連パラメータ checkpoint_complation_target で チェックポイントを完了するまでの目標時間を設定 checkpoint_timeout に対する割合で指定する 0.9 程度に設定し ゆっくりチェックポイントを実施させると I/O 量の安定化が期待できる Copyright 2014 K.K.Ashisuto All Rights Reserved. 16

チェックポイント間隔の調整 実際のチェックポイント頻度を調査する SQL でチェックポイントの回数を確認 postgres=# \x postgres=# SELECT * FROM pg_stat_bgwriter; -[ RECORD 1 ]------+-------- checkpoints_timed 4120 checkpoints_req 0 buffers_checkpoint 229843 buffers_clean 57368 maxwritten_clean 0 buffers_backend 2334322 buffers_alloc 1145231 timeout でチェックポイントした回数更新量の閾を超えチェックポイントした回数 /* checkpoint_req の値が大きい場合 更新が多く チェックポイントが多発していることが考えられる */ ログにチェックポイント情報を出力する log_checkpoint サーバログにチェックポイントの処理の詳細を記録 checkpoint_warning 指定時間より短い間隔でチェックポイント処理が事項された場合にログに警告を出力 Copyright 2014 K.K.Ashisuto All Rights Reserved. 17

VACUUM 処理 VACUUM に対する考え方 自動 VACUUM 推し VACUUMが適切に行われることで得られるメリット 更新時に同一ページ内に空きがあることでHOTが効く 加えて HOTによる領域回収ができるため 次回 VACUUM 負荷が軽減される テーブルファイルの肥大化を防ぎ 検索時のI/O 量を適正にする ( 悪名高い )VACUUM FULL 注意点 平常運用時に使う必要はない ローカルディスクに余裕があるなら テーブル再作成のメンテナンスとして ANALYZEを別途実施しなければならない 自動 VACUUMによる性能影響は目安として10%~ 程度ある VACUUMの効果を得るには 必要なテーブルが正しくVACUUMされていること 特に 同一インスタンスで複数 DBが稼働している場合 pg_stat_all_tablesのn_tup_hot_upd(hotによる更新行数 多いほど良い ) や n_dead_tup(vacuum 対象の行数 ずっと多いのはダメ ) はチェックすること Copyright 2014 K.K.Ashisuto All Rights Reserved. 18

pg_statsinfo を使ってみよう SQL Copyright 2014 K.K.Ashisuto All Rights Reserved. 19

pg_statsinfo とは pg_statsinfo で 前述の確認項目を含むほぼすべての統計情報を収集 スナップショット型で取得し リポジトリに格納 Oracle の Statspack / AWR のような感覚で利用可能 平常時の処理傾向の把握と 性能劣化の予兆認識に活用できる 1つのリポジトリに対して 複数 DBインスタンスを登録可能 pg_stats_reporter との組み合わせでブラウザでの参照も可能 pg_statsinfoコマンドで各種操作を行う statsinfod の起動 / 停止 スナップショットの一覧表示 簡易レポート生成など リポジトリ DB にスナップショットを格納 OS 情報 httpd と連動してレポート生成 表示 pg_stats_reporter 監視対象 DB の実行時統計 ログ OS 情報の収集 pg_statsinfod 監視対象 DB クラスタ兼リポジトリ DB logger 深刻度によるフィルタリングおよびアラート出力 log.txt log.csv Copyright 2014 K.K.Ashisuto All Rights Reserved. 20

pg_statsinfo を使ってみる インストール $ cd <postgresのcontrib 配下 >/ $ tar zxvf pg_statsinfo-2.5.0.tar.gz $ cd pg_statsinfo-2.5.0 $ make USE_PGXS=1 $ su # make USE_PGXS=1 install PostgreSQL の configure 時に --with-libxml を追加しておくこと (rpm なら OK) pg_statsinfo の設定は postgresql.conf に追記する shared_preload_libraries = 'pg_stat_statements,pg_statsinfo' pg_statsinfo.snapshot_interval = 3600 # スナップショットの取得間隔 pg_statsinfo.enable_maintenance = 'on' # 自動メンテナンス設定 pg_statsinfo.maintenance_time = '00:02:00' # 自動メンテナンス実行時刻設定 pg_statsinfo.repository_keepday = 7 # スナップショットの保持期間設定 log_filename = 'postgresql-%y-%m-%d_%h%m%s.log' # ログファイル名を指定する log_min_messages = 'log' # ログへ出力するメッセージレベル pg_statsinfo.syslog_min_messages = 'error' # syslogに出力するログレベルを指定する pg_statsinfo.textlog_line_prefix = '%t %p %c-%l %x %q(%u, %d, %r, %a) ' # pg_statsinfoがテキストログに出力する際 各行の先頭に追加される書式を指定る # log_line_prefixと同じ形式で指定する pg_statsinfo.syslog_line_prefix = '%t %p %c-%l %x %q(%u, %d, %r, %a) ' # pg_statsinfoがsyslog 経由でログを出力する際 各行の先頭に追加される書式を指定する pg_statsinfo.stat_statements_max = 30 Copyright 2014 K.K.Ashisuto All Rights Reserved. 21

簡易レポート pg_statsinfo で 上述の DB チューニングの確認ポイントが全て確認可能 レポート項目 Summary 内容 環境 ( ホスト名 バージョン ) スナップショット ID( 開始と終了 ) など DatabaseStatistics データベース単位の統計情報 ( キャッシュヒット率 トランザクション数など ) InstanceActivity OSResourceUsage DiskUsage LongTransactions Lock Conflict WAL 出力量やセッション数 CPU(user/system/idle/iowait) の遷移および負荷状況 (Load average) デバイス毎のI/O 遷移ロングトランザクション一定時間ロック状態が継続したSQL NotableTables 注意すべきテーブル ( 更新が多い / アクセスが多い / 断片化 ) CheckpointActivity AutovacuumActivity 原因別のチェックポイント回数や処理時間 自動 VACUUM の発生状況 QueryActivity SQL や関数の情報 ( 所要時間 / 実行回数など ) 簡易レポートの生成 $ pg_statsinfo -r All -U postgres -d pgdb1 /* -Uや-dでリポジトリDBを指定 */ /* -rでレポートの対象とするスナップショットを指定 */ Copyright 2014 K.K.Ashisuto All Rights Reserved. 22

pg_statsinfo のレポート出力例 SQL ではリアルタイムな値のみ取得できていた スナップショットを保存し その差分でレポートを 生成するため 有用な情報が得られる /** WAL Statistics **/ ----------------------------------- WAL Write Total : 1487.714 MiB WAL Write Speed : 3.759 MiB/s ---------------------------------------- /* Database Statistics */ ---------------------------------------- Database Name : pgdb1 Database Size : 2997 MiB Database Size Increase : 0 MiB Commit/s : 7489.429 Rollback/s : 0.000 Cache Hit Ratio : 88.200 % Block Read/s (disk+cache) : 39085.771 キャッシュヒット率の確認 Block Read/s (disk) : 4611.903 Rows Read/s : 90508.565 WAL 生成量 Temporary Files : 2 チェックポイント間隔の指標 Temporary Bytes : 763 MiB Deadlocks : 0 Block Read Time : 0.000 ms Block Write Time : 0.000 ms ----------------------------------- 更新量の多いテーブル /* Notable Tables */ DateTime Location Segment File Write Size VACUUM Write Size/s 間隔の指標 ---------------------------------------- ------------------------------------------------------------------------------------------------ /** Heavily Updated Tables **/ 2014-07-08 21:33 1/6257DC90 000000010000000100000062 1.541 MiB 0.082 MiB ----------------------------------- 2014-07-08 21:33 1/626575F8 000000010000000100000062 0.850 MiB 0.731 MiB Database Schema Table INSERT Rows UPDATE Rows DELETE Rows Total Rows : -------------------------------------------------------------------------------------------------------------- pgdb1 public pgbench_accounts 20000000 0 0 20000000 簡易レポートの生成 Copyright 2014 K.K.Ashisuto All Rights Reserved. 23

SQL チューニングの基本 SQL Copyright 2014 K.K.Ashisuto All Rights Reserved. 24

SQL チューニングの考え方 SQL チューニングとは 実行時間が長いSQLを対象に レスポンス要件を満たすように改善する 重い処理が無くなったことで全体のパフォーマンスが向上することもあれば 新たに作成した索引が影響して 他の処理を遅くすることもある SQL チューニングのステップ どのSQLをどこまで早くするか 現状を確認する どうやって早くするか 効果を測定する SQL 1 SQL 5 SQL 2 SQL 4 SQL 3 所要時間 対象の決定目標時間の決定 table access SQL 1 EXPLAIN join SQL 1 EXPLAIN 所要時間 SQL 1 SQL 5 SQL 2 SQL 4 SQL 3 Copyright 2014 K.K.Ashisuto All Rights Reserved. 25

チューニング対象を決定 統計情報から実行時間の長い SQL を確認する pg_stat_activity SQL 1 SQL 5 SQL 2 SQL 4 SQL 3 所要時間 対象の決定目標時間の決定 pg_stat_statements(contrib ツール ) pg_statsinfo と連携してレポート可能 エラーログへの出力から実行時間の長い SQL を確認する postgresql.conf の log_min_duration_statement パラメータ パラメータで指定した時間以上を要する SQL をサーバログに出力 auto_explain(contrib ツール ) 実行に一定時間を要した SQL 文と実行計画をサーバログに出力 キャッシュヒット率やアクセスブロック数を基準にすることもある 1 行を対象にした検索なのに 大量のブロックにアクセスしている場合など pg_stat_all_tables/pg_statio_all_tables Copyright 2014 K.K.Ashisuto All Rights Reserved. 26

実行計画の確認 EXPLAIN EXPLAIN EXPLAIN または EXPLAIN ANALYZE で SQL の実行計画を取得 postgres=# EXPLAIN SELECT b.logno,e.empname,b.log_text FROM log_master m,log_body b,emp e WHERE b.logno=m.logno AND e.empno=m.empno AND m.status = 'WI'; 計画ツリー QUERY PLAN ------------------------------------------------------------------------------------------ Hash Join (cost=79.00..1754.21 rows=10000 width=66) Hash Cond: (m.empno = e.empno) -> Merge Join (cost=0.00..1525.21 rows=10000 width=24) Merge Cond: (m.logno = b.logno) -> Index Scan using log_master_pkey on log_master m (cost=0.00..6907.33 rows=31373 width=8) Filter: (status = 'WI'::bpchar) -> Index Scan using log_body_pkey on log_body b (cost=0.00..707.27 rows=10000 width=20) -> Hash (cost=54.00..54.00 rows=2000 width=50) -> Seq Scan on emp e (cost=0.00..54.00 rows=2000 width=50) 計画タイプ ( プラン ) コストの推定値推定行数や列幅 計画ツリーの階層が深いものがから順に実行されている 通常 各テーブルへのアクセスから始まる EXPLAIN ANALYZE の場合 実際に SQL が実行される 所要時間 取得した行数 ループ回数が記録される SQL が実行されてしまうため 更新処理の場合は必ず BEGIN でトランザクションを開始してから実施する Copyright 2014 K.K.Ashisuto All Rights Reserved. 27

PostgreSQL の計画タイプ 計画タイプを確認し 意図した方法が選択されているかを調査 join table access 計画タイプ Seq Scan Index Scan 内容 全表スキャン : 表内の大量の行にアクセスする場合に有効 索引スキャン : 表内のごく一部の行にのみアクセスする場合に有効 Index Only Scan 索引のリーフブロックのみにアクセスするスキャン ( 表へのアクセスをスキップ ) Bitmap Index Scan Bitmap Heap Scan Function Scan Nested Loop Merge Join Hash Join ビットマップ使用した索引スキャンビットマップスキャンで表にアクセスファンクションの実行結果に対するスキャンネステッドループ結合 : 片方の表のうち ごく少数の結果を条件として他方の表からデータを取得マージ結合 : 両方の表の行数が多い場合 ソートし 上から順に値を比較して該当行を抽出ハッシュ結合 : 表の行数に差があり かつ小さい表の重複が少ない場合に有効 必要な Index が作成されているか 意図したプランが選択される SQL を書いているか Copyright 2014 K.K.Ashisuto All Rights Reserved. 28

対策 : 索引が使われないパターン 演算 / 関数処理 データ型の暗黙変換 NOT 条件など SQLの書き方で索引が使われないパターンを紹介 Copyright 2014 K.K.Ashisuto All Rights Reserved. 29

対策 : 索引を活用してソートを省略 ソート 集計など 索引があることで表へのアクセスをスキップして処理を行えるパターンを紹介 Copyright 2014 K.K.Ashisuto All Rights Reserved. 30

対策 : 結合 PostgreSQL は結合のプランが複数あり 複雑な結合にも強い それでも意図した結合にならない場合 enable_*join パラメータでプランの候補を検討 postgres=# SET enable_hashjoin TO off; postgres=# SELECT FROM A JOIN B ON ; /* 意図した結合方式を使わせたい場合 セッション内で SET コマンドでパラメータの変更を行う */ デフォルトでは FORM 句に8 個のテーブル JOINも8テーブルまでプランを評価例えば テーブルA,B,Cにアクセスするクエリで A,Bへのアクセスは 事前に定義したビューを使っている A,Bを結合したビューとしてデータをとってきたあと Cと突き合わせて結果を得るか ビューの元はテーブルA,Bなので ABCを柔軟に組み合わせ効率の良いプランを探すかというプランナの戦略を指定 ( 本例はテーブル3 個だが デフォルトでは8 個を超えた時点でプランナがあまり考えなくなる ) postgres=# SET from_collapse_limit TO 16; postgres=# SET join_collapse_limit TO 16; postgres=# SELECT FROM A JOIN B ON ; /* プラン生成に時間がかかるが 効率的な結合を行うようになり 実行時間が劇的に改善される可能性がある */ Copyright 2014 K.K.Ashisuto All Rights Reserved. 31

高速化を期待されるが注意が必要なもの Materiarized View PostgreSQL9.3でマテリアライズド ビューが使用可能となった 実体をもったビューで 結合や集計結果を保存しておくことで高速にアクセスできる ただし 現在は以下の制約があり 今後の機能向上に期待 リフレッシュ時に元のテーブルに対して非常に強いロックを取得 自動リフレッシュや差分 ( 高速 ) リフレッシュがなく 手動の完全リフレッシュのみ Index Only Scan PostgreSQL9.2でIndex Only Scanが使用可能となった インデックスで必要なデータが得られる場合 テーブルへのアクセスをスキップする機能 ただし 対象のテーブルがVACUUM 直後 (VACUUM 後に更新されていない ) ことが選択される条件であり 使用する場合は注意が必要 Copyright 2014 K.K.Ashisuto All Rights Reserved. 32

PostgreSQL9.4beta の話 Copyright 2014 K.K.Ashisuto All Rights Reserved. 33

性能関連での PostgreSQL 9.4 への期待 性能に関連するいくつかの変更が明らかになっている 新しいデータ型 JSONB 型 GINインデックスの軽量 高速化 この2つが本バージョンの目玉として取り上げられている WAL ロックの改善 hugepage への対応 マイナーな変更だが PostgreSQL の適用領域を拡大する要因かも 運用担当者はチェックしておくべき変更点 pg_prewarm システムパラメータの動的かつ永続的な変更が可能に 参考文献 Incoming PostgreSQL 9.4 次バージョンの新機能をご紹介 2014 年 6 月 19 日 db tech showcase 大阪 2014 Copyright 2014 K.K.Ashisuto All Rights Reserved. 34

JSONB 型と GIN インデックス JSON データを解析 整形したバイナリとして格納する JSONB 型 従来のJSON 型と比べて高速 軽量 GINインデックスに対応 GIN( 汎用転置 ) インデックスのサイズ削減 性能向上 配列 ハッシュ (hstore) 全文検索テキストなど 複数要素を持つデータ型に対して ある要素を持つもの を検索するときに使われる 互いに進化することで NoSQL 製品に負けない非リレーションにも対応 参考文献 Incoming PostgreSQL 9.4 次バージョンの新機能をご紹介 2014 年 6 月 19 日 db tech showcase 大阪 2014 Copyright 2014 K.K.Ashisuto All Rights Reserved. 35

hugepage 対応と WAL ロックの軽減 大規模メモリを扱う RDBMS では メモリ管理のオーバヘッドが懸念される 特に shared_buffers が 8GB を超え 同時接続数が非常く 軽量な処理を多数実行するような場合に CPU が高騰してしまう Linux の従来のページを扱う場合 RDBMS 側で非常に多くのページ数を管理しなければならないため CPU 負荷が高くなることが原因 PostgreSQL 9.4 から Linux の hugepage をサポートする RDBMS では障害に備えて全ての変更を変更履歴として書き出す 避けては通れない処理であり これがしばしばボトルネックとなる PostgreSQL 9.4 では 更新に対する WAL 生成量が減る ( 更新フィールドのみを WAL 出力 ) PostgreSQL 9.4 では WAL 出力をパラレルで実行 これらの組み合わせにより 高性能なサーバスペックを活かし より広い用途で PostgreSQL を活用できる可能性が考えられる 参考文献 Incoming PostgreSQL 9.4 次バージョンの新機能をご紹介 2014 年 6 月 19 日 db tech showcase 大阪 2014 ( 宗近龍一郎氏の講演資料より ) PostgreSQL - 進化に挑戦し続けるロードマップ ~v9.4 v9.5 の概要を明らかに 2014 年 7 月 17 日 EDB Summit (Bruce Momjian 氏の講演資料より ) Copyright 2014 K.K.Ashisuto All Rights Reserved. 36

運用の変更 pg_prewarm 指定したテーブルやインデックスのデータをshared_buffersやOSバッファに載せる contribツールとして9.4で追加される EXPLAIN ANALYZE 出力が改善 プラン作成時間と実行時間が別々に表示されるように変更される ALTER SYSTEM コマンド postgresql.confとは別にpostgresql.conf.autoを作成し パラメータの変更を永続的に反映させることができる 参考文献 Incoming PostgreSQL 9.4 次バージョンの新機能をご紹介 2014 年 6 月 19 日 db tech showcase 大阪 2014 Copyright 2014 K.K.Ashisuto All Rights Reserved. 37

本日のまとめ DB チューニング 構築時から考えておくべきポイントを整理 パラメータチューニングと 現状の確認 SQL チューニング 実行計画の確認方法を解説 各プランの特徴を整理 性能関連パラメータ一覧 パラメータ名推奨設定反映タイミング shared_buffers 物理メモリの25% サーバ再起動 wal_buffers 自動任せ サーバ再起動 work_mem 処理ごと 即時 checkpoint_segments 16 以上 再読み込み checkpoint_timeout 30 分 再読み込み checkpoint_complation _target 0.9 再読み込み SQL チューニングの流れ pg_statsinfo の紹介 チューニングに役立つ情報が確認可能 PostgreSQL 9.4 beta の話 性能関連を簡単に紹介 ステップ問題となるSQLを特定実行計画の取得対処の実施効果の測定 PostgreSQLでの方法統計情報 ログ出力 EXPLAIN ANALYZE SQL 修正 索引の調整 TAT 測定 実行計画取得 ハンズオンに続く Copyright 2014 K.K.Ashisuto All Rights Reserved. 38