Ignite Index
Apache - Ignite도 여타 Database와 마찬가지로 Index가 있다. Index도 Memory 영역에 위치하여 조회에 사용된다.
Index를 만들고 사용하는 방법에 대해서 간략하게 설명 및 테스트를 해보자.
Index DDL
기본적으로 Ignite 는 Key - Value 구성으로 PK는 테이블 생성시 함께 생성해야한다.
추가적인 인덱스에 대해서는 따로 아래와 같이 생성 및 삭제를 할 수 있다.
-- index 생성
create index [INDEX NAME] on [TABLE NAME] ([COLUMN 1], [COLUMN 2] ...);
-- index 삭제
drop index [INDEX NAME];
실행계획 EXPLAIN
쿼리 최적화를 위해 실행계획을 확인 할 수 있는 EXPLAIN문을 지원한다.
사용방법은 아래와 같다.
EXPLAIN
SELECT *
FROM TB_TEST_BAN
WHERE COL_10 = 55
실행 할 쿼리위에 EXPLAIN을 기입 후 함께 실행한다.
테스트를 진행한 테이블은 COL_01을 PK로 가지고 있으며 아직 추가 인덱스를 만들기 전이다.
이렇게 실행한 쿼리는 결과 창에 두개의 결과 값으로 PLAN이 조회된다.
첫 번째 결과는 일반적으로 Index가 동작하는 쿼리에 대한 실행계획, 두 번째 결과는 맵 노드에 대한 쿼리가 포함된다.
Table Full Scan
EXPLAIN
SELECT *
FROM TB_TEST_BAN
WHERE COL_10 = 55
위에 조회한 쿼리에 대해서 인덱스 실행계획은 Table Full Scan 이다.
추가로 COL_10에 대한 인덱스가 없기에 당연히 실행계획은 Full Scan일 것이다.
FROM과 WHERE 사이에 실행계획에 대한 내용이 나온다.
Index Scan
COL_10에 대해서 인덱스를 생성해보면 어떻게 될까? 너무나 당연한 이야기지만 Index를 조회하여 탐색을 할 것이다.
-- index 생성
create index IX_TEST_BAN_01 on TB_TEST_BAN (COL_10, COL_11, COL_16, COL_30);
해당 테이블에 복합 Index 를 생성해보도록하자.
Index를 생성 후 Index의 조건에 맞게 select문을 조회해보도록 하겠다.
EXPLAIN
SELECT *
FROM TB_TEST_BAN
WHERE COL_10 = 55
Index가 없을 때의 실행계획과 차이가 나는 것을 알 수 있다. Table Full Scan 하던 값이 where절 조건에 맞는 Index Scan을 하고 있다.
Index Hint
쿼리를 최적화 하다보면 특정 쿼리에 특정 인덱스를 강제로 적용시켜야 할 때가 있다. 바로 쿼리 튜닝에 필수인 인덱스 힌트이다.
Ignite도 인덱스를 강제로 적용시키는 Index Hint 기능을 포함하고 있다.
테스트를 위해 미리 만들어져있는 PK와 IX_TEST_BAN_01을 제외한 여러개의 인덱스를 생성해보도록 하겠다.
-- Index 생성
create index IX_TEST_BAN_02 on TB_TEST_BAN (COL_09, COL_02, COL_03);
create index IX_TEST_BAN_03 on TB_TEST_BAN (COL_10, COL_14);
create index IX_TEST_BAN_04 on TB_TEST_BAN (COL_32, COL_02, COL_03);
IX_TEST_BAN_01와 선행 컬럼이 다른 IX_TEST_BAN_02 / IX_TEST_BAN_04 , IX_TEST_BAN_01와 선행 컬럼이 같은 IX_TEST_BAN_03를 추가로 생성해보았다.
EXPLAIN
SELECT *
FROM TB_TEST_BAN
WHERE COL_10 = 55
여전히 위에 쿼리의 실행계획은 IX_TEST_BAN_01 인덱스를 조회하여 select을 하고 있는데 힌트로 다른 인덱스를 사용해 보도록 하겠다.
Use Index - 1
선행 컬럼이 같은 IX_TEST_BAN_03인덱스를 사용하게 하는 쿼리를 실행해 보도록 하겠다.
EXPLAIN
SELECT *
FROM TB_TEST_BAN use index("IX_TEST_BAN_03")
WHERE COL_10 = 55
실행계획은 아래와 같다.
쿼리 힌트를 통해 IX_TEST_BAN_03의 인덱스를 사용하여 데이터를 조회했음을 알 수 있다.
Use Index - 2
그러면 하나 더 궁금한 내용으로 말도안되는 인덱스를 힌트로 사용하면 어떻게 될까?
Full Scan보다 효율이 안나올만한 인덱스를 조회에 사용해보도록 하자.
EXPLAIN
SELECT *
FROM TB_TEST_BAN use index("IX_TEST_BAN_02")
WHERE COL_10 = 55
다른 선행 컬럼을 가진 Index를 힌트로 사용해보았다.
결과는 아래와 같이 Table Full Scan을 하여 데이터를 조회한다. 기본적인 옵티마이저가 동작 한다는 것을 알 수 있게 되었다.
Index Ordering
인덱스는 데이터의 정렬의 집합이라고 할 수 있는데, 데이터를 조회할 때 인덱스를 통해 조회하게 된다면 과연 정렬을 보장하는가에 대한 테스트이다.
인덱스 IX_TEST_BAN_03을 선택하여 선행 조건인 COL_10만 조건으로 사용 후, 후행 조건인 COL_14에 대한 값을 확인해보도록 하자.
COL_14값이 정렬되어 순차적으로 나오는 것을 알 수 있다.
그렇다면 같은 선행 컬럼을 가지고 다른 후행 컬럼을 가지는 Index를 조회해 보도록하자.
IX_TEST_BAN_01 인덱스를 힌트로 사용하여 COL_10을 선행으로 후행 컬럼을 COL_11, COL_16, COL_30순으로 가지는 값을 조회해보자.
아까와 다르게 COL_14의 컬럼은 뒤죽박죽이며 COL_11, COL_16, COL_30 순으로 정렬되어 있음을 확인 할 수 있다.
'DATABASE > Ignite' 카테고리의 다른 글
[Ignite][Linux] 5. Cluster Node - 신규 노드 추가하기 (0) | 2024.03.23 |
---|---|
[Ignite][Linux] 4. Cluster Setting - 클러스터 노드 설정 (0) | 2024.03.09 |
[Ignite][Linux] 3-2. Config.xml - 보안 설정(계정) / 스키마 (0) | 2024.03.05 |
[Ignite][Linux] 3-1. Config.xml - Memory / disk 관련 기본 설정 (0) | 2024.02.27 |
[Ignite][Linux] 2. Setting - Docker를 활용한 Ignite 세팅 (1) | 2024.02.20 |
[Ignite][Linux] 1. Setup - Docker를 활용한 Ignite 설치 (0) | 2024.02.17 |