我在 Postgres 的 TEXT 字段中存储了一些大型 XML 文档,并试图找出 TOAST 压缩它们的效率。我有一个 2.2mb 的 XML 文档,可以压缩到 51kb,所以我想了解 TOAST 的压缩率与它的匹配程度如何才能最终决定我将如何随着时间的推移归档这些文档。
Postgres 中是否有一个函数可以让我像这样识别特定列和行的 TOAST 压缩大小?
我在 Postgres 的 TEXT 字段中存储了一些大型 XML 文档,并试图找出 TOAST 压缩它们的效率。我有一个 2.2mb 的 XML 文档,可以压缩到 51kb,所以我想了解 TOAST 的压缩率与它的匹配程度如何才能最终决定我将如何随着时间的推移归档这些文档。
Postgres 中是否有一个函数可以让我像这样识别特定列和行的 TOAST 压缩大小?
你想要pg_column_size
TOASTed 大小,unastedoctet_length
大小。pg_column_size
位于文档的系统管理功能部分。有关更多详细信息,请参阅文档和此问题。
例子:
craig=> CREATE TABLE toastdemo(x text);
CREATE TABLE
craig=> insert into toastdemo(x) select * from repeat('abcdef',1000);
INSERT 0 1
craig=> select pg_column_size(x), pg_column_size(repeat('abcdef',1000)) FROM toastdemo;
pg_column_size | pg_column_size
----------------+----------------
84 | 6004
(1 row)
您实际上可以检查文件:
SELECT oid AS table_name, reltoastrelid AS toast_tbl_name
FROM pg_class
WHERE oid = 'mytbl'::regclass
这会生成表的 OID 和与之关联的 toast 表(如果存在)。它们用作数据目录中文件系统中的文件名。你可以去看看他们。在您的数据目录中:
find . -name '216738'
这是手册中有关压缩技术的引述:
使用的压缩技术是 LZ 压缩技术系列中相当简单且非常快速的成员。详情请参阅
src/backend/utils/adt/pg_lzcompress.c
。