我正在调查带宽问题,无意中发现了一个检索bytea值的问题.我用PostgreSQL 10和14、各自的psql客户端和psycopg2客户端库对此进行了测试.

问题是,如果bytea值的大小为10 MB(我可以通过执行select length(value) from table where id=1来确认),而我执行select value from table where id=1,那么通过套接字传输的数据量大约为20MB.请注意,数据库中的值是预压缩的(因此熵很高),并且表被设置为不压缩bytea值,以避免重复工作.

我找不到任何明显的编码问题,因为都是字节.我可以理解,psql CLI命令可能会协商一些编码,以便打印结果,但psycopg2肯定不会这样做,我也经历过同样的行为.

我用一个文本字段测试了相同的场景,结果几乎达到了预期效果.我从lorem ipsum的复制粘贴开始,它传输了正确数量的数据,但当我将文本更改为随机扩展的ASCII值(再次提高熵)时,它传输的数据超过了应有的数量.我的所有列都禁用了压缩,所以我不明白为什么会发生这种情况.

你知道为什么会这样吗?

推荐答案

这很正常.默认情况下,值作为字符串传输,因此bytea将以十六进制数字呈现,这将使其大小加倍.

作为一种解决方法,您可以以二进制模式传输此类数据.前端后端协议和C库对此提供了支持,但这取决于您的客户端API是否可以使用它.

Postgresql相关问答推荐

Redis作为postgreSQL嵌套数据的缓存

环境变量在Bash应用程序中没有出现

如何在PostgreSQL 16中设置&Q;VARSIZE&Q;和&Q;SET_VARSIZE&Q;

无法继承BYPASSRLS

postgres 不同类型的更新

Docker compose read connection reset by peer error on pipeline

PostgreSQL unnest 与空数组

如何在 Sequelize ORM 中插入 PostGIS GEOMETRY 点?

Hibernate 将用户模型保存到 Postgres

从左连接更新 Postgres

PostgreSQL 权限解释

如何使用 postgresql 中的存储过程将数据插入表中

在 Windows 10 中执行时,Docker 容器关闭并给出data directory has wrong ownership错误

manage.py 迁移时必须是关系 django_site 的所有者

PostgreSQL 获取过go 12 小时的元素

每个数据库提供程序类型允许的最大参数数是多少?

PostgreSQL:如何在用户级别设置 search_path?

有没有办法确保 WHERE 子句在 DISTINCT 之后发生?

如何在 postgres 查询中排名

PostgreSQL - 如何将数字字段中的秒数转换为 HH:MM:SS