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

Similar documents
ShikumiBunkakai_2011_10_29

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

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

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

第 2 章 問合せの基本操作 この章では データベースから情報を検索する際に使用する SELECT コマンド および SELECT コマンドと 同時に使用する句について説明します 1. 問合せとは 2. 基本的な問合せ 3. 列の別名 4. 重複行を一意にする 5. 検索行の絞込み 6. 文字パター

Microsoft PowerPoint - 講義補助資料2017.pptx

Oracle9i

プレポスト【問題】

Slide 1

PostgreSQL 10 技術解説 SRA OSS, Inc. 日本支社 マーケティング部 PostgreSQL 技術グループ 高塚遙 PostgreSQL 最新動向紹介セミナー

Oracle9i Reportsのチューニング

PA4

領域サイズの見積方法

このドキュメントに記載されている情報 (URL 等のインターネット Web サイトに関する情報を含む ) は 将来予告なしに変更することがあります このドキュメントに記載された内容は情報提供のみを目的としており 明示または黙示に関わらず これらの情報についてマイクロソフトはいかなる責任も負わないもの

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

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

Microsoft PowerPoint - KeySQL50_10g_vlo2.ppt

次期バージョン PostgreSQL 10 の 新機能とその後の方向性 SRA OSS, Inc. 日本支社 マーケティング部 PostgreSQL 技術グループ 長田 悠吾 db tech showcase OSS

第 2 章 PL/SQL の基本記述 この章では PL/SQL プログラムの基本的な記述方法について説明します 1. 宣言部 2. 実行部 3. 例外処理部

自己紹介 長田悠吾 (Yugo Nagata) SRA OSS, Inc. 日本支社 PostgreSQL 技術支援 コンサルティング PostgreSQL インターナル講座講師 研究開発 Copyright 2018 SRA OSS, Inc. Japan All right

Slide 1

目次 1 集計関数 / 分析関数とは 2 集計関数 / 分析関数のパフォーマンス効果 3 ケーススタディグループ小計やクロス集計を計算するランキングを表示する前月比較を表示する累計を計算する移動平均を計算する構成比を計算する Oracle8i SQL Oracle8i Oracle Oracle C

スライド 1

A. 前ページからの続きです DBMS_SPACE.UNUSED_SPACE の各パラメータの意味 segment_owner = オブジェクトの所有者 segment_name = オブジェクト名 segment_type = オブジェクトタイプ total_blocks = セグメント合計ブロッ

Slide 1

PowerPoint Presentation

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

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

タイトルを1~2行で入力 (長文の場合はフォントサイズを縮小)

Oracle活用実践演習コース

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

: ORDER BY

スライド 1

1

アジェンダ ORACLE MASTER Oracle Database 11g 概要 11g SQL 基礎 Ⅰ 試験紹介 ポイント解説 Copyright 2011 Oracle. All rights reserved. 2

BC4J...4 BC4J Association JSP BC4J JSP OC4J

Slide 1

スライド 1

早分かりS2Dao

PowerPoint プレゼンテーション

PowerPoint Presentation

052-XML04/fiÁ1-part3-’ÓŠ¹

Microsoft PowerPoint pptx

機械学習 ツール入門

Oracleの領域管理~トラブル防止のテクニック~

第 1 章 条件分岐 この章では 条件に応じて処理を分岐する方法について説明します 1. CASE 式で複雑な条件分岐を実現 2. 関数を使用した条件分岐 3. MERGE 文による条件に応じた DML の実行

untitled

PostgreSQL 11 新機能解説 オープンソースカンファレンス 2018 Tokyo/Fall SRA OSS, Inc. 日本支社近藤雄太 Copyright 2018 SRA OSS, Inc. Japan All rights reserved. 1

_02_3.ppt

Oracle8簡単チューニング for Windows NT

PowerPoint -O80_REP.PDF

タイトル1

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

n n n ( ) n Oracle 16 PostgreSQL 3 MySQL

#odddtky Oracle DBA & Developer Days 2014 for your Skill 使える実践的なノウハウがここにある 津島博士のパフォーマンス講座 SQL チューニングの基礎 日本オラクル株式会社データベース事業統括製品戦略統括本部データベースエンジニアリング本部 担

PowerPoint プレゼンテーション

PowerPoint Presentation

Null

S2DaoでもN:Nできます

スライド 1

EPAS12_NewFeatures_

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

PostgreSQL 11 検証レポート

Oracle Database Connect 2017 JPOUG

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

復習 (SQL 文 ) 3/6 復習 (SQL 文 ) 4/6 表の作成 CREATE TABLE...; 表の削除 DROP TABLE テーブル名 ; 表内のデータが全て消えてしまう. 表内のデータを得る SELECT 列名 FROM 表名...; 表にデータを挿入する. INSERT INTO

結合演算 ( 復習 ) データベース論 (9) R 社員番号 氏名麻生太郎安部晋三与謝野馨森喜朗 部門経理課営業課総務課営業課 S 部門経理課営業課総務課 電話 問合せ言語と SQL(2) R S 社員番号

Agenda パフォーマンス チューニングとは ボトルネック箇所の特定 代表的なチューニング項目 メモリ割り当てのチューニング ディスクI/Oのチューニング SQL 文のチューニング Copyright 2010, Oracle. All rights reserved. 2

リレーショナルデータベース入門 SRA OSS, Inc. 日本支社 Copyright 2008 SRA OSS, Inc. Japan All rights reserved. 1

PostgreSQL 9.2 検証報告

D1印刷用.PDF

ICDE’15 勉強会 R24-4: R27-3 (R24:Query Processing 3, R27 Indexing)

,, create table drop table alter table

(Microsoft PowerPoint _JPUG\216d\221g\202\335\225\252\211\310\211\357_v1.1.ppt)

XML Consortium & XML Consortium 1 XML Consortium XML Consortium 2

PowerPoint Presentation

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

Oracle Application Expressの機能の最大活用-インタラクティブ・レポート

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

PostgreSQL 11 New Features

Microsoft PowerPoint - Lite10g_SyncArchitecture.ppt

橡実践Oracle Objects for OLE

PowerPoint Presentation


スライド 1

クエリの作成が楽になるUDF

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

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

HiRDB Version 9 パフォーマンスガイド

HiRDB Version 10 パフォーマンスガイド

Dolteng Scaffoldに対する機能追加とマスタ-ディテールScaffoldの紹介

津島博士のパフォーマンス講座

Microsoft PowerPoint - HPE_MySQLClusrter_JEIS事例_v1.0.pptx

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

はじめに コースの概要と目的条件分岐の方法や複雑な集計の手法など SQL のコーディングの幅を広げるためのテクニックについて説明します また パフォーマンスを考慮した記述方法や正しい結果を取得するための記述方法などについても あわせて説明します 本コースでは 実践的な SQL の記述手法を広く浅く紹

Chapter Two

tkk0408nari

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

Microsoft Word - sample_adv-programming.docx

JavaプログラミングⅠ

Transcription:

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

アジェンダ 1.EXPLAIN とは 2. 表アクセスの基本 3. 結合の基本 4. 統計情報とは 5.EXPLAIN コマンド 6. 問題解決例 7. まとめ 2

1.EXPLAIN とは 実行計画とは - 目的地は 1 つでもアクセス方法は複数 3

1.EXPLAIN とは 表の状態が分からなければどのパスが最適か分からない SqeScan と IndexScan を行った時の時間 実行時間 Seq Scan Index Scan 0 25 50 75 100 表全体に対する走査対象データの割合 4

1.EXPLAIN とは 実行計画担当 : プランナーです 5

1.EXPLAIN とは プランナがどのような実行計画を作ったのかを確認する手段が本日のテーマである EXPLAIN コマンドです 6

1.EXPLAIN とは 1 どのようなアクセス方法が適切か 2 どのような結合方法が適切か 3 統計情報を元に実行計画を作成する事がプランナの役目 4 どのような選択が行なわれたかどのように実行されたか EXPLAIN コマンドで確認する 7

2. 表アクセス方法 (1).Seq Scan 検索範囲 : 広 (3).Bit Map Scan 検索範囲 : 中 / 特殊 1 0 1 0 0 (2).Index Scan 検索範囲 : 狭 NEW 9.2 (4).Index Only Scan 検索範囲 : 特殊 0 0 0 0 1 8

3. 表結合方法 1 どのようなアクセス方法が適切か 2 どのような結合方法が適切か 3 統計情報を元に実行計画を作成する事がプランナの役目 1.Nested Loop Join 外部表 5 5 8 8 2 2 6 6 9 9 内部表 8 8 2 2 7 7 5 5 1 1 特徴 : いかなる場合でも選択可能 2.Sort Merge Join 外部表 5 5 8 8 2 2 6 6 9 9 2 5 6 8 9 1 2 5 7 8 内部表 8 8 2 2 7 7 5 5 1 1 特徴 : ソートが完了すれば早い 4 どのような選択が行なわれたか どのように実行されたか EXPLAIN コマンドで確認する 外部表 5 5 8 8 2 2 1 1 7 7 3.Hash Join 内部表 8 8 2 2 7 7 5 5 1 1 9 特徴 : ハッシュを作成できれば早い

4. 統計情報 1 つ 1 つの表の 行数 行サイズ平均 相関 ヒストグラム などを見積もったもの 統計情報取得コマンド ANALYZE 表名 ; 1 どのようなアクセス方法が適切か 2 どのような結合方法が適切か 3 統計情報を元に実行計画を作成する事がプランナの役目 4 どのような選択が行なわれたか どのように実行されたか EXPLAIN コマンドで確認する 10

5.EXPLAIN コマンド 1 どのようなアクセス方法が適切か 2 どのような結合方法が適切か empno ename job : deptno emp [INT] [CHAR(10)] [CHAR(9)] [INT] deptno dname loc 3 統計情報を元に実行計画を作成する事がプランナの役目 4 どのような選択が行なわれたか どのように実行されたか EXPLAIN コマンドで確認する dept [INT] [VARCHAR(10)] [VARCHAR(10)] SELECT d.dname,e.ename FROM emp e JOIN dept d USING (deptno); 11

5.EXPLAIN コマンド Explain Plan の例 # EXPLAIN ANALYZE SELECT d.dname,e.ename FROM emp e JOIN dept d USING (deptno); QUERY PLAN --------------------------------------------------------------- Hash Join (cost=1.23..4101.23 rows=100000 width=66) (actual time=0.045..161.248 rows=90000 loops=1) Hash Cond: (e.deptno = d.deptno) -> Seq Scan on emp e (cost=0.00..2725.00 rows=100000 width=41) (actual time=0.007..49.537 rows=100000 loops=1) -> Hash (cost=1.10..1.10 rows=10 width=37) (actual time=0.025..0.025 rows=10 loops=1) Buckets: 1024 Batches: 1 Memory Usage: 1kB -> Seq Scan on dept d (cost=0.00..1.10 rows=10 width=37) Total runtime: 196.524 ms (7 rows) ANALYZE オプションを付けることで実際に SQL が実行され actual time の情報が出力されるシステムへの影響を考慮すること (actual time=0.003..0.013 rows=10 loops=1) 12

5.EXPLAIN コマンド ( アクセス方法 ) Explain Plan の例 1 どのようなアクセス方法が適切か # EXPLAIN ANALYZE SELECT d.dname,e.ename FROM emp e JOIN dept d USING (deptno); QUERY PLAN --------------------------------------------------------------- Hash Join (cost=1.23..4101.23 rows=100000 width=66) (actual time=0.045..161.248 rows=90000 loops=1) Hash Cond: (e.deptno = d.deptno) -> Seq Scan on emp e (cost=0.00..2725.00 rows=100000 width=41) (actual time=0.007..49.537 rows=100000 loops=1) -> Hash (cost=1.10..1.10 rows=10 width=37) (actual time=0.025..0.025 rows=10 loops=1) Buckets: 1024 Batches: 1 Memory Usage: 1kB -> Seq Scan on dept d (cost=0.00..1.10 rows=10 width=37) (actual time=0.003..0.013 rows=10 loops=1) Total runtime: 196.524 ms (7 rows) 2 どのような結合方法が適切か 3 統計情報を元に実行計画を作成する事がプランナの役目 4 どのような選択が行なわれたか どのように実行されたか EXPLAIN コマンドで確認する インデックススキャンの場合の表記 Index Scan using emp_pkey on emp e 13

5.EXPLAIN コマンド ( 結合方法 ) Explain Plan の例 1 どのようなアクセス方法が適切か # EXPLAIN ANALYZE SELECT d.dname,e.ename FROM emp e JOIN dept d USING (deptno); QUERY PLAN 2 どのような結合方法が適切か 3 統計情報を元に実行計画を作成する事がプランナの役目 4 どのような選択が行なわれたか どのように実行されたか EXPLAIN コマンドで確認する --------------------------------------------------------------- Hash Join (cost=1.23..4101.23 rows=100000 width=66) (actual time=0.045..161.248 rows=90000 loops=1) Hash Cond: (e.deptno = d.deptno) -> Seq Scan on emp e (cost=0.00..2725.00 rows=100000 width=41) (actual time=0.007..49.537 rows=100000 loops=1) -> Hash (cost=1.10..1.10 rows=10 width=37) (actual time=0.025..0.025 rows=10 loops=1) Buckets: 1024 Batches: 1 Memory Usage: 1kB -> Seq Scan on dept d (cost=0.00..1.10 rows=10 width=37) (actual time=0.003..0.013 rows=10 loops=1) Total runtime: 196.524 ms (7 rows) 14

5.EXPLAIN コマンド ( 統計情報 ) Explain Plan の例 1 どのようなアクセス方法が適切か プランナが推定したコストと行数 # EXPLAIN ANALYZE SELECT d.dname,e.ename FROM emp e JOIN dept d USING (deptno); QUERY PLAN --------------------------------------------------------------- Hash Join (cost=1.23..4101.23 rows=100000 width=66) (actual time=0.045..161.248 rows=90000 loops=1) Hash Cond: (e.deptno = d.deptno) -> Seq Scan on emp e (cost=0.00..2725.00 rows=100000 width=41) (actual time=0.007..49.537 rows=100000 loops=1) -> Hash (cost=1.10..1.10 rows=10 width=37) (actual time=0.025..0.025 rows=10 loops=1) Buckets: 1024 Batches: 1 Memory Usage: 1kB -> Seq Scan on dept d (cost=0.00..1.10 rows=10 width=37) (actual time=0.003..0.013 rows=10 loops=1) 実際に SQL を実行した時間と行数 Total runtime: 196.524 ms (7 rows) 2 どのような結合方法が適切か 3 統計情報を元に実行計画を作成する事がプランナの役目 4 どのような選択が行なわれたか どのように実行されたか EXPLAIN コマンドで確認する 15

5.EXPLAIN コマンド ( 統計情報 ) 見積もられた平均列長 (cost=0.00..2725.00 rows=100000 width=41) 表アクセスにかかるコストの見積もり ディスクからのデータ読み込み メモリ上のスキャン CPU を使用する処理 (actual time=0.007..49.537 rows=100000 loops=1) 16 取り出される行数の見積もり 繰り返し実行された回数 実際に取り出された行数 実際に表アクセスにかかった時間 ( ミリ秒 )

5.EXPLAIN コマンド ( 統計情報見方のコツ ) Explain Plan の例 1. 統計情報は 誤差 が最も少なくなるであろう 下 ( インデントが下のもの ) から見ていく 2. 共通するパラメータは rows # EXPLAIN ANALYZE SELECT d.dname,e.ename FROM emp e JOIN dept d USING (deptno); QUERY PLAN --------------------------------------------------------------- Hash Join (cost=1.23..4101.23 rows=100000 width=66) (actual time=0.045..161.248 rows=90000 loops=1) Hash Cond: (e.deptno = d.deptno) -> Seq Scan on emp e (cost=0.00..2725.00 rows=100000 width=41) (actual time=0.007..49.537 rows=100000 loops=1) -> Hash (cost=1.10..1.10 rows=10 width=37) (actual time=0.025..0.025 rows=10 loops=1) Buckets: 1024 Batches: 1 Memory Usage: 1kB -> Seq Scan on dept d (cost=0.00..1.10 rows=10 width=37) (actual time=0.003..0.013 rows=10 loops=1) Total runtime: 196.524 ms (7 rows) 17

6. 問題解決演習 (1) 表の構成 exception_id complete exception プライマリキー exception_pkey [INT] [BOOLEAN] exception_notice_map exception_notice_map_id [INT] exception_id [INT] notice_id [INT] complete=false 全体の 0.25% SELECT exception_id FROM exception JOIN exception_notice_map USING (exception_id) WHERE complete IS FALSE AND notice_id = 3; 18

6. 問題解決演習 (1) =# EXPLAIN ANALYZE SELECT exception_id FROM exception -# JOIN exception_notice_map USING (exception_id) -# WHERE complete IS FALSE AND notice_id = 3; QUERY PLAN --------------------------------------------------------------------------------- Hash Join (cost=14428.34..22873.52 rows=7 width=4) (actual time=147.192..246.654 rows=251 loops=1) Hash Cond: (exception_notice_map.exception_id = exception.exception_id) -> Seq Scan on exception_notice_map (cost=0.00..8352.77 rows=24623 width=4) (actual time=0.011..88.084 rows=24800 loops=1) Filter: (notice_id = 3) -> Hash (cost=14425.00..14425.00 rows=267 width=4) (actual time=147.162..147.162 rows=251 loops=1) Seq Scan on exception (cost=0.00..14425.00 Buckets: 1024 Batches: 1 Memory Usage: 6kB -> Seq Scan on exception (cost=0.00..14425.00 rows=267 width=4) (actual time=0.007..147.017 rows=251 loops=1) Filter: (complete IS FALSE) Total runtime: 246.807 ms (9 rows) exception 表に "WHERE complete IS False" という条件はわずかなのに全てのデータにアクセスしている 19

6. 問題解決演習 (1) 表の構成 exception_id complete exception プライマリキー exception_pkey [INT] [BOOLEAN] exception_notice_map exception_notice_map_id [INT] exception_id [INT] notice_id [INT] complete=false 全体の 0.25% active_exceptions を追加 SELECT exception_id FROM exception JOIN exception_notice_map USING (exception_id) WHERE complete IS FALSE AND notice_id = 3; 20

6. 問題解決演習 (1) =# CREATE INDEX active_exceptions ON exception(complete) WHERE complete IS false; =# EXPLAIN ANALYZE SELECT exception_id FROM exception -# JOIN exception_notice_map USING (exception_id) -# WHERE complete IS FALSE AND notice_id = 3; QUERY PLAN --------------------------------------------------------------------------------- =# EXPLAIN ANALYZE SELECT exception_id FROM exception -# JOIN exception_notice_map USING (exception_id) -# WHERE complete IS FALSE AND notice_id = 3; Hash Join (cost=16.26..8461.42 rows=5 width=4) (actual time=0.566..112.103 rows=251 loops=1) Hash Cond: (exception_notice_map.exception_id = exception.exception_id) -> Seq Scan on exception_notice_map (cost=0.00..8352.77 rows=24623 width=4) (actual time=0.016..94.645 Index Scan using rows=24800 active_exceptions loops=1) on exception Filter: (notice_id = 3) -> Hash (cost=13.76..13.76 rows=200 width=4) (actual time=0.536..0.536 rows=251 loops=1) Buckets: 1024 Batches: 1 Memory Usage: 6kB -> Index Scan using active_exceptions on exception (cost=0.00..13.76 rows=200 w idth=4) (actual time=0.025..0.283 rows=251 loops=1) インデックスを使ってくれた Index Cond: (complete = false) Total runtime: 112.323 ms (9 rows) INDEX 作成前 Total runtime: 246.807 ms 21

例 1) のまとめ EXPLAIN ANALYZE を活用しよう! 22

6. 問題解決演習 (2) images site host host_id [INT] host_name [CHAR(20)] images_id [INT] site_id [INT] host_id [INT] image_name [TEXT] site_id name [INT] [CHAR(20)] SELECT h.host_name,s.name,i.image_name FROM images i JOIN host h USING (host_id) JOIN site s USING (site_id) WHERE images_id > 2212; 23

6. 問題解決演習 (2) =#explain analyze SELECT h.host_name,s.name,i.image_name FROM images i -# JOIN host h USING (host_id) JOIN site s USING (site_id) -# WHERE images_id > 2212; Hash Join (cost=130.87..10680.75 rows=788 width=70) (actual time=1196.263..1290.620 rows=788 loops=1) Hash Cond: (h.host_id = i.host_id) -> Seq Scan on host h (cost=0.00..10167.00 rows=100000 width=4) (actual time=1188.441..1236.629 rows=100000 loops=1) -> Hash (cost=121.02..121.021 ミリ秒に rows=788 84 width=74) 行抽出 (actual time=5.481..5.481 rows=788 loops=1) host Buckets: 1024 Batches: 1 Memory Usage: 75kB -> Hash Join (cost=46.89..121.02 rows=788 width=74) (actual time=3.589..4.928 rows=788 loops=1) host_id Hash Cond: (s.site_id = i.site_id) host_name -> Seq Scan on site s (cost=0.00..55.00 rows=3000 width=37) (actual time=0.025..1.685 rows=3000 loops=1) (actual -> time=0.025..1.685 Hash (cost=37.04..37.04 rows=788 rows=3000 width=41) loops=1) (actual time=1.254..1.254 rows=788 loops=1) Buckets: 1024 Batches: 1 Memory Usage: 50kB -> Index Scan using 1 ミリ秒で images_pkey 120000 on images 行抽出 i site (cost=0.00..37.04 rows=788 width=41) (actual time=0.065..0.758 rows=788 loops=1) site_id Index Cond: (images_id > 2212) Total runtime: 1290.995 ms name 24 host 表の Seq Scan 時間が site と比べて効率が悪い (actual time=1188.441..1236.629 rows=100000 loops=1) [INT] [CHAR(20)] [INT] [CHAR(20)]

6. 問題解決演習 (2) host host_id host_name [INT] [CHAR(20)] 1 行のサイズは? INT 4byte + CHAR 20byte + Tupleheader 23+αbyte= 約 50bytes ブロックヘッダは? 23bytes 1 ブロックのサイズは? 8192bytes 1 ブロックに入る最大行数 (8192-32)/50 = 約 163 行 25

6. 問題解決演習 (2) =#explain analyze SELECT h.host_name,s.name,i.image_name FROM images i -# JOIN host h USING (host_id) JOIN site s USING (site_id) -# WHERE images_id > 2212; Hash Join (cost=130.87..10680.75 rows=788 width=70) (actual time=1196.263..1290.620 rows=788 loops=1) Hash Cond: (h.host_id = i.host_id) -> Seq Scan on host h (cost=0.00..10167.00 rows=100000 width=4) (actual time=1188.441..1236.629 rows=100000 loops=1) -> Hash (cost=121.02..121.02 rows=788 width=74) (actual time=5.481..5.481 rows=788 loops=1) Buckets: 1024 Batches: 1 Memory Usage: 75kB -> Hash Join (cost=46.89..121.02 rows=788 width=74) (actual time=3.589..4.928 rows=788 loops=1) Hash Cond: (s.site_id = i.site_id) -> Seq Scan on site s (cost=0.00..55.00 rows=3000 width=37) (actual time=0.025..1.685 rows=3000 loops=1) -> Hash (cost=37.04..37.04 rows=788 width=41) (actual time=1.254..1.254 rows=788 loops=1) 1Buckets: ブロックに 1024 Batches: 10 行しか格納できていない 1 Memory Usage: 50kB -> Index Scan using images_pkey on images i (cost=0.00..37.04 rows=788 width=41) (actual time=0.065..0.758 rows=788 loops=1) Index Cond: (images_id > 2212) Total runtime: 1290.995 ms 削除フラグが立った行が多数あるのではないか 26 host_id host_name host [INT] [CHAR(20)] Seq Scan on host h (cost=0.00..10167.00 rows=100000 width=4)

6. 問題解決演習 (2) =#vacuum full host; =#explain analyze SELECT h.host_name,s.name,i.image_name FROM images i -# JOIN host h USING (host_id) JOIN site s USING (site_id) -# WHERE images_id > 2212; Hash Join (cost=130.87..2360.32 rows=788 width=70) (actual time=11.701..112.387 rows=788 loops=1) Hash Cond: (h.host_id = i.host_id) -> Seq Scan on host h (cost=0.00..1843.14 rows=100914 width=4) (actual time=0.025..51.975 rows=100000 loops=1) -> Hash (cost=121.02..121.02 rows=788 width=74) (actual time=8.148..8.148 rows=788 loops=1) Buckets: 1024 Batches: 1 Memory Usage: 大幅に改善 75kB -> Hash Join (cost=46.89..121.02 rows=788 width=74) (actual time=5.123..7.252 rows=788 loops=1) Hash Cond: (s.site_id = i.site_id) -> Seq Scan on site s (cost=0.00..55.00 rows=3000 width=37) (actual time=0.005..2.274 rows=3000 loops=1) 対処後 -> Hash (actual (cost=37.04..37.04 time=0.025..51.975 rows=788 rows=100000 width=41) loops=1) (actual time=1.701..1.701 rows=788 loops=1) Buckets: 1024 Batches: 1 Memory Usage: 50kB -> Index Scan using images_pkey on images i (cost=0.00..37.04 VACUUM rows=788 前 Total width=41) runtime: 1290.995 ms (actual time=0.013..0.918 rows=788 loops=1) Index Cond: VACUUM (images_id 後 Total > 2212) runtime: 112.932 ms Total runtime: 112.932 ms 27 1 行あたりにかかる時間が 対処前 (actual time=1188.441..1236.629 rows=100000 loops=1)

6. 問題解決演習 (2) まとめ VACUUM FULL がいらない設計 運用を EXPLAIN を見れば メンテナンスの必要性も分かる 28

まとめまとめどのようなアクセス方法が適切かどのような結合方法が適切か統計情報を元に実行計画を作成する事がプランナの役目どのような選択が行なわれたかを EXPLAIN コマンドで確認できる EXPLAIN には ANALYZE をつけるインデントの下の方から時間がかかっているものを見つける対処例 ) -INDEX を作成する -VACUUM FULL を実行する 29

ご静聴ありがとうございました 参考資料 Explaining Explain ~ PostgreSQL の実行計画を読む ~ http://lets.postgresql.jp/documents/technical/query_tuning/explaining_explain_ja.pdf/view 内部を知って業務に活かす PostgreSQL 研究所第 4 回 http://www2b.biglobe.ne.jp/~caco/webdb-pdfs/vol29.pdf Robert Haas blog http://rhaas.blogspot.com/2011/10/index-only-scans-weve-got-em.html 問合せ最適化インサイド http://www.slideshare.net/itagakitakahiro/ss-4656848 象と戯れ http://postgresql.g.hatena.ne.jp/umitanuki/20110425/1303752697 スライドの画像 http://www.sxc.hu/ 30