CREATE INDEX
CREATE INDEX
기존 하이브리드 테이블(hybrid table)에 새 보조 인덱스(secondary index)를 만들고 인덱스를 데이터로 채우는 명령이에요. 인덱스 생성은 온라인(비차단) 작업이에요.
출처: 문서
본문
기존 하이브리드 테이블에 새 보조 인덱스를 만들고 인덱스를 데이터로 채워요.
인덱스 생성은 온라인(비차단) 작업이에요. 인덱스가 만들어지는 동안 하이브리드 테이블은 SELECT와 DML 문에 계속 사용할 수 있어요. 다만 하이브리드 테이블이 활발히 사용되지 않고 다운타임이 문제되지 않는다면, Snowflake는 인덱스가 정의된 상태로 하이브리드 테이블을 다시 만드는 것을 권장해요. 하이브리드 테이블 만들기(Create hybrid tables)와 하이브리드 테이블 인덱스(Index hybrid tables)를 함께 참고해요.
함께 보기: DROP INDEX, SHOW INDEXES, CREATE HYBRID TABLE, DROP TABLE, DESCRIBE TABLE, SHOW HYBRID TABLES
구문 (Syntax)
CREATE [ OR REPLACE ] INDEX [ IF NOT EXISTS ] <index_name>
ON <table_name>
( <col_name> [ , <col_name> , ... ] )
[ INCLUDE ( <col_name> [ , <col_name> , ... ] ) ]
매개변수 (Parameters)
index_name
새 인덱스의 식별자를 지정해요. 주어진 하이브리드 테이블의 각 새 인덱스에 고유한 이름을 지정해야 해요. 같은 이름 또는 같은 정렬된 컬럼 집합을 가진 다른 보조 인덱스는 하이브리드 테이블에 존재할 수 없어요.
table_name
새 인덱스를 담을 기존 하이브리드 테이블의 이름을 지정해요.
col_name
하이브리드 테이블 안의 기존 컬럼의 이름을 지정해요. 테이블 생성 시 정의된 인덱스 컬럼에 대한 모든 요구 사항이 컬럼 식별자에 적용돼요.
하이브리드 테이블은 같은 정렬된 컬럼 집합에 정의된 보조 인덱스 두 개를 포함할 수 없어요.
지리공간(geospatial) 데이터 유형(GEOGRAPHY, GEOMETRY), 반정형(semi-structured) 데이터 유형(ARRAY, OBJECT, VARIANT), 벡터 데이터 유형(VECTOR) 컬럼은 보조 인덱스에서 지원되지 않아요.
선택 매개변수 (Optional parameters)
INCLUDE ( col_name [ , col_name , ... ] )
보조 인덱스에 대한 포함(include) 컬럼을 하나 이상 지정해요. 보조 인덱스와 함께 포함 컬럼을 사용하면 쿼리가 SELECT 목록에 컬럼 집합을 자주 포함하지만 WHERE 조건 목록에는 포함하지 않을 때 특히 유용해요. 자세한 내용은 INCLUDE 컬럼을 참고해요.
INCLUDE 컬럼은 반정형 컬럼(VARIANT, OBJECT, ARRAY)이나 지리공간 컬럼(GEOGRAPHY, GEOMETRY)일 수 없어요.
접근 제어 요구 사항 (Access control requirements)
인덱스를 만들려면 하이브리드 테이블에 대한 OWNERSHIP 권한이 있는 역할을 사용해야 해요.
사용 메모 (Usage notes)
CREATE INDEX 명령으로 외래 키·기본 키·고유 키 제약 조건을 추가할 수 없어요.
새 인덱스 생성은 다른 워크로드를 동시에 차단하지 않아요. 하이브리드 테이블은 동시 SELECT와 DML 문에 사용할 수 있어요.
하이브리드 테이블당 한 번에 하나의 활성 인덱스 빌드 작업만 실행할 수 있어요.
SHOW INDEXES를 사용해 인덱스 빌드의 진행 상황을 추적할 수 있어요. status 컬럼은 다음 값을 가질 수 있어요.
ACTIVE: 인덱스가 완성되어 데이터 검색에 사용할 수 있어요.SUSPENDED: 인덱스는 업데이트만 되고 데이터 검색에는 사용되지 않아요.BUILD FAILURE: 인덱스 빌드 프로세스에 오류가 발생했어요. 인덱스를 삭제하고 다시 만들어야 해요.BUILD IN PROGRESS: 인덱스가 만들어지고 있으며 데이터 검색에는 사용되지 않아요.BUILD VALIDATION FAILURE: 인덱스가 ALTER TABLE로 추가한 UNIQUE 또는 FOREIGN KEY 제약 조건을 뒷받침하며, 테이블에 이미 있는 행이 그 제약 조건을 위반해요. 자세한 내용은 기존 데이터가 제약 조건을 위반하는 경우(When existing data violates the constraint)를 참고해요.
SUSPENDED, BUILD FAILURE, BUILD IN PROGRESS 상태인 비활성 인덱스는 DROP INDEX와 CREATE INDEX로 다시 빌드할 수 있어요. BUILD VALIDATION FAILURE 상태의 인덱스는 제약 조건을 뒷받침하므로 이 방식으로 다시 빌드할 수 없어요. 대신 ALTER TABLE로 제약 조건을 삭제하고 다시 추가해요.
만들어지고 있는 인덱스의 일부인 컬럼을 삭제하려면 먼저 인덱스를 삭제해 인덱스 빌드를 중지한 뒤 컬럼을 삭제해요. 인덱스를 삭제하기 전에 컬럼을 삭제하려고 하면 다음 오류 메시지가 표시돼요.
Column '<col_name>' cannot be dropped because it is used by index '<index-name>'.
온라인 인덱스 빌드는 CREATE INDEX 문이 발행된 시점에 같은 테이블에서 DML이 있는 활성 트랜잭션이 모두 완료될 때까지 진행되지 않아요. 그 트랜잭션 중 하나라도 5분 이상 유휴 상태로 남으면 기본적으로 중단(abort)돼요. 트랜잭션(Transactions)을 참고해요.
인덱스 빌드 프로세스 동안 어떤 DML도 새 인덱스에 쓰기는 하지만, 데이터 검색에 인덱스를 사용하지는 않아요.
CREATE INDEX 명령 완료 이후 실행되기 시작한 소수의 동시 DML은 실패하고 다음 오류를 반환할 수 있어요.
DML was unaware of concurrent DDL. Please retry this query.
중단된 DML 문이 여러 문으로 된 트랜잭션에 속한다면, TRANSACTION_ABORT_ON_ERROR 매개변수가 TRUE로 설정된 경우에만 트랜잭션이 롤백돼요.
새로 만든 인덱스는 인덱스 빌드 프로세스가 성공적으로 끝나고 인덱스 상태가 ACTIVE일 때만 데이터 검색에 사용돼요.
인덱스된 컬럼은 데이터 정렬(collation)을 지원하지 않아요. 자세한 내용은 하이브리드 테이블 컬럼의 데이터 정렬(Collations on hybrid table columns)과 데이터 정렬 제어(Collation control)를 참고해요.
OR REPLACE와 IF NOT EXISTS 절은 서로 배타적이에요. 같은 문에서 둘 다 사용할 수 없어요.
CREATE OR REPLACE <object> 문은 원자적(atomic)으로 동작해요. 즉, 객체를 교체할 때 기존 객체는 삭제되고 새 객체는 단일 트랜잭션 안에서 생성돼요.
예시 (Examples)
다음 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. |
+-------------------------------------+
더 알아보기 (Learn more)
- CREATE HYBRID TABLE — 하이브리드 테이블 생성
- DROP INDEX — 인덱스 삭제
- SHOW INDEXES — 인덱스 조회