CREATE INDEX¶
기존 하이브리드 테이블 에 새로운 보조 인덱스를 만들고 인덱스를 데이터로 채웁니다.
인덱스 생성은 온라인(비차단) 작업입니다. 하이브리드 테이블은 인덱스가 작성되는 동안 SELECT 및 DML 문에 대해 계속 사용할 수 있습니다. 그러나 하이브리드 테이블이 활발하게 사용되지 않고 다운타임이 문제가 되지 않는 경우 정의된 인덱스로 하이브리드 테이블을 다시 만드는 것이 좋습니다. 하이브리드 테이블 만들기 및 인덱스 하이브리드 테이블 섹션도 참조하세요.
- 참고 항목:
DROP INDEX , SHOW INDEXES , CREATE HYBRID TABLE , DROP TABLE , DESCRIBE TABLE , SHOW HYBRID TABLES
구문¶
CREATE [ OR REPLACE ] INDEX [ IF NOT EXISTS ] <index_name>
ON <table_name>
( <col_name> [ , <col_name> , ... ] )
[ INCLUDE ( <col_name> [ , <col_name> , ... ] ) ]
매개 변수¶
index_name새 인덱스의 식별자를 지정합니다. 특정 하이브리드 테이블의 새 인덱스 각각에 대해 고유한 이름을 지정해야 합니다. 이름이 동일하거나 동일하게 정렬된 열 세트가 있는 다른 보조 인덱스가 하이브리드 테이블에 존재할 수 없습니다.
table_name새 인덱스를 보유할 기존 하이브리드 테이블의 이름을 지정합니다.
col_name하이브리드 테이블에서 기존 열 이름을 지정합니다. 테이블 생성 시 정의된 인덱스 열에 대한 모든 요구 사항이 열 식별자에 적용됩니다.
하이브리드 테이블에는 동일하게 정렬된 열 세트에 정의된 보조 인덱스가 두 개 포함될 수 없습니다.
지리 공간 데이터 타입 (GEOGRAPHY 및 GEOMETRY), 반정형 데이터 타입 (ARRAY, OBJECT, VARIANT) 및 벡터 데이터 타입 (VECTOR)이 있는 열은 보조 인덱스에서 지원되지 않습니다.
선택적 매개 변수¶
INCLUDE ( col_name [ , col_name , ... ] )보조 인덱스에 포함된 열을 하나 이상 지정합니다. 보조 인덱스와 함께 포함된 열을 사용하는 것은 쿼리가 종종 SELECT 목록에는 열 세트를 포함하지만 WHERE 조건자 목록에는 포함하지 않는 경우에 특히 유용합니다. 자세한 내용은 INCLUDE 열 섹션을 참조하십시오.
INCLUDE 열은 반정형 열(VARIANT, OBJECT, ARRAY) 또는 지리 공간 열(GEOGRAPHY, GEOMETRY)이 될 수 없습니다.
액세스 제어 요구 사항¶
인덱스를 생성하려면 하이브리드 테이블에 대한 OWNERSHIP 권한이 있는 역할을 사용해야 합니다.
사용법 노트¶
CREATE INDEX 명령은 외래, 기본 또는 고유 키 제약 조건을 추가하는 데 사용할 수 없습니다.
새 인덱스를 생성해도 다른 워크로드가 동시에 차단되지는 않습니다. 하이브리드 테이블은 동시 SELECT 및 DML 문에 사용할 수 있습니다.
언제든지 하이브리드 테이블당 하나의 활성 인덱스 빌드 작업만 실행할 수 있습니다.
SHOW INDEXES 를 사용하여 인덱스 작성 진행 상황을 추적할 수 있습니다. STATUS 열은 다음 값을 가질 수 있습니다.
ACTIVE: 인덱스가 완성되어 데이터를 검색하는 데 사용할 수 있습니다.SUSPENDED: 인덱스는 업데이트만 되며, 데이터 검색에는 사용되지 않습니다.BUILD FAILURE: 인덱스 작성 과정에서 오류가 발생했습니다. 인덱스를 삭제하고 다시 생성해야 합니다.BUILD IN PROGRESS: 인덱스가 작성 중이며 데이터 검색에 사용되지 않습니다.
DROP INDEX 및 CREATE INDEX를 사용하여 상태가
SUSPENDED,BUILD FAILURE또는BUILD IN PROGRESS인 비활성 인덱스를 다시 작성할 수 있습니다.작성 중인 인덱스의 일부인 열을 삭제하려면 먼저 인덱스를 삭제하여 인덱스 작성을 중지한 다음 열을 삭제합니다. 인덱스를 삭제하기 전에 열을 삭제하려고 하면 다음 오류 메시지가 표시됩니다.
Column '<col_name>' cannot be dropped because it is used by index '<index-name>'.CREATE INDEX 문이 실행된 시점에 동일한 테이블에서 DML이 포함된 모든 활성 트랜잭션이 완료될 때까지 온라인 인덱스 작성이 진행되지 않습니다. 해당 트랜잭션 중 하나라도 5분 이상 유휴 상태로 유지되면 기본적으로 트랜잭션이 중단됩니다. 트랜잭션 섹션을 참조하십시오.
인덱스 작성 과정 중에 모든 DML은 새 인덱스에 대한 쓰기 작업을 수행하지만 인덱스를 사용하여 데이터를 검색하지는 않습니다.
CREATE INDEX 명령이 완료된 후 실행을 시작한 소수의 동시 DML이 실패하고 다음 오류를 반환할 수 있습니다.
DML was unaware of concurrent DDL. Please retry this query.중단된 DML 문이 다중 문 트랜잭션에 속하는 경우 해당 트랜잭션은 TRANSACTION_ABORT_ON_ERROR 매개 변수가 TRUE로 설정된 경우에만 롤백됩니다.
새로 생성된 인덱스는 인덱스 작성 과정이 성공적으로 마무리되고 인덱스 상태가
ACTIVE인 경우에만 데이터 검색에 사용됩니다.인덱싱된 열은 데이터 정렬을 지원하지 않습니다. 자세한 내용은 하이브리드 테이블 열의 데이터 정렬 및 데이터 정렬 제어 섹션을 참조하십시오.
OR REPLACE및IF NOT EXISTS절은 상호 배타적입니다. 두 문자를 같은 문에 함께 사용할 수 없습니다.CREATE OR REPLACE <오브젝트> 문은 원자성입니다. 즉, 오브젝트가 바뀔 때 단일 트랜잭션으로 이전 오브젝트가 삭제되고 새 오브젝트가 생성됩니다.
예¶
다음 CREATE INDEX 예제를 실행하려면 먼저 하이브리드 테이블을 만들고 로드합니다.
CREATE OR REPLACE HYBRID TABLE mytable (
pk INT PRIMARY KEY,
val INT,
val2 INT
);
INSERT INTO mytable SELECT seq, seq+100, seq+200
FROM (SELECT seq8() seq FROM TABLE(GENERATOR(rowcount => 100)) v);
이제 테이블에 인덱스를 만들 수 있습니다.
CREATE OR REPLACE INDEX vidx ON mytable (val);
+----------------------------------+
| status |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+
인덱스 작성 중에 오류가 발생하면 SHOW INDEXES 명령은 다음 상태를 보고합니다.
BUILD FAILURE Index build failed. Please drop the index and re-create it.
인덱스 작성을 중지하기로 결정한 경우에는 DROP INDEX 명령을 사용하십시오.
DROP INDEX mytable.vidx;
+-------------------------------------+
| status |
|-------------------------------------|
| Statement executed successfully. |
+-------------------------------------+