【问题标题】:Fastest PostgreSQL query for field length?最快的 PostgreSQL 字段长度查询?
【发布时间】:2020-11-19 01:06:11
【问题描述】:

如果我需要在 postgresql 中找到存储为数字(即可变长度数字)的几个字段的最大长度,以便我的团队可以构建固定宽度的文件布局并且长度不在元数据中,是否有更快的获取该信息的方法比任何一个都好

select field 
from table 
where field is not null 
order by field desc 
limit 1;

select max(field) 
from table;

?

这些字段所在的表有数千万行,因此这些查询需要相当长的时间。我是一个不错的 postgresql 用户,但优化效率从来都不是我的强项——我通常不使用如此大的数据集。任何帮助表示赞赏,即使这是一个愚蠢的问题!

【问题讨论】:

  • 您应该检查两个查询的执行计划,您甚至可能会发现它们是相同的。第二个版本是您可能会在生产系统中使用的版本。
  • 为什么一定要快?如果只有个NULL值会发生什么?
  • 为什么不直接分配 10 位数字给一个整数。这已经足够了。我不确定在文件中保存几个字节是否值得。
  • 此时更多的是时间限制问题 - 这些是帮助填充固定宽度文件布局的临时查询,并且根据表中的行数,一些查询正在执行30+分钟。我们希望在接下来的一两天内改变文件布局。
  • @GordonLinoff 不幸的是,我们在固定宽度文件上有一个最大字节宽度。

标签: sql postgresql performance query-optimization


【解决方案1】:

您的查询看起来不错。第一个查询不需要where子句,可以写成:

select myfield from mytable order by myfield desc nulls last limit 1;

然后,为了性能,考虑以下索引:

create index myidx on mytable(myfield desc nulls last);

实际上 Postgres 应该能够向后读取索引,所以这应该一样好:

create index myidx on mytable(myfield);

有了这些索引中的任何一个,数据库应该能够通过仅查看索引来执行整个查询,这应该非常有效。

【讨论】:

  • 这实际上并没有回答这个问题,而是询问 2 个查询中的哪个查询的性能最高。
  • @TimBiegeleisen:我阅读问题的方式是:有没有比两个给定查询更快的方法?这是我回答的第一句话试图回答的内容。
猜你喜欢
  • 2011-03-20
  • 2014-07-22
  • 1970-01-01
  • 2014-10-27
  • 2018-11-11
  • 2020-05-14
  • 1970-01-01
  • 2011-06-23
  • 2013-12-24
相关资源
最近更新 更多