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 作成された一時ファイルの合計サイズ