2012-11-02 44 views
10

在一列或一組列上指定的UNIQUE約束是否以任何方式影響Postgres數據庫的寫入性能?內部功能如何?獨特約束如何影響Postgres DB中的寫入性能

我是說,插入新記錄時是否執行獨特檢查?如果是的話,它是如何做到的,它是否對數據庫中已經存在的重複值進行線性搜索?在那種情況下,它被認爲會影響性能,即寫入/插入性能越差,唯一性約束越嚴重?這是真的嗎?

回答

20

創建UNIQUE約束或PRIMARY KEY會導致創建一個UNIQUE btree索引。每當任何記錄是INSERT版,UPDATE版,或者如果任何索引列被改變DELETE d這個索引必須被更新。如果沒有索引列被更改,則HOT(僅堆唯一元組優化)可能會啓動並避免索引更新,尤其是如果您使用非默認的頁面空間來創建頁面空間。

上插入索引更新/更新需要時間,因此插入到UNIQUE索引表不是插入到一個沒有任何唯一索引或主鍵慢。對於UPDATE也是如此,但如果使用索引來查找要更新的元組(並避免seqscan),則通常是淨贏,而不是索引。如果使用不同的索引來查找元組,或者seqscan速度更快(小表上的情況如此),那麼就像INSERT一樣,該索引沒有任何好處,只會產生寫入成本來更新該操作。所有索引都是如此,而不僅僅是UNIQUE索引。

UNIQUE 上的每個INSERTUPDATE需要通過索引查找來驗證密鑰是否與現有密鑰不衝突。從模糊的記憶中,這與將新條目插入索引的過程結合在一起,但我不是100%確定的。

AFAIK DELETE不影響指數。它只是爲堆中的元組設置xmax

即使您在ROLLBACK事務或事務在UNIQUE約束列上成功插入或更新後發生錯誤,也會中止該索引。 VACUUM由autovacuum工作後清理死亡索引條目。見Concurrency Control in the PostgreSQL manual

這一切也是PRIMARY KEY,其使用UNIQUE指數也實現如此。

每個索引(包括PRIMARY KEYUNIQUE約束所使用的索引)都會對寫入性能造成損失。

+0

感謝您的回答。這很好解釋。主鍵是否也會影響記錄的排序順序?如果您可以在以下地址提供我的其他問題的答案,那將是非常好的:http://stackoverflow.com/questions/13190720/what-is-the-order-of-records-when-the-primary-key-is-指定上-A基團的的-COL –