본문 바로가기
DATABASE/Ignite

[Ignite] Index - 생성부터 실행 계획과 힌트까지 인덱스의 모든 것

by DANEW 2024. 3. 2.

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 순으로 정렬되어 있음을 확인 할 수 있다. 

반응형