2011-06-02 28 views
0

我有一个问题,我有一个数据库中的一列,可能是从10到10,000个字节的大小。你知道PostgreSQL是否支持稀疏数据(即它是否总是在列的每个条目之前留出10,000个字节......或者只有每个条目所需的空间)?PostgresSQL分配的列长度

回答

1

Postgres将存储长变长类型在扩展的空间存储称为TOAST

在字符串的情况下,它保持内联up to 126 bytes(可能意味着多字节东西少于126个字符),然后将其发送到外部存储。

你能看到的数据是使用psql的存储:

\dt+ yourtable 

顺便说一句,注意,从Postgres的角度来看,是绝对声明一个列的类型为varchar之间没有差异(相对于存储)或varchar(large_number) - 它将以完全相同的方式存储。但是,由于字符串长度检查,使用varchar(large_number)的性能损失非常小。

+0

有两件事情:1)大小超过2K的数据是['TOAST'] [1]'编码,并可能使用LZ压缩算法进行压缩; 2)性能损失可忽略不计,因为输入行的值是已知的。 'tuple_size == large_number'是一个时钟周期,一个指针加载......与IO甚至内存访问相比,它甚至不是关系数据库的噪声。 – Sean 2011-06-02 18:39:48

0

使用varchartext类型 - 这些仅使用实际需要来存储数据(加2个字节的小的开销为每个值存储长度)