阅读此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
是什么意思?如果是这样,我如何获得一些细节,例如批次数量及其大小。它甚至可能吗?
答案 0 :(得分:2)
您可以通过设置参数trace_sorts=on
(http://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"。
中读取后的磁盘空间...