ソート処理は、PostgreSQLのエグゼキュータが行う処理の中でも最も重い処理のひとつである。CPUを使うだけでなく、大量のデータを扱うために作業ファイルを作るからである。これを外部ソート(external sort)と呼ぶ。
外部ソートが発生すると、重いだけでなく、ディスクスペースを大量に消費する心配もある。EXPLAINを実行すればソートが行われることはわかるが、外部ソートが行われるのかどうか、どのくらいソート領域を消費するのかはわからなかった。
8.3では、「trace_sort」というパラメータをオンにすると、ソートに関する情報がEXPLAINとログに記録されるようになった。
以下の例では、外部ソートが実行され、約10Mバイトの領域を使って外部ソートが行われている。
test=# set trace_sort to on;
test=# explain analyze select * from accounts order by abalance;
LOG: begin tuple sort: nkeys = 1, workMem = 1024, randomAccess = f
LOG: switching to external sort with 7 tapes: CPU 0.02s/0.00u sec elapsed 0.03 sec
LOG: performsort starting: CPU 0.51s/0.00u sec elapsed 0.52 sec
LOG: finished writing final run 1 to tape 0: CPU 0.52s/0.00u sec elapsed 0.52 sec
LOG: performsort done: CPU 0.52s/0.00u sec elapsed 0.52 sec
LOG: external sort ended, 1331 disk blocks used: CPU 0.96s/0.00u sec elapsed 0.96 sec
QUERY PLAN
---------------------------------------------------------------------------------------------------------
Sort (cost=16191.82..16441.82 rows=100000 width=97) (actual time=527.619..771.426 rows=100000 loops=1)
Sort Key: abalance
Sort Method: external sort Disk: 10648kB
-> Seq Scan on accounts (cost=0.00..2588.00 rows=100000 width=97) (actual time=0.021..213.239 rows=100000 loops=1)
Total runtime: 969.161 ms
(5 rows)