2017-11-05 16 views
0

は、次の表を想定します一意制約の除外制約は、違いはありますか?

ALTER TABLE zoo ADD CONSTRAINT x EXCLUDE USING gist (cage WITH =, animal WITH =) 

と::

CREATE UNIQUE INDEX ON zoo(cage, animal) 

CREATE TABLE zoo (
    cage INTEGER, 
    animal TEXT, 
); 

は間の実、効果的な違いはありますか?

+1

[マニュアルの引用](https://www.postgresql.org/docs/current/static/sql-createtable.html#sql-createtable-exclude): "*指定されたすべての演算子が等しいかどうかをテストするとこれはUNIQUE制約と同等ですが、通常のユニーク制約はより高速になります* –

答えて

0

私は除外制約の作者のブログにこの記事を読む:

http://thoughts.davisjeff.com/2010/09/25/exclusion-constraints-are-generalized-sql-unique/

DROP TABLE IF EXISTS a; 
CREATE TABLE a(i int); 
ALTER TABLE a ADD EXCLUDE (i WITH =); 

それは除外制約メカニズムを使用していることを除いて、a.i上のUNIQUE制約と同じです。それはそれを強制するために通常のBTreeを使用します。パフォーマンスは、UNIQUE制約のマイクロ最適化のために若干悪くなりますが、パフォーマンスの特性は同じでなければなりません(スケーラビリティと同じです)。最も重要なことは、UNIQUE制約と同じ並行性で同じ動作をするため、過剰なロックを心配する必要はありません。 1人が5を挿入すると、他のトランザクションが同時に挿入されることはありませんが、トランザクション挿入を妨げることはありません。

多かれ少なかれこの質問に答えます。

関連する問題