PostgreSQL: 如何计算 Character 数据类型物理占用多少字节?

今天有朋友问到在 PostgreSQL 中,character 字符类型物理占用字节数是如何计算的?这方面关注得比较少,于是查下手册,发现有系统函数 octet_length 可以查询字符类型数据所占的字节数。

octet_length 函数

Function Return Type Description Example Result
octet_length(string) int Number of bytes in string octet_length(‘jose’) 4

备注:接下来测试下。

占用字节数测试

1.1 创建测试表

1
2
3
4
5
6
7
8
9
10
11
12
13
francs=> create table test_bytes1(id int4,name character varying);
CREATE TABLE

francs=> insert into test_bytes1 values (1,'a'),(2,'ab'),(3,'abc');
INSERT 0 3

francs=> select * from test_bytes1;
id | name
----+------
1 | a
2 | ab
3 | abc
(3 rows)

1.2 查看 name 字段所占字节数

1
2
3
4
5
6
7
francs=> select id,name,octet_length(name),pg_column_size(name) from test_bytes1;
id | name | octet_length | pg_column_size
----+------+--------------+----------------
1 | a | 1 | 2
2 | ab | 2 | 3
3 | abc | 3 | 4
(3 rows)

备注:发现 pg_column_size 计算的数值比 octet_length 要多 1 个字节,这是在 strings 比较小的情况下,如果字符比较大,情况又不一样,pg_column_size 用来计算列物理所占字符数。

1.3 测试较大字符

1
2
3
4
5
6
7
8
9
10
11
francs=> insert into test_bytes1 values (4,repeat('aaa',100));
INSERT 0 1

francs=> select id,octet_length(name),pg_column_size(name) from test_bytes1;
id | octet_length | pg_column_size
----+--------------+----------------
1 | 1 | 2
2 | 2 | 3
3 | 3 | 4
4 | 300 | 304
(4 rows)

备注:从上看出,当存储较大字节时,pg_column_size 算出的字节数要比 octet_length 算出的字节数多 4。

1.4 测试更大字符

1
2
3
4
5
6
7
8
9
10
11
12
francs=> insert into test_bytes1 values (5,repeat('aaa',10000));
INSERT 0 1

francs=> select id,octet_length(name),pg_column_size(name) from test_bytes1;
id | octet_length | pg_column_size
----+--------------+----------------
1 | 1 | 2
2 | 2 | 3
3 | 3 | 4
4 | 300 | 304
5 | 30000 | 353
(5 rows)

备注:这时 octet_length 计算的字节数反而超过 pg_column_size 了,这是由于大字段发生了TOAST

附: pg_column_size 函数

Name Return Type Description
pg_column_size(any) int Number of bytes used to store a particular value (possibly compressed)

备注: pg_column_size 与 octet_length 的区别是,前者计算的是压缩后的值。

参考

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/237941.html

(0)
上一篇 2022年1月29日
下一篇 2022年1月29日

相关推荐

发表回复

登录后才能评论