两部分问题:
行外?我是否认为默认设置将所有列始终存储在行中,直到达到2kB大小?
我已经阅读了PostGresql Toast文档(http://www.postgresql.org/docs/8.3/static/storage-toast.html),但是看不到任何用于更改阈值的选项(默认似乎是2kB行)或用于强制将列始终存储在行外(外部)仅允许它,但不强制执行)。
我已经找到了说明如何在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:
由于手册在这一点上并不完全明确,这是我的解释:在任何情况下,如何存储字段的最终决定权均由系统决定,并受到以下限制:
8KB
TOAST_TUPLE_THRESHOLD
约束,系统尝试满足
SET STORAGE
策略由用户指定。如果未指定存储策略,则每个TOAST-able
字段会自动声明为
EXTENDED
。 在这些假设下,确保列的所有值均行外存储的唯一方法是使用
TOAST_TUPLE_THRESHOLD
的值小于该列的任何值的最小大小来重新编译系统。关于sql - PostgreSQL:行内与行外用于文本/varchar,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31724598/