Abh*_*ain 18 postgresql performance unique-constraint
UNIQUE一列或一组列上指定的约束是否会以任何方式影响Postgres DB的写入性能?它内部如何运作?
我的意思是,它是否在插入新记录时执行独特的检查?如果是,它是如何做到的,它是否对数据库中已存在的重复值进行线性搜索?在这种情况下,它被认为会影响性能,即写入/插入性能更差的唯一约束更多?这是真的吗?
Cra*_*ger 29
创建UNIQUE约束或PRIMARY KEY导致创建UNIQUEbtree索引.如果更改了任何索引列,则无论何时INSERT编辑,UPDATE编辑或删除任何记录,都必须更新此索引.如果没有更改索引列,那么HOT(仅堆积元组优化)可能会启动并避免索引更新,尤其是如果您具有非默认值以在页面中创建空间.DELETEFILLFACTOR
插入/更新的索引更新需要时间,因此插入UNIQUE索引表比插入没有任何唯一索引或主键的表更慢.同样的情况也是如此UPDATE,但是如果索引用于查找要更新的元组(并避免使用seqscan),那么它通常是净胜利而根本没有索引.如果使用不同的索引来查找元组,或者seqscan更快(在小表上也是如此),那么就像INSERT索引没有任何好处一样,只需要为此操作更新它就会产生写入成本.这适用于所有索引,而不仅仅是UNIQUE索引.
每个INSERT或UPDATE在UNIQUE索引列上都需要索引查找以验证密钥是否与现有密钥冲突.从模糊的记忆中,这与将新条目插入索引的过程相结合,但我并不是100%肯定.
AFAIK DELETE不会影响索引.它只是xmax为堆中的元组设置.
即使您ROLLBACK在UNIQUE约束列上成功插入或更新后事务或事务中止并出现错误,索引也会更新.VACUUMautovacuum的工作稍后清除死索引条目.请参阅PostgreSQL手册中的并发控制.
所有这一切也适用于a PRIMARY KEY,也是使用UNIQUE索引实现的.
每个索引(包括使用的索引PRIMARY KEY和UNIQUE约束)都会对写入性能造成损害.