【问题标题】:Does field size affect group by performance字段大小是否会按性能影响分组
【发布时间】:2020-07-05 18:01:03
【问题描述】:

我有一个查询,我按具有非常大字段(大多数有数千个字符)的列进行分组并看到性能下降。按其他较小的列分组对性能没有成比例的影响。

我的直觉是 group by 是基于散列的,所以大小无关紧要(我找不到关于幕后行为的文档)

这里是否还有其他因素在起作用,或者字段大小是否会以某种方式影响小组的表现?

【问题讨论】:

  • edit您的问题并添加使用explain (analyze, buffers, format text)生成的execution plan不是只是一个“简单”解释)为formatted text,并确保保留计划的缩进。粘贴文本,然后将``` 放在计划前一行和计划后一行。还请包括所有索引的完整 create index 语句。
  • Group by 可以使用散列或排序。当然,无论哪种方式,一个巨大的列都会增加开销,哈希可能更糟(所有乘法和加法的成本都会增加,而比较可以在第一个不同的字节上完成)。如果 group by 中有多个列,则首先放置较小的列可能会有所帮助。

标签: sql postgresql performance


【解决方案1】:

我的直觉是 group by 是基于散列的,所以大小无关紧要

我对这种反应有点困惑。散列需要为两个键操作处理键的整个值:

  1. 产生哈希值。
  2. 检查哈希表中的冲突。

我对哈希表的 Postgres 实现并不十分熟悉,但大键值也存在耗尽内存的风险——这会减慢任何算法的速度。

我希望散列的性能与密钥长度成正比。

【讨论】:

  • 我的直觉错了!我只考虑了哈希的输出,而忽略了输入。
【解决方案2】:

您是否尝试过为正在分组的字段创建组合索引?

【讨论】:

  • 人们可能希望避免为大列使用哈希索引!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
  • 2014-10-25
  • 2020-07-30
  • 1970-01-01
相关资源
最近更新 更多