PostgreSQL 8.2.3 中文文档
后退快退章49. 索引访问方法接口定义快进前进

49.5. 索引唯一性检查

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

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

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

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

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


后退首页前进
索引锁的考量上一级索引开销估计函数