PostgreSQL Bytea字段拆分与TOAST表性能及查询计划查看咨询
问题解答
是否需要将logo字段放入单独表?
没必要。32*32像素的PNG压缩后通常只有几百字节,远低于PostgreSQL默认的TOAST触发阈值(2KB),会直接存在主表元组里。而且你查询时通常不返回这个字段,PostgreSQL的查询优化器会自动跳过未引用的字段,不会读取这部分数据,完全不会影响主表的查询效率。只有当你有大量超大字段,或者业务上需要拆分表结构(比如权限隔离)时,才需要考虑单独建表,当前场景下完全没必要。
TOAST表会不会导致查询变慢?
不会。首先你的logo字段大小达不到TOAST的触发条件,不会被存到TOAST表中。退一步说,就算真的触发了TOAST,只要你查询时不引用这个字段,PostgreSQL就不会去访问TOAST表,自然不会影响查询速度。只有当你显式SELECT这个字段时,才会读取TOAST中的数据,否则TOAST对普通查询无任何影响。
如何在查询计划中查看TOAST表?
如果查询涉及读取TOAST存储的字段,可以通过EXPLAIN ANALYZE查看:
- 执行带
EXPLAIN ANALYZE的查询,比如:EXPLAIN ANALYZE SELECT logo FROM table1 WHERE id = 1; - 如果logo字段存在TOAST表中,查询计划里会出现对
pg_toast_xxxx(xxxx为原表的OID)的扫描操作,比如Heap Scan on pg_toast_12345或者Index Scan on pg_toast_12345_index这样的条目。 - 你可以先查询原表的OID来确认对应的TOAST表名:
SELECT oid FROM pg_class WHERE relname = 'table1';
内容的提问来源于stack exchange,提问作者Milediira
相关产品推荐
相关产品推荐

