인덱스 하이브리드 테이블¶
이 항목에서는 :doc:`하이브리드 테이블</user-guide/tables-hybrid>`을 인덱싱하는 방법에 대해 설명합니다.
인덱스의 유형¶
하이브리드 테이블은 다음 두 가지 유형의 인덱스를 지원합니다.
하이브리드 테이블 열에 대한 제약 조건을 선언할 때 자동으로 생성되는 인덱스.
PRIMARY KEY 제약 조건에 대한 인덱스
FOREIGN KEY 제약 조건에 대한 인덱스
UNIQUE 제약 조건에 대한 인덱스
*보조 인덱스*라는 사용자 정의 인덱스로, 필요에 따라 다른 열에 정의할 수 있습니다. 단일 인덱스는 하나 이상의 열을 포함할 수 있습니다. CREATE HYBRID TABLE 또는 CREATE INDEX를 사용하여 보조 인덱스를 정의합니다.
보조 인덱스를 만들 때 인덱스 키의 일부는 아니지만 인덱스 자체와 연결되고 저장된 열을 ‘포함’할 수 있습니다. INCLUDE 열 섹션을 참조하십시오.
주의
보조 인덱스를 추가하려면 하이브리드 테이블에 대한 SELECT 권한이 부여된 역할을 사용해야 합니다. 하이브리드 테이블의 데이터 뷰에 액세스할 수 있지만 테이블 자체에는 액세스할 수 없는 경우 보조 인덱스를 추가할 수 없습니다.
보조 인덱스 추가¶
모든 하이브리드 테이블에는 고유한 기본 키가 필요합니다. 하이브리드 테이블의 데이터는 이 기본 키에 따라 정렬됩니다. 기본 키가 아닌 특성에 대한 추가 보조 인덱스를 생성하여 해당 특성에 대한 조회를 가속화할 수 있습니다. 인덱스는 쿼리 조건자가 다음 조건 중 하나를 사용할 때 스캔되는 레코드 수를 줄일 수 있습니다.
=
,>
,>=
,<
,<=
(비교 연산자)[ NOT ] IN 조건
특정 속성 또는 복합 속성 그룹에 대한 조건자를 사용하는 공통적이고 반복되는 쿼리가 있는 경우 해당 속성 또는 속성 그룹에 인덱스를 추가하여 성능을 향상해 보십시오. 그러나 인덱스를 사용할 때는 다음 고려 사항에 유의하십시오.
인덱스에 데이터 하위 세트의 추가 복사본을 저장하면 저장소 소비가 증가합니다.
인덱스가 동기적으로 유지 관리되므로 DMLs에 오버헤드가 추가됩니다.
하이브리드 테이블을 생성할 때 보조 인덱스를 추가하거나 나중에 CREATE INDEX 명령을 사용하여 추가할 수 있습니다. 예를 들어, 다음 CREATE HYBRID TABLE 문은 두 개의 인덱스를 자동으로(PRIMARY KEY 및 UNIQUE 열, col1
및 col2
) 생성하고 하나의 사용자 정의 보조 인덱스(col3
)를 생성합니다.
CREATE OR REPLACE HYBRID TABLE target_hybrid_table (
col1 VARCHAR(32) PRIMARY KEY,
col2 NUMBER(38,0) UNIQUE,
col3 NUMBER(38,0),
INDEX index_col3 (col3)
)
AS SELECT col1, col2, col3 FROM source_table;
또는 CREATE INDEX 명령을 사용하여 기존 하이브리드 테이블에 대한 보조 인덱스를 생성할 수 있습니다. 이 명령을 사용하여 워크로드에 활발하게 사용 중이고 쿼리를 제공하거나 외래 키가 있는 하이브리드 테이블에 인덱스를 추가할 수 있습니다. CREATE INDEX 명령은 작업 중에 테이블을 잠그지 않고 인덱스를 동시에 빌드합니다.
팁
SHOW INDEXES 명령으로 인덱스 빌드 상태를 확인합니다. 한 번에 하나의 인덱스 빌드만 지원됩니다.
그러나 하이브리드 테이블 애플리케이션이 개발 또는 테스트 모드에 있고 테이블의 일부 다운타임이 문제가 되지 않는 경우에는 하이브리드 테이블을 다시 생성하고 최적화된 대량 로드를 실행하여 인덱스를 생성하는 것이 더 효율적입니다. 이 방법은 CREATE INDEX 명령을 사용한 온라인 인덱스 작성보다 더 효율적입니다.
CTAS, COPY, INSERT INTO … SELECT에 대해 최적화된 대량 로딩이 지원되지만, 테이블에 FOREIGN KEY 제약 조건이 있는 경우 CTAS를 사용할 수 없습니다. 이 예제에서 생성된 두 번째 테이블인 fk_hybrid_table
은 COPY 또는 INSERTINTO … SELECT로 일괄 로딩해야 합니다.
CREATE OR REPLACE HYBRID TABLE ref_hybrid_table (
col1 VARCHAR(32) PRIMARY KEY,
col2 NUMBER(38,0) UNIQUE
);
CREATE OR REPLACE HYBRID TABLE fk_hybrid_table (
col1 VARCHAR(32) PRIMARY KEY,
col2 NUMBER(38,0),
col3 NUMBER(38,0),
FOREIGN KEY (col2) REFERENCES ref_hybrid_table(col2),
INDEX index_col3 (col3)
);
INCLUDE 열¶
보조 인덱스 키의 일부는 아니지만, INCLUDE 열은 인덱스 레코드와 함께 저장됩니다. 실제 인덱싱된 열과 포함된 열 데이터 간의 이러한 연결로 인해, 특정 쿼리는 테이블 스캔을 방지하고 인덱스를 사용하는 비용이 적게 드는 스캔의 이점을 누릴 수 있습니다. 그러나 인덱스에 포함된 열을 사용하면 추가 열이 인덱싱된 열과 함께 저장되므로 저장소 사용량이 증가할 수 있습니다.
다음과 같은 테이블과 인덱스를 예로 들어 보겠습니다. 이 경우 인덱스는 CREATE TABLE 문 또는 CREATE INDEX 문 중 하나에서 선언할 수 있습니다.
CREATE OR REPLACE HYBRID TABLE sensor_data_device1 (
device_id VARCHAR(10),
timestamp TIMESTAMP PRIMARY KEY,
temperature DECIMAL(6,4),
vibration DECIMAL(6,4),
motor_rpm INT
);
CREATE INDEX sec_sensor_idx
ON TABLE sensor_data_device1(temperature)
INCLUDE (vibration, motor_rpm);
이 보조 인덱스는 하나의 열을 직접(temperature
) 포함하고 두 개의 열을 간접적으로(vibration, motor_rpm
) 포함하기 때문에 인덱스를 사용하여 ``temperature``를 제한하고 포함된 열에서 데이터를 선택하는 특정 쿼리를 최적화할 수 있습니다.
이 동작을 테스트하려면 먼저 테이블에 대한 일부 행을 생성합니다.
INSERT INTO sensor_data_device1 (device_id, timestamp, temperature, vibration, motor_rpm)
SELECT 'DEVICE1', timestamp,
UNIFORM(25.1111, 40.2222, RANDOM()), -- Temperature range in °C
UNIFORM(0.2985, 0.3412, RANDOM()), -- Vibration range in mm/s
UNIFORM(1400, 1495, RANDOM()) -- Motor RPM range
FROM (
SELECT DATEADD(SECOND, SEQ4(), '2024-03-01') AS timestamp
FROM TABLE(GENERATOR(ROWCOUNT => 2678400)) -- seconds in 31 days
);
이제 다음 쿼리를 실행합니다.
SELECT temperature, vibration, motor_rpm
FROM sensor_data_device1
WHERE temperature = 25.6;
이 쿼리는 이름이 ``sec_sensor_idx``인 보조 인덱스를 사용합니다. EXPLAIN 명령을 쿼리에서 실행하거나 |sf-web-interface|에서 쿼리 프로필을 검토하여 이 동작을 확인할 수 있습니다. 보조 인덱스에는 인덱스 스캔이 표시되며 하이브리드 테이블 자체에는 ‘프로브 스캔’이 표시되지 않습니다.
지원되는 다른 WHERE 절을 사용하는 다음 쿼리 절 조건도 동일한 보조 인덱스의 이점을 누릴 수 있습니다.
SELECT temperature, vibration, motor_rpm
FROM sensor_data_device1
WHERE temperature IN (25.6, 31.2, 35.8);
SELECT temperature, vibration, motor_rpm
FROM sensor_data_device1
WHERE temperature BETWEEN 25.0 AND 26.0;
이제 device_id
열을 선택 목록에 추가하여 첫 번째 쿼리를 수정합니다. 이 열은 sec_sensor_idx
인덱스에 포함되지 않습니다.
SELECT device_id, temperature, vibration, motor_rpm
FROM sensor_data_device1
WHERE temperature = 25.6;
이 쿼리는 보조 인덱스에 전적으로 의존할 수 없습니다. 올바른 device_id
값을 반환하려면 하이브리드 테이블의 프로브 스캔이 필요합니다.