PostgreSQL存储空间复用测试
分享
最近有朋友问如下问题:
一个表中的数据经过增删改后并执行vacuum table操作后,发现后续插入的记录的ctid比老的数据还要小,这是为什么。
原因:这是空间重复利用的结果,是正常的。由于数据的记录是存储在某个块中的,当数据被删除后该记录的地方在块中就会形成空洞,如果没有任何事物再需要这个记录的时候,经过vacuum操作后,就会标识这条记录的空间可以被重复利用了,也就是说新插入的记录是可以放到该位置了,这个地方的ctid比老记录的ctid小就是正常的了。
测试结果:
1. 创建一张测试表,并向表中插入100w条测试记录。
2. 查询记录id从1000到1010这几条记录的ctid。
3. 删除这几条记录,并vacuum。
发现清除了9条记录。
5. 继续插入几条记录
可以看到新插入的记录放到了刚才删除的那几条记录的位置上,继续插入
当把块内的空洞沾满后,新插入的记录会放到最后一个块上了。
文章来源:https://blog.csdn.net/liufeng1980423/article/details/81163952
一个表中的数据经过增删改后并执行vacuum table操作后,发现后续插入的记录的ctid比老的数据还要小,这是为什么。
原因:这是空间重复利用的结果,是正常的。由于数据的记录是存储在某个块中的,当数据被删除后该记录的地方在块中就会形成空洞,如果没有任何事物再需要这个记录的时候,经过vacuum操作后,就会标识这条记录的空间可以被重复利用了,也就是说新插入的记录是可以放到该位置了,这个地方的ctid比老记录的ctid小就是正常的了。
测试结果:
1. 创建一张测试表,并向表中插入100w条测试记录。
sde=# create table t4 (id int,info text);
CREATE TABLE
sde=# insert into t4 select generate_series(1,1000000),md5(random()::text);
INSERT 0 1000000
2. 查询记录id从1000到1010这几条记录的ctid。
sde=# select ctid from t4 where id>10000 and id<10010;
ctid
---------
(83,41)
(83,42)
(83,43)
(83,44)
(83,45)
(83,46)
(83,47)
(83,48)
(83,49)
(9 行记录)
3. 删除这几条记录,并vacuum。
sde=# delete from t4 where id>10000 and id<10010;
DELETE 9
sde=# vacuum verbose t4;
INFO: vacuuming "sde.t4"
INFO: "t4": removed 9 row versions in 1 pages
INFO: "t4": found 9 removable, 999991 nonremovable row versions in 8334 out of 8334 pages
描述: 0 dead row versions cannot be removed yet, oldest xmin: 873827
There were 0 unused item pointers.
Skipped 0 pages due to buffer pins, 0 frozen pages.
0 pages are entirely empty.
CPU: user: 0.25 s, system: 0.00 s, elapsed: 0.25 s.
INFO: vacuuming "pg_toast.pg_toast_52633"
INFO: index "pg_toast_52633_index" now contains 0 row versions in 1 pages
描述: 0 index row versions were removed.
0 index pages have been deleted, 0 are currently reusable.
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.
INFO: "pg_toast_52633": found 0 removable, 0 nonremovable row versions in 0 out of 0 pages
描述: 0 dead row versions cannot be removed yet, oldest xmin: 873827
There were 0 unused item pointers.
Skipped 0 pages due to buffer pins, 0 frozen pages.
0 pages are entirely empty.
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.
VACUUM
发现清除了9条记录。
5. 继续插入几条记录
sde=# insert into t4 values (1000001,md5(random()::text));
INSERT 0 1
sde=# insert into t4 values (1000002,md5(random()::text));
INSERT 0 1
sde=# insert into t4 values (1000003,md5(random()::text));
INSERT 0 1
sde=# insert into t4 values (1000004,md5(random()::text));
INSERT 0 1
sde=# insert into t4 values (1000005,md5(random()::text));
INSERT 0 1
sde=# select ctid from t4 where id>=1000001 ;
ctid
---------
(83,41)
(83,42)
(83,43)
(83,44)
(83,45)
(5 行记录)
可以看到新插入的记录放到了刚才删除的那几条记录的位置上,继续插入
sde=# insert into t4 values (1000006,md5(random()::text));
INSERT 0 1
sde=# insert into t4 values (1000007,md5(random()::text));
INSERT 0 1
sde=# insert into t4 values (1000008,md5(random()::text));
INSERT 0 1
sde=# insert into t4 values (1000009,md5(random()::text));
INSERT 0 1
sde=# insert into t4 values (10000010,md5(random()::text));
INSERT 0 1
sde=# select ctid from t4 where id>=1000001 ;
ctid
-----------
(83,41)
(83,42)
(83,43)
(83,44)
(83,45)
(83,46)
(83,47)
(83,48)
(83,49)
(8333,41)
(10 行记录)
当把块内的空洞沾满后,新插入的记录会放到最后一个块上了。
文章来源:https://blog.csdn.net/liufeng1980423/article/details/81163952
0 个评论
相关问题
- 【抽奖结果已出】ArcGIS知乎社区活动 之 你不知道的地理空间革命【转发分享有奖】【附奖品寄送照片】
- 刚部署好的arcgis api4.3,测试时出现左上角的放大缩小样式出现问题?
- 图形是如何存储在数据库中的?
- Engine中如何判断两个要素类的空间参考是否是同一个?
- 如何按空间位置顺序编号,并保持相邻图斑不跳号?
- 市区择房分析时,需要添加字段并将其赋值1或者-1,怎么做? 在开始编辑的时候,总是出现空间参考与数据框不匹配提示,原因是什么?会影响下面的赋值吗?
- Arcgis for flex API是否支持读取arcsde的空间数据?
- 请问请问如何添加空间索引?
- 空间分析工具用不了
- ArcGIS软件中的gdb格式存储精度问题
- 模型构建中间生成的要素数据集能够作为存储目的地吗?