gpt4 book ai didi

sql - Postgresql:文本/varchar 的行内与行外

转载 作者:太空狗 更新时间:2023-10-30 01:51:52 28 4
gpt4 key购买 nike

两部分问题:

  1. 什么是 Postgresql 行内存储文本/varchars 的行为 vs行外?我认为在默认设置下,所有列将始终存储在行中,直到达到 2kB 大小,我的想法是否正确?

  2. 我们对上述行为有任何控制吗?有什么方法可以更改特定列/表的阈值,或强制特定列始终以行外方式存储?

我已经通读了 PostGresql Toast 文档(http://www.postgresql.org/docs/8.3/static/storage-toast.html),但我没有看到任何更改阈值的选项(默认值似乎是每行 2kB)或强制列始终存储 out- of-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 表”。

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

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.

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

  1. 不能存储任何字段以致超过一行的总大小8KB
  2. 如果字段的大小小于TOAST_TUPLE_THRESHOLD
  3. 满足之前的约束,系统会尝试满足 SET STORAGE 策略由用户指定。如果没有指定存储策略,每个 TOAST-able字段自动声明为 EXTENDED

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

关于sql - Postgresql:文本/varchar 的行内与行外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31724598/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com