在postgresql中获取有关外部排序的一些细节

时间:2015-10-07 08:45:02

标签: sql postgresql sql-order-by

阅读此article我找到了以下示例:

EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM foo ORDER BY c1;

查询计划如下:

Sort  (cost=172682.84..175182.84 rows=1000000 width=37) (actual time=584.215..681.531 rows=1000000 loops=1)
  Sort Key: c1
  Sort Method: external sort  Disk: 45928kB
  Buffers: shared hit=3197 read=5137, temp read=5741 written=5741
  ->  Seq Scan on foo  (cost=0.00..18334.00 rows=1000000 width=37) (actual time=0.036..91.914 rows=1000000 loops=1)
        Buffers: shared hit=3197 read=5137
Total runtime: 711.195 ms

As known外部排序是一系列算法。是PostgreSQL external merge sort是什么意思?如果是这样,我如何获得一些细节,例如批次数量及其大小。它甚至可能吗?

1 个答案:

答案 0 :(得分:2)

您可以通过设置参数trace_sorts=onhttp://www.postgresql.org/docs/9.4/static/runtime-config-developer.html

在日志文件中获取此信息

此外,您可能希望至少在此评论中查看src/backend/utils/sort/tuplesort.c

  

此模块处理堆元组,索引元组或单元的排序   基准(并且可以轻松支持其他类型的可排序对象,   如有必要)。它适用于小量和大量   数据的。使用qsort()在内存中对少量进行排序。大   金额使用临时文件和标准外部排序进行排序   算法

     

请参阅第3卷的Knuth,了解更多关于外部的知识   排序算法。我们使用替换将输入划分为已排序的运行   选择,以优先级树的形式实现为堆   (基本上是他的算法5.2.3H),然后使用多相合并运行   合并,Knuth的算法5.4.2D。逻辑"磁带"算法D使用   由logtape.c实现,避免了回收造成的空间浪费   每个块从其" tape"。

中读取后的磁盘空间      

...