ctid: 表示数据记录的物理行当信息,指的是 一条记录位于哪个数据块的哪个位移上面。 跟oracle中伪列 rowid 的意义一样的;只是形式不一样。
   例如这有个一表test;查看每行记录的ctid情况

mydb=> select ctid,* from test;
ctid | id | name
-------+------+--------
(0,1) | 1001 | lottu
(0,2) | 1002 | rax
(0,3) | 1003 | xuan
(0,4) | 1004 | li0924
(0,5) | 1001 | ak
    格式(blockid,itemid):拿其中(0,1)来说;0表示块id;1表示在这块第一条记录。
 
  1. 去重:  我们知道rowid在oracle有个重要的作用;被用作表记录去重;同理 ctid在postgresql里面同样可以使用。例如test表id为1001有两条记录;现在演示下;

mydb=> delete from test where ctid not in (select min(ctid) from test group by id);
DELETE 1
mydb=> select ctid,* from test;
ctid | id | name
-------+------+--------
(0,1) | 1001 | lottu
(0,2) | 1002 | rax
(0,3) | 1003 | xuan
(0,4) | 1004 | li0924
(4 rows)

刚刚我们删除了(0,5)这条记录; 现在我们把这条记录插入下;看下;

mydb=> insert into test values (1001,'ak');
INSERT 0 1
mydb=> select ctid,* from test;
ctid | id | name
-------+------+--------
(0,1) | 1001 | lottu
(0,2) | 1002 | rax
(0,3) | 1003 | xuan
(0,4) | 1004 | li0924
(0,6) | 1001 | ak
(5 rows)

奇怪了;为什么不是(0,5),而是(0,6)这个跟postgresql多版本事务有关;跟伪列cmin,cmax有关;跟本文讲的ctid没点关系;这是postgresql的特性;也就是这样;postgresql里面没有回滚段的概念;那怎么把(0,5)在显示呢;想这块(0,5)的空间再存放数据;postgresql里面有AUTOVACUUM进程;当然我们也可以手动回收这段空间;

mydb=> delete from test where name = 'ak';
DELETE 1
mydb=> vacuum test;
VACUUM
mydb=> insert into test values (1001,'ak');
INSERT 0 1
mydb=> select ctid,* from test;
ctid | id | name
-------+------+--------
(0,1) | 1001 | lottu
(0,2) | 1002 | rax
(0,3) | 1003 | xuan
(0,4) | 1004 | li0924
(0,5) | 1001 | ak
(5 rows)

2. 我们刚刚说道 0表示块id; test数据太少了;不好解释;新建一个表test2

mydb=> drop table test2;
DROP TABLE
mydb=> create table test2 (id int primary key, name varchar(10));
CREATE TABLE
mydb=> insert into test2 select generate_series(1,1000),'lottu' || generate_series(1,1000);
INSERT 0 1000

我们看下id=1000的ctid的blockid是多少;答案是5;意思是说该表的记录记录到第6个块;(因为是从0开始的)

mydb=> select ctid,* from test2 where id = 1000;
ctid | id | name
--------+------+-----------
(5,75) | 1000 | lottu1000
(1 row)
当然这样查表记录占了几个block;假如我这是随机插入的;那id=1000;就不一定是在第6块;
我们可以借助系统视图pg_class;其中relpages,reltuples分别代表块数,记录数!

mydb=> analyze test2;
ANALYZE
mydb=> select relpages,reltuples from pg_class where relname = 'test2';
relpages | reltuples
----------+-----------
6 | 1000
(1 row)
总结: ctid存在的意义:表示数据记录的物理行当信息,指的是 一条记录位于哪个数据块的哪个位移上面。 跟oracle中伪列 rowid 的意义一样的;只是形式不一样。
vacuum: 回收未显示的物理位置;标明可以继续使用。
generate_series: 为一个序列函数;例如1-100;就是generate_series(1,100);0-100直接的偶数generate_series(0,100,2)
                          其中的0表示序列开始位置;100代表结束位置;2为偏移量。

postgresql之ctid的浅谈的更多相关文章

  1. 浅谈B+树索引的分裂优化(转)

    http://www.tamabc.com/article/85038.html 从MySQL Bug#67718浅谈B+树索引的分裂优化   原文链接:http://hedengcheng.com/ ...

  2. 重新学习MySQL数据库6:浅谈MySQL的中事务与锁

    『浅入深出』MySQL 中事务的实现 在关系型数据库中,事务的重要性不言而喻,只要对数据库稍有了解的人都知道事务具有 ACID 四个基本属性,而我们不知道的可能就是数据库是如何实现这四个属性的:在这篇 ...

  3. 浅谈数据库并发控制 - 锁和 MVCC

    在学习几年编程之后,你会发现所有的问题都没有简单.快捷的解决方案,很多问题都需要权衡和妥协,而本文介绍的就是数据库在并发性能和可串行化之间做的权衡和妥协 - 并发控制机制. 如果数据库中的所有事务都是 ...

  4. 浅谈openresty

    浅谈openresty 为什么会有OpenResty? 我们都知道Nginx有很多的特性和好处,但是在Nginx上开发成了一个难题,Nginx模块需要用C开发,而且必须符合一系列复杂的规则,最重要的用 ...

  5. 浅谈 Fragment 生命周期

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...

  6. 浅谈 LayoutInflater

    浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...

  7. 浅谈Java的throw与throws

    转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...

  8. 浅谈SQL注入风险 - 一个Login拿下Server

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

  9. 浅谈WebService的版本兼容性设计

    在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...

随机推荐

  1. storm安装

    官方安装地址:http://storm.apache.org/releases/1.0.2/Setting-up-a-Storm-cluster.html storm集群的三个角色 Nimbus.Su ...

  2. Permissions 0664 for '/home/root/.ssh/id_rsa' are too open.

    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY @ @@@ ...

  3. autolayout也会锁死

    This application is modifying the autolayout engine from a background thread, which can lead to engi ...

  4. nodejs weixin 笔记

    http://www.oschina.net/code/snippet_218887_25870 好文章: http://codelife.me/blog/2013/04/23/developing- ...

  5. Java NIO 读数据处理过程

    这两天仿hadoop 写java RPC框架,使用PB作为序列号工具,在写读数据的时候遇到一个小坑.之前写过NIO代码,恰好是错误的代码产生正确的逻辑,误以为自己写对了.现在简单整理一下. 使用NIO ...

  6. J2EE MyBatis使用

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .20 ...

  7. ads 调试

    1.路径错误,中文名称 2.定义错误

  8. IOS 设备参数

    Iphone,Ipad,ITouch 各个型号参数对比

  9. html 标签内部元素上下居中

    <div style="width: 200px; height: 200px; border: 1px solid red; line-height: 200px;"> ...

  10. poj 1475 || zoj 249 Pushing Boxes

    http://poj.org/problem?id=1475 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=249 Pushin ...