注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

PostgreSQL 中文网

 
 
 

日志

 
 

探索: PostgreSQL 的 UPDATE 操作  

2011-10-22 11:30:35|  分类: Postgres基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |


      根据 PostgreSQLL 的 MVCC 机制,在执行 update 命令更新数据时, PG 会在原有基础上复制
一份新的复本 tuples 出来,然后在新的 tuples 上进行更新,下面验证下这个过程。
  

--1 创建测试表新插入测试数据
skytf=> create table test_59(id integer,name varchar(32));
CREATE TABLE

skytf=> insert into test_59 values (1,'a'),(2,'b'),(3,'c');
INSERT 0 3


--2 查询表的 ctid
skytf=> select ctid, * from test_59;
 ctid  | id | name
-------+----+------
 (0,1) |  1 | a
 (0,2) |  2 | b
 (0,3) |  3 | c
(3 rows)

   备注: ctid 为记录上逻辑标识,ctid 有两个字段组成,第一个字段表示 table 的逻辑 PAGE 编号,第二个
               字段表示每个逻辑 PAGE 上的第 N 条记录; 例如 ctid =(0,3) 表示这条记录位于这个表的第 0 PAGE 
               页的第三条记录。


--3 更新表中的一条记录
skytf=> update test_59 set name='aaa' where id=1;
UPDATE 1


--4 再次查询表的 ctid
skytf=> select ctid, * from test_59;
 ctid  | id | name
-------+----+------
 (0,2) |  2 | b
 (0,3) |  3 | c
 (0,4) |  1 | aaa
(3 rows)

skytf=> select ctid, * from test_59 where id=1;
 ctid  | id | name
-------+----+------
 (0,4) |  1 | aaa
 
  备注:id=1 这条记录的 ctid 由原来的 (0,1) 变成现在的 (0,4) 了,说明在 update 时,是在这条记录的
            的复本上进行 update, 同时老记录标识不可见;
       
            另:老的记录依然在PAGE里,VACUUM之后才会将老记录清除,这里不再详述。

  评论这张
 
阅读(26915)| 评论(3)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016