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. |
+-------------------------------------+