Postgres 中的压缩函数

six*_*ude 3 postgresql jdbc compression

使用 Java 和 JDBC,我将字符串存储到 Postgres 中的 JSONB 列中。插入时效果很好。

检索值时,Java 内存不足,因为我检索的数据量较大,并且每个 json/字符串大约为 1MB。我想做的是编写这样的查询:

SELECT compress( myJsonColumn ) FROM myTable WHERE ...
Run Code Online (Sandbox Code Playgroud)

我在 Postgres 中查找了一些压缩方法,但没有找到。任何指示将不胜感激。谢谢。

澄清:澄清一下,我不想压缩数据库中的数据。我认为 Postgres 会优雅地处理这个问题,我主要关心的是 java-heap-space。

我的架构中有三个组件。

  1. 需要未压缩的 json 的客户端(并且将自行处理解压缩)
  2. 为多个客户端提供服务的服务。我正在努力保护服务的内存。该服务永远不需要查看未压缩的 json。
  3. 数据库。我想将 json 存储在 jsonb 字段中,而不是以二进制形式存储,以便我可以在需要时针对数据编写新的查询。

在此输入图像描述

jja*_*nes 5

我最近有机会使用这样的东西:

CREATE FUNCTION gzip(text) RETURNS bytea
    LANGUAGE plperlu IMMUTABLE STRICT COST 100000 PARALLEL SAFE
    AS $_X$
    use Compress::Zlib;
    my $x = Compress::Zlib::memGzip($_[0]);
    return encode_bytea($x);
$_X$;
Run Code Online (Sandbox Code Playgroud)

但请注意,bytea 本身是以转义形式传输的,这会增大大小。运气好的话,JDBC 实现可能会在将它们读入内存时即时对它们进行转义,而不是以原始形式存储整个结果集。抱歉,我对 JDBC 的使用还不够了解。

难道不能只使用游标一次处理一行然后丢弃它,而不是将所有行读入内存吗?