pg_attribute表容量膨胀问题分析

原创 2015年11月20日 18:06:51

PG数据库下表字段更新对pg_attribute表空间影响:

1)TEST数据库下已有一张class表,信息如下,包含两个字段int类型的num和varchar(20)类型的name:

    TEST=# \d class
         资料表 "public.class"
     栏位 |         型别          | 修饰词
    ------+-----------------------+--------
     num  | integer               | 非空
     name | character varying(20) |

2)查看此时存储在pg_attribute表中class表的字段信息,结果如下:

    TEST=# select attrelid,attname from pg_attribute a, pg_class b where a.attrelid=b.oid and b.relname='class';
    -[ RECORD 1 ]------
    attrelid | 35012
    attname  | cmax
    -[ RECORD 2 ]------
    attrelid | 35012
    attname  | cmin
    -[ RECORD 3 ]------
    attrelid | 35012
    attname  | ctid
    -[ RECORD 4 ]------
    attrelid | 35012
    attname  | name
    -[ RECORD 5 ]------
    attrelid | 35012
    attname  | num
    -[ RECORD 6 ]------
    attrelid | 35012
    attname  | tableoid
    -[ RECORD 7 ]------
    attrelid | 35012
    attname  | xmax
    -[ RECORD 8 ]------
    attrelid | 35012
    attname  | xmin

从结果中看到pg_attribute表中存储着class表的8个字段,除了自己定义的num和name之外,其他6个位默认隐含字段。

3)如果更新了class表的一个字段,更新后的字段信息会存储到pg_attribute表,旧的字段信息将被标记为删除状态,成为dead数据。在更新class表字段之前,先查询出当前pg_attribute表的live和dead记录,查询结果如下:

    TEST=# select relname, n_live_tup,n_dead_tup from pg_stat_sys_tables a where a.relname='pg_attribute';
    -[ RECORD 1 ]------------
    relname    | pg_attribute
    n_live_tup | 2428
    n_dead_tup | 257

可以看到,目前pg_attribute表的live记录为2428,dead记录为257;

4)现在更新class表的name字段名称,然后再次查询pg_attribute表的live记录和dead记录,结果如下:

    TEST=# alter table class rename column name to name2;
    ALTER TABLE
    TEST=# select relname, n_live_tup,n_dead_tup from pg_stat_sys_tables a where a.relname='pg_attribute';
    -[ RECORD 1 ]------------
    relname    | pg_attribute
    n_live_tup | 2428
    n_dead_tup | 258

可以看到,在把class表的name字段名称更新为name2后,pg_attribute表的live记录未变化,dead记录由257变为258,说明pg_attribute中多了一条dead记录,这条记录就是被更新的name字段。

5)现在测试创建和删除临时表对pg_attribute表的影响,先创建一个临时表:

    TEST=# create temp table tempT(
    TEST(# id int);
    CREATE TABLE
    TEST=# select relname, n_live_tup,n_dead_tup from pg_stat_sys_tables a where a.relname='pg_attribute';
    -[ RECORD 1 ]------------
    relname    | pg_attribute
    n_live_tup | 2435
    n_dead_tup | 258

创建临时表tempT,只包含一个int类型的id字段。创建后查询pg_attribute信息,可以看到live记录由2428变为了2435,增长了7,结合步骤2)中实验得出的每张表默认包含6个隐藏字段,刚好此处增长的7个字段为tempT表的字段。

6)删除临时表tempT,删除后查看pg_attribute表信息:

    TEST=# drop table tempT;
    DROP TABLE
    TEST=# select relname, n_live_tup,n_dead_tup from pg_stat_sys_tables a where a.relname='pg_attribute';
    -[ RECORD 1 ]------------
    relname    | pg_attribute
    n_live_tup | 2428
    n_dead_tup | 265

删除后,可以看到live记录重新变回了2428,而dead记录变为了265,相比258增长了7。这增长的7条dead记录即为tempT临时表中的7个字段信息。

总结

所以如果频繁的用到临时表,需要注意pg_attribute表的dead空间清理。可以使用vacuum操作或者cluster操作是否dead空间。
即vacuum full tablename。
cluster tablename using index。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Emgu 膨胀&腐蚀&阈值分割

Emgu膨胀、腐蚀、阈值分割运算
  • cvMat
  • cvMat
  • 2016年12月17日 14:30
  • 1724

ACM气球膨胀问题C++实现

1.问题描述:给定一个矩形,在该矩形中有3个固定的点,以这3个点为中心的气球先后膨胀:膨胀时触碰到矩形的边或其他气球时则停止膨胀。编写程序求以何种顺序膨胀气球时,才能使气球的横切面面积之和为最大。 ...
  • cordova
  • cordova
  • 2016年03月11日 09:18
  • 1121

对腐蚀 和 膨胀 的理解

原理:在特殊领域运算形式——结构元素(Sturcture Element),在每个像素位置上与二值图像对应的区域进行特定的逻辑运算。运算结构是输出图像的相应像素。运算效果取决于结构元素大小内容以及逻辑...
  • gbxvip
  • gbxvip
  • 2016年03月10日 10:03
  • 9639

postgres中pg_depend表实验性分析

名字 类型 引用 描述 classid oid pg_class.oid 有倚赖对象所在系统表的 OID objid oid 任意 OID 属性 指定的依赖对象的 OID objsub...
  • yibei8811
  • yibei8811
  • 2015年06月24日 16:17
  • 341

SQL 解决日志库膨胀问题

  • 2011年07月07日 17:56
  • 838B
  • 下载

C#特性Attribute的实际应用之:代码统计分析

  • 2010年12月29日 11:17
  • 386KB
  • 下载

oracle迁移到pg问题整理

这个帖子转自http://bbs.pgsqldb.com,把两个帖子合在一起了 很多内容是网上查的资料,我只是整理下,有遗漏的地方,欢迎补充 首先用工具(Ora2pg)自动转换 由于这个项目...
  • BeiiGang
  • BeiiGang
  • 2012年12月17日 17:36
  • 4504

pg数据库Sequence问题

serial 类型实际上就是 int4, 只不过其默认值是从一个 sequence 中取. 当表刚建立的时候,sequence 的值还是 1, 只有不断调用 sequence 的 nextval ...
  • addccc
  • addccc
  • 2017年05月01日 17:40
  • 170

C++中泛型使用导致的膨胀问题

前几天,博主看了一篇文章抨击C++的泛型会导致生成的可执行文件代码臃肿。  博主从事C++软件开发多年,由于之前的开发环境都是资源充足的服务器,不用考虑磁盘空间的问题。最近打算在智能家居主机的嵌入式平...
  • qq_31350345
  • qq_31350345
  • 2016年03月21日 20:33
  • 77

训练深度网络的梯度弥散及梯度膨胀问题

在深度网络中,不同层的学习速度差异很大。尤其是在网络后面层学习的情况很好的时候,先前的层常常会在训练时停止不变,基本上学不到东西,这些原因是与基于梯度的学习方法有关。 我们用MNIST数字分类问题作...
  • NeuFace
  • NeuFace
  • 2015年12月27日 12:32
  • 6881
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:pg_attribute表容量膨胀问题分析
举报原因:
原因补充:

(最多只允许输入30个字)