• 検索結果がありません。

ディスクソート

ドキュメント内 PostgreSQL Internals (1) (ページ 165-168)

5. パフォーマンス関連

5.3 実行計画

5.3.6 ディスクソート

ソート処理は、パラメーターwork_mem で指定されたメモリー内で実行されますが、レ コードがメモリー内に格納できない場合はディスク上でソートが行われます。ディスクソ ート用の一時データは、テーブルが所属するデータベースが保存されるテーブル空間の

pgsql_tmpディレクトリに作成されます。データベースの保存先がテーブル空間pg_default

の 場 合 は {PGDATA}/base/pgsql_tmp 、 そ の 他 の テ ー ブ ル 空 間 の 場 合 は 、

{TABLESPACEDIR}/PG_9.6_201608131/pgsql_tmpディレクトリが使用されます。ソート

に使用されるファイル名は、「pgsql_tmp{PID}.{9}」です。{PID}はバックエンドのプロセス

ID、{9}は、0から始まる一意の番号です。

例 137 ディスクソート用ファイル

以下にディスクソートの確認方法を記述します。

postgres=> CREATE TABLE data1 (c1 NUMERIC, c2 NUMERIC) ; CREATE TABLE

postgres=> ANALYZE data1 ; ANALYZE

postgres=> SELECT reltuples, relpages FROM pg_class WHERE relname='data1' ; reltuples | relpages

---+--- 0 | 0 (1 row)

postgres=> EXPLAIN SELECT * FROM data1 ; QUERY PLAN

--- Seq Scan on data1 (cost=0.00..18.60 rows=860 width=64) (1 row)

postgres=>

$ pwd

/usr/local/pgsql/data/base/pgsql_tmp

$ ls -l total 34120

-rw--- 1 postgres postgres 34897920 Feb 11 17:02 pgsql_tmp6409.0

□ 実行計画

EXPLAIN ANALYZE文で実行計画を取得すると、ディスクソートを示す「Sort Method:

external merge」または「Sort Method: external sort」および使用されたディスク容量が が出力されます。

例 138 ディスクソートの実行計画

ソートを行うタプル数により、ディスクソートの方法は Replacement Selection または

Quicksort が 選 択 さ れ ま す 。 ソ ー ト 対 象 の タ プ ル 数 が パ ラ メ ー タ ー

replacement_sort_tuples(デフォルト値 150000)の指定以下の場合は、Replacement

Selectionが選択されます。

□ パラメーターtrace_sort

パラメーターtrace_sortをonに指定すると、ソート関連のイベントがログに出力されま す(デフォルト値off)。このパラメーターはメモリー・ソート実行時にもログを出力するた め、商用環境で設定しないでください。

postgres=> EXPLAIN ANALYZE SELECT * FROM data1 ORDER BY 1, 2 ; QUERY PLAN

--- Sort (cost=763806.52..767806.84 rows=1600128 width=138)

(actual time=7600.693..9756.909 rows=1600128 loops=1) Sort Key: c1, c2

Sort Method: external merge Disk: 34080kB

-> Seq Scan on data1 (cost=0.00..24635.28 rows=1600128 width=138) (actual time=1.239..501.092 rows=1600128 loops=1) Total runtime: 9853.630 ms

(5 rows)

例 139 trace_sort=on設定時のログ(Replacement Selectionによる外部ソート実行時の抜粋)

例 140 trace_sort=on設定時のログ(Quicksortによる外部ソート実行時の抜粋)

LOG: statement: SELECT * FROM data1 ORDER BY 1;

LOG: begin tuple sort: nkeys = 1, workMem = 4096, randomAccess = f

LOG: numeric_abbrev: cardinality 10049.436974 after 10240 values (10240 rows) LOG: switching to external sort with 15 tapes: CPU 0.03s/0.01u sec elapsed 0.04 sec

LOG: replacement selection will sort 58253 first run tuples LOG: performsort starting: CPU 0.99s/0.51u sec elapsed 1.51 sec

LOG: finished incrementally writing only run 1 to tape 0: CPU 1.01s/0.54u sec elapsed 1.55 sec

LOG: performsort done: CPU 1.01s/0.54u sec elapsed 1.56 sec

LOG: external sort ended, 2687 disk blocks used: CPU 1.50s/0.95u sec elapsed 2.48 sec

LOG: begin tuple sort: nkeys = 1, workMem = 4096, randomAccess = f

LOG: numeric_abbrev: cardinality 10049.436974 after 10240 values (10240 rows) LOG: switching to external sort with 15 tapes: CPU 0.01s/0.01u sec elapsed 0.02 sec

LOG: starting quicksort of run 1: CPU 0.01s/0.01u sec elapsed 0.02 sec LOG: finished quicksort of run 1: CPU 0.01s/0.01u sec elapsed 0.03 sec LOG: finished writing run 1 to tape 0: CPU 0.02s/0.01u sec elapsed 0.04 sec LOG: performsort starting: CPU 0.31s/0.25u sec elapsed 0.56 sec

LOG: starting quicksort of run 20: CPU 0.31s/0.25u sec elapsed 0.56 sec LOG: finished quicksort of run 20: CPU 0.31s/0.25u sec elapsed 0.56 sec LOG: finished writing run 20 to tape 5: CPU 0.31s/0.25u sec elapsed 0.57 sec LOG: finished 7-way merge step: CPU 0.45s/0.36u sec elapsed 0.82 sec

LOG: grew memtuples 1.29x from 58253 (1366 KB) to 74896 (1756 KB) for final merge

LOG: tape 0 initially used 144 KB of 144 KB batch (1.000) and 4581 out of 5348 slots (0.857)

LOG: performsort done (except 14-way final merge): CPU 0.45s/0.37u sec elapsed 0.82 sec

LOG: external sort ended, 2679 disk blocks used: CPU 2.07s/0.40u sec elapsed 2.48 sec

□ pg_stat_databaseカタログ

pg_stat_database カタログには、一時ファイルに関する情報が記録されています。これ

らの値はORDER BYによるディスクソートだけでなく、CREATE INDEX文によるイン

デックス作成によるディスクソートもカウントされています。

表 62 pg_stat_databaseカタログの一時ファイル関連データ 列名 説明

datname データベース名

temp_files 作成された一時ファイル数

temp_bytes 作成された一時ファイルの合計サイズ

ドキュメント内 PostgreSQL Internals (1) (ページ 165-168)