오라클이나 PostgreSQL 이나 pk 나 unique constraint 제약 조건을 달면 인덱스는 자동으로 생성됩니다.
대신 constraint 삭제시 에는 처리 방식이 좀 다릅니다.
ALTER TABLE XXX DROP CONSTRAINT 등의 명령을 이용하여 PK 이나 Unique 제약조건을 삭제시에
오라클에서는 인덱스는 자동 삭제되지 않고 남아 있습니다.
하지만 PostgreSQL 에서는 인덱스까지 자동으로 삭제됩니다.
또한 PostgreSQL 은 인덱스 생성이 매우 자유분방(?) 합니다. 무슨 말이냐고 예제를 살펴보시죠.
scottdb=> create table x(x int);
CREATE TABLE
scottdb=> create unique index xuk01 on x(x);
CREATE INDEX
scottdb=> alter table x add constraint xpk primary key(x);
ALTER TABLE
scottdb=> select * from pg_indexes where schemaname='scott';
schemaname | tablename | indexname | tablespace | indexdef
------------+-----------+-----------+------------+------------------------------------------------
scott | x | xuk01 | | CREATE UNIQUE INDEX xuk01 ON x USING btree (x)
scott | x | xpk | | CREATE UNIQUE INDEX xpk ON x USING btree (x)
(2 rows)
scottdb=> select version();
version
---------------------------------------------------------------------------------------------------------------
PostgreSQL 9.3.5 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-52), 64-bit
(1 row)
primary 제약조건을 달면서 UNIQUE INDEX 가 자동으로 하나 생성됐습니다.
결과적으로 인덱스 구성컬럼이 같은데 인덱스 명만 다른 두개의 인덱스가 생겨버렸습니다.
즉 PostgreSQL 에서는 인덱스 구성컬럼이 동일하다 하더라도 인덱스명만 다르면
중복생성이 가능하다는 얘깁니다. 개인적으론 고쳐져야 되지 않을까 싶습니다.
PostgreSQL DBA 라면 이런 불필요한 인덱스가 중복 생성 되지 않도록 관리를 잘하셔야 겠습니다.