加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Postgresql:用于text / varchar的In-Row与Out-out-row

发布时间:2020-12-13 15:54:59 所属栏目:百科 来源:网络整理
导读:两部分问题: 什么是Postgresql行为用于存储文本/ varchars in-row vs 乱排?我是否认为使用默认设置时,所有列将始终存储在行中,直到达到2kB大小? 我们是否可以控制上述行为?有什么方法可以更改特定列/表的阈值,或强制特定列始终存储在行外? 我已阅读Post
两部分问题:

>什么是Postgresql行为用于存储文本/ varchars in-row vs
乱排?我是否认为使用默认设置时,所有列将始终存储在行中,直到达到2kB大小?
>我们是否可以控制上述行为?有什么方法可以更改特定列/表的阈值,或强制特定列始终存储在行外?

我已阅读PostGresql Toast文档(http://www.postgresql.org/docs/8.3/static/storage-toast.html),但我没有看到任何更改阈值的选项(默认似乎是2kB-for-row)或强制列始终存储在行外(EXTERNAL)只允许它,但不强制执行它).

我找到了解释如何在SQL Server(https://msdn.microsoft.com/en-us/library/ms173530.aspx)上执行此操作的文档,但没有看到类似PostGresql的任何内容.

如果有人对我的动机感兴趣,我有一个表混合了短一致列(ID,时间戳等),一列是varchar(200),一列是text / varchar(max),它可以长度非常大.我目前将两个varchars存储在一个单独的表中,只是为了在短一致列上进行有效的存储/查找/扫描.

然而,这是一种痛苦,因为我经常不得不做连接来读取所有数据.我真的想将所有上述字段存储在同一个表中,并告诉Postgresql永远强制存储2个VARCHAR.

解决方法

编辑答案

对于问题的第一部分:你是对的(参见例如this).

对于问题的第二部分:存储列的标准方法是压缩可变长度文本字段(如果它们的大小超过2KB),并最终将它们存储到一个名为“TOAST table”的单独区域中.

您可以通过对列使用以下命令向系统提供有关如何存储字段的“提示”:

ALTER TABLE YourTable
  ALTER COLUMN YourColumn SET STORAGE (PLAIN | EXTENDED | EXTERNAL | MAIN)

从manual开始:

SET STORAGE

This form sets the storage mode for a column. This controls whether this column is held inline or in a secondary TOAST table,and whether the data should be compressed or not. PLAIN must be used for fixed-length values such as integer and is inline,uncompressed. MAIN is for inline,compressible data. EXTERNAL is for external,uncompressed data,and EXTENDED is for external,compressed data. EXTENDED is the default for most data types that support non-PLAIN storage. Use of EXTERNAL will make substring operations on very large text and bytea values run faster,at the penalty of increased storage space. Note that SET STORAGE doesn’t itself change anything in the table,it just sets the strategy to be pursued during future table updates. See Section 59.2 for more information.

由于手册在这一点上并不完全明确,这是我的解释:在任何情况下,关于如何存储字段的最终决定留给系统,给出以下约束:

>不能存储任何字段,以便行的总大小结束
8KB
>如果字段的大小小于,则没有字段存储在行外
TOAST_TUPLE_THRESHOLD
>满足前一个
约束,系统试图满足SET STORAGE策略
由用户指定.如果未指定存储策略,则每个TOAST-able
字段自动声明为EXTENDED.

在这些假设下,确保列的所有值都存储在行外的唯一方法是使用TOAST_TUPLE_THRESHOLD的值重新编译系统,该值小于列的任何值的最小值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读