이 페이지는 기계 번역되었습니다. 영어 원본을 읽어보세요. English

IBSurgeon 라이브러리

Firebird 5에서의 동시 인덱스 생성

현재 인덱스를 빌드하는 동안에는 테이블 데이터의 수정이 허용되지 않습니다. 이는 빌드 중에 삽입된 새 키를 놓치지 않는 올바른 인덱스를 생성하는 데 필요합니다.

동시 인덱스 빌드 알고리즘은 이러한 읽기 잠금이 필요한 시간을 크게 단축할 수 있습니다. 테이블 데이터의 동시 수정을 차단할 필요성을 완전히 없애지는 못하지만, 차단 시간은 기존의 비동시 알고리즘에 비해 훨씬 짧습니다. 이는 사용자 활동을 장기간 차단하는 것이 비현실적이거나 불가능한 프로덕션 환경에서 특히 유용합니다.

동시 로드와 추가적인 복잡성으로 인해 동시 인덱스 생성은 기존 방식보다 더 오래 걸릴 수 있습니다.

구문

새로운 선택적 비예약 키워드 CONCURRENTLY는 동시 인덱스 생성을 지정하는 데 사용됩니다.

새 인덱스 생성

Code
CREATE [UNIQUE] [ASC[ENDING] | DESC[ENDING]]  INDEX indexname ON tablename  {(col [, col ...]) | COMPUTED BY ()}  [WHERE ]  [CONCURRENTLY]

기존 인덱스 활성화

Code
ALTER INDEX indexname {ACTIVE | INACTIVE}  [CONCURRENTLY]

참고: CONCURRENTLYACTIVE와 함께만 사용할 수 있습니다.

고유성 검증

인덱스가 동시에 빌드되는 동안 인덱스 고유성을 확인하는 것은 어렵거나 불가능합니다. 따라서 고유 인덱스가 동시에 생성(또는 활성화)되면 시스템 카탈로그에서 즉시 _NOT VALIDATED_로 표시됩니다. 인덱스 고유성은 인덱스 빌드가 완료된 후, 인덱스가 테이블의 모든 레코드에 대한 키를 포함할 때 검증됩니다.

고유성 검사가 성공하면 NOT VALIDATED 표시가 제거됩니다.

고유성 검사가 실패하면 인덱스는 활성 상태로 유지되며 _NOT VALIDATED_로 표시됩니다. 이후 사용자는 중복을 찾아 수정하고 고유성을 다시 검증하거나, 적절하다면 인덱스를 삭제할 수 있습니다.

참고: NOT VALIDATED 고유 인덱스는 여전히 테이블에 중복 항목을 허용하지 않습니다.

고유 인덱스를 검증하려면 다음을 실행하세요:

Code
ALTER INDEX indexname VALIDATE UNIQUE

이 문은 인덱스 스캔을 수행하여 중복 키를 찾고 해당 레코드를 확인합니다. 중복이 없으면 NOT VALIDATED 표시가 제거되고 인덱스가 검증된 것으로 간주됩니다. 그렇지 않으면 NOT VALIDATED 표시가 유지되며 인덱스는 나중에 다시 검증할 수 있습니다.

isql 명령 SHOW INDEX는 이제 NOT VALIDATED 표시가 있으면 표시합니다.

테이블 제약 조건

PRIMARY|UNIQUE|FOREIGN KEY와 같은 테이블 제약 조건에 대한 인덱스의 동시 생성은 아직 지원되지 않습니다. 향후 PRIMARY|UNIQUE KEY를 지원할 가능성은 있지만, FOREIGN KEY의 경우는 가능성이 낮습니다.

예제

일부 데이터가 있는 테이블 준비

Code
create table tab (  id int not null,  f1 varchar(64));
insert into tab values (1, '1');
insert into tab values (1, '2');commit;

CONCURRENTLY 절을 사용하여 인덱스 생성

Code
create index idx_tab_f1 on tab(f1) concurrently;

중복이 있는 열에 고유 인덱스 생성

Code
create unique index idx_tab_id on tab(id);

오류가 발생합니다:

Code
Statement failed, SQLSTATE = 23000
attempt to store duplicate value (visible to active transactions) in unique index "IDX_TAB_ID"
-Problematic key value is ("ID" = 1)

CONCURRENTLY를 사용하여 동일한 고유 인덱스 생성

Code
create unique index idx_tab_id on tab(id) concurrently;

경고가 발생합니다:

Code
Validation of unique index "IDX_TAB_ID" failed.
-attempt to store duplicate value (visible to active transactions) in unique index "IDX_TAB_ID"
-Problematic key value is ("ID" = 1)

인덱스가 존재하는지 확인:

Code
show index idx_tab_id;
IDX_TAB_ID UNIQUE NOT VALIDATED INDEX ON (ID)

NOT VALIDATED 표시에 주목하세요.

인덱스 검증:

Code
alter index idx_tab_id validate unique;
Statement failed, SQLSTATE = 23000
unsuccessful metadata update-Validation of unique index "IDX_TAB_ID" failed.
-attempt to store duplicate value (visible to active transactions) in unique index "IDX_TAB_ID"
-Problematic key value is ("ID" = 1)

중복 레코드를 수정하고 다시 검증

Code
update tab set id = 2 where f1 = '2';
commit;
alter index idx_tab_id validate unique;

오류가 없습니다.

인덱스 상태 확인:

Code
show index idx_tab_id;
IDX_TAB_ID UNIQUE INDEX ON (ID)

HQbird를 다운로드하고 지금 사용해 보세요: /ko/download-hqbird