postgresql 索引状态_PostgreSQL 索引唯一性检查

PostgreSQL 使用唯一索引来强制 SQL 唯一约束,唯一索引实际上是不允许多条记录有相同键值的的索引。一个支持这个特性的访问方法要设置 pg_am.amcanunique 为真。目前,只有 b-tree 支持它。

因为 MVCC ,必须允许重复的条目物理上存在于索引之中:该条目可能指向某个逻辑行的后面的版本。实际想强制的行为是,任何 MVCC 快照都不能包含两条相同的索引键字。这种要求在向一个唯一索引插入新行的时候分解成下面的几种情况:

如果一个有冲突的合法行被当前事务删除,这是可以的。特别是因为一个 UPDATE 总是在插入新版本之前删除旧版本,这样就允许一个行上的 UPDATE 不用改变键字进行操作。

如果一个在等待提交的事务插入了一行有冲突的数据,那么准备插入数据的事务必须等待看看改事务是否提交。如果该事务回滚,那么就没有冲突。如果它没有删除冲突行然后提交,那么就有一个唯一性违例。实际上只是等待另外那个事务结束,然后在程序里重做可视性检查。

类似的,如果一个有冲突的有效行被一个准备提交的事务删除,那么另外一个准备提交的插入事务必须等待该事务提交或者退出,然后重做测试。

此外,根据上面的规则进行唯一性检查之前,访问方法必须重新检查刚被插入的行是否仍然"活跃",如果已经因为事务的提交而"钉死了",那么不应当发出任何错误。这种情况不可能出现在插入同一个事务中创建的行的时候。但是在 CREATE UNIQUE INDEX CONCURRENTLY 的过程中是可能的。

要求索引访问方法自己进行这些测试,这就意味着它必须检查堆,以便查看那些根据索引内容表明有重复键字的任意行的提交状态。这样做毫无疑问地很难看并且也不是模块化的,但是这样可以节约重复的工作:如果进行额外的一次探测,而后面的索引查找冲突行的的动作实际上是和查找插入新行的索引记录重复的动作。并且,没有很显然的方法来避免冲突条件,除非冲突检查是插入新索引条目的整体动作的一部分。

这个方法的主要的局限是没有很方便的方法支持推迟的唯一性检查。

PostgreSQL是以加州大学伯克利分校计算机系开发的POSTGRES,现在已经更名为PostgreSQL. PostgreSQL支持大部分SQL标准并且提供了许多其它现代特性:复杂查询、外键、触发器、视图、事务完整性等。PostgreSQL 是一个免费的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行。它提供了相对其他开放源代码数据库系统(比如 MySQL 和 Firebird),和专有系统(比如 Oracle、Sybase、IBM 的 DB2 和 Microsoft SQL Server)之外的另一种选择。事实上, PostgreSQL 的特性覆盖了 SQL-2/SQL-92 和 SQL-3/SQL-99,首先,它包括了可以说是目前世界上最丰富的数据类的支持,其中有些数据类可以说连商业数据库都不具备, 比如 IP 类和几何类等;其次,PostgreSQL 是全功能的自由软件数据库,很长时间以来,PostgreSQL 是唯一支持事务、子查询、多版本并行控制系统(MVCC)、数据完整性检查等特性的唯一的一种自由软件的数据库管理系统。 Inprise 的 InterBase 以及SAP等厂商将其原先专有软件开放为自由软件之后才打破了这个唯一。最后,PostgreSQL拥有一支非常活跃的开发队伍,而且在许多黑客的努力下,PostgreSQL 的质量日益提高。从技术角度来讲,PostgreSQL 采用的是比较经典的C/S(client/server)结构,也就是一个客户端对应一个服务器端守护进程的模式,这个守护进程分析客户端来的查询请求,生成规划树,进行数据检索并最终把结果格式化输出后返回给客户端。为了便于客户端的程序的编写,由数据库服务器提供了统一的客户端 C 接口。而不同的客户端接口都是源自这个 C 接口,比如ODBC,JDBC,Python,Perl,Tcl,C/C++,ESQL等, 同时也要指出的是,PostgreSQL 对接口的支持也是非常丰富的,几乎支持所有类的数据库客户端接口。这一点也可以说是 PostgreSQL 一大优点。本课程作为PostgreSQL数据库管理一,主要讲解以下内容: 1.     PostgreSQL 存储过程基本知识2.     PostgreSQL 用户自定义函数3.     PostgreSQL 控制结构4.     PostgreSQL 游标和存储过程5.     PostgreSQL 索引6.     PostgreSQL 视图7.     PostgreSQL 触发器8.     PostgreSQL 角色、备份和还原9.     PostgreSQL 表空间管理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值