【问题标题】:Get some details about external sort in postgresql获取有关 postgresql 中外部排序的一些详细信息
【发布时间】:2015-10-07 08:45:01
【问题描述】:

阅读此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?如果是这样,我怎样才能得到一些细节,例如批次数量及其大小。有没有可能?

【问题讨论】:

  • 你需要查看源代码。
  • @a_horse_with_no_name 这是唯一的方法吗? PosgtrSQL 不提供有关它使用的算法的详细信息,是吗?
  • 它不能比实际实现更详细了。

标签: sql postgresql sql-order-by


【解决方案1】:

您可以通过设置参数trace_sorts=on (http://www.postgresql.org/docs/9.4/static/runtime-config-developer.html)在日志文件中获取此信息

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

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

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

...

【讨论】:

  • 是的,你抓住了我想要的东西。谢谢你,特别是指出来源。
猜你喜欢
  • 1970-01-01
  • 2013-10-10
  • 2019-12-30
  • 2012-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-24
  • 1970-01-01
相关资源
最近更新 更多