ソート処理は、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)