最快的 PostgreSQL 字段长度查询?

Posted

技术标签:

【中文标题】最快的 PostgreSQL 字段长度查询?【英文标题】:Fastest PostgreSQL query for field length? 【发布时间】: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 不幸的是,我们在固定宽度文件上有一个最大字节宽度。 【参考方案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:我阅读问题的方式是:有没有比两个给定查询更快的方法?这是我回答的第一句话试图回答的内容。

以上是关于最快的 PostgreSQL 字段长度查询?的主要内容,如果未能解决你的问题,请参考以下文章

postgresql数据库 查询表名备注及字段长度是否可控是否主键等信息

postgresql数据库中,查询一个字段允许的最大长度的SQL语句怎么写?

sql中如何取字符的长度?

从大表的子集中对随机行进行最快查询 - postgresql

PostgreSQL9.4往jsonb字段新增键值SQL怎么写

postgresql查出来的字段长度为啥比实际字段多了4