ALTER INDEX — 인덱스 정의 변경하기

ALTER INDEX — 인덱스 정의 변경하기

ALTER INDEX는 이미 존재하는 인덱스의 정의를 바꾸는 명령이에요. 인덱스 이름을 바꾸거나 테이블스페이스를 옮기거나, 저장 매개변수를 조정하거나, 파티션 인덱스를 연결하는 일을 다룹니다. 대부분의 작업은 사실 ALTER TABLE의 별칭이에요.

출처: PostgreSQL 문서

본문

시놉시스 (Synopsis)

ALTER INDEX [ IF EXISTS ] name RENAME TO new_name
ALTER INDEX [ IF EXISTS ] name SET TABLESPACE tablespace_name
ALTER INDEX name ATTACH PARTITION index_name
ALTER INDEX name [ NO ] DEPENDS ON EXTENSION extension_name
ALTER INDEX [ IF EXISTS ] name SET ( storage_parameter [= value] [, ... ] )
ALTER INDEX [ IF EXISTS ] name RESET ( storage_parameter [, ... ] )
ALTER INDEX [ IF EXISTS ] name ALTER [ COLUMN ] column_number
    SET STATISTICS integer
ALTER INDEX ALL IN TABLESPACE name [ OWNED BY role_name [, ... ] ]
    SET TABLESPACE new_tablespace [ NOWAIT ]

설명 (Description)

ALTER INDEX는 기존 인덱스의 정의를 변경해요. 아래에 설명하는 여러 하위 형식이 있어요. 각 하위 형식에 필요한 잠금(lock) 수준은 다를 수 있다는 점에 주의하세요. 명시하지 않으면 ACCESS EXCLUSIVE 잠금이 유지돼요. 여러 하위 명령을 나열하면 유지되는 잠금은 어떤 하위 명령이든 요구하는 가장 엄격한 것이 돼요.

  • RENAMERENAME 형식은 인덱스의 이름을 바꿔요. 인덱스가 테이블 제약 조건(UNIQUE, PRIMARY KEY, EXCLUDE 중 하나)과 연관되어 있으면 제약 조건도 함께 이름이 바뀌어요. 저장된 데이터에는 영향이 없어요. 인덱스 이름을 바꾸면 SHARE UPDATE EXCLUSIVE 잠금을 획득해요.
  • SET TABLESPACE — 이 형식은 인덱스의 테이블스페이스를 지정된 테이블스페이스로 바꾸고 인덱스와 연관된 데이터 파일을 새 테이블스페이스로 옮겨요. 인덱스의 테이블스페이스를 바꾸려면 인덱스의 소유자이고 새 테이블스페이스에 CREATE 권한이 있어야 해요. 현재 데이터베이스에서 테이블스페이스에 있는 모든 인덱스는 ALL IN TABLESPACE 형식을 써서 옮길 수 있는데, 이 형식은 옮길 모든 인덱스를 잠근 다음 각각을 옮겨요. 이 형식은 지정된 역할이 소유한 인덱스만 옮기는 OWNED BY도 지원해요. NOWAIT 옵션을 지정하면 필요한 모든 잠금을 즉시 획득하지 못할 때 명령이 실패해요. 이 명령은 시스템 카탈로그를 옮기지 않는다는 점에 주의하세요. 원한다면 ALTER DATABASE나 명시적인 ALTER INDEX 호출을 대신 쓰세요. CREATE TABLESPACE도 함께 보세요.
  • ATTACH PARTITION index_name — 명명된 인덱스(가능하면 스키마 한정)가 변경되는 인덱스에 연결되도록 해요. 명명된 인덱스는 변경되는 인덱스를 포함하는 테이블의 파티션에 있어야 하고 동등한 정의를 가져야 해요. 연결된 인덱스는 스스로 드롭할 수 없고, 부모 인덱스가 드롭되면 자동으로 드롭돼요. 명명된 인덱스가 이미 변경되는 인덱스에 연결되어 있으면, 부모 인덱스가 현재 유효하지 않을 때 이 명령은 부모 인덱스의 유효성을 검증하려고 시도해요.
  • DEPENDS ON EXTENSION extension_name, NO DEPENDS ON EXTENSION extension_name — 이 형식은 인덱스를 확장에 의존하는 것으로 표시하거나, NO를 지정하면 더 이상 그 확장에 의존하지 않는 것으로 표시해요. 확장에 의존하는 것으로 표시된 인덱스는 확장이 드롭될 때 자동으로 드롭돼요.
  • SET ( storage_parameter [= value] [, ... ] ) — 이 형식은 인덱스의 인덱스 메서드별 저장 매개변수 하나 이상을 변경해요. 사용 가능한 매개변수에 대한 자세한 내용은 CREATE INDEX를 보세요. 이 명령이 인덱스 내용을 즉시 수정하지는 않는다는 점에 주의하세요. 매개변수에 따라 원하는 효과를 얻으려면 REINDEX로 인덱스를 다시 만들어야 할 수도 있어요.
  • RESET ( storage_parameter [, ... ] ) — 이 형식은 인덱스 메서드별 저장 매개변수 하나 이상을 기본값으로 재설정해요. SET과 마찬가지로 인덱스를 완전히 갱신하려면 REINDEX가 필요할 수 있어요.
  • ALTER [ COLUMN ] column_number SET STATISTICS integer — 이 형식은 이후 ANALYZE 작업에 대한 컬럼별 통계 수집 목표를 설정해요. 다만 표현식으로 정의된 인덱스 컬럼에만 쓸 수 있어요. 표현식은 고유한 이름이 없으므로 인덱스 컬럼의 서수 번호로 참조해요. 목표는 0~10000 범위로 설정할 수 있고, 대신 -1로 설정하면 시스템 기본 통계 목표(default_statistics_target)를 사용하도록 되돌려요. PostgreSQL 쿼리 플래너가 통계를 사용하는 방법에 대한 자세한 내용은 14.2절을 참조하세요.

매개변수 (Parameters)

  • IF EXISTS — 인덱스가 존재하지 않으면 오류를 발생시키지 않아요. 이 경우 notice가 발행돼요.
  • column_number — 서수 번호는 인덱스 컬럼의 왼쪽-오른쪽 순서상 위치를 가리켜요.
  • name — 변경할 기존 인덱스의 이름(가능하면 스키마 한정)이에요.
  • new_name — 인덱스의 새 이름이에요.
  • tablespace_name — 인덱스가 옮겨질 테이블스페이스예요.
  • extension_name — 인덱스가 의존하게 될 확장의 이름이에요.
  • storage_parameter — 인덱스 메서드별 저장 매개변수의 이름이에요.
  • value — 인덱스 메서드별 저장 매개변수의 새 값이에요. 매개변수에 따라 숫자나 단어일 수 있어요.

참고 (Notes)

이 작업들은 ALTER TABLE로도 가능해요. 사실 ALTER INDEX는 인덱스에 적용되는 ALTER TABLE 형식의 별칭일 뿐이에요.

예전에는 ALTER INDEX OWNER 변형이 있었지만 지금은 (경고와 함께) 무시돼요. 인덱스는 자기 테이블의 소유자와 다른 소유자를 가질 수 없어요. 테이블의 소유자를 바꾸면 인덱스도 자동으로 바뀌어요.

시스템 카탈로그 인덱스의 어떤 부분도 변경하는 것은 허용되지 않아요.

예제 (Examples)

기존 인덱스의 이름을 바꾸려면:

ALTER INDEX distributors RENAME TO suppliers;

인덱스를 다른 테이블스페이스로 옮기려면:

ALTER INDEX distributors SET TABLESPACE fasttablespace;

인덱스의 fill factor를 바꾸려면(인덱스 메서드가 지원한다면):

ALTER INDEX distributors SET (fillfactor = 75);
REINDEX INDEX distributors;

표현식 인덱스의 통계 수집 목표를 설정하려면:

CREATE INDEX coord_idx ON measured (x, y, (z + t));
ALTER INDEX coord_idx ALTER COLUMN 3 SET STATISTICS 1000;

호환성 (Compatibility)

ALTER INDEX는 PostgreSQL 확장이에요.

더 알아보기 (Learn more)

  • CREATE INDEX — 새 인덱스를 만드는 명령이에요.
  • DROP INDEX — 인덱스를 삭제하는 명령이에요.
  • REINDEX — 인덱스를 다시 만들어 저장 매개변수 변경을 반영할 수 있어요.