서버 개발/프로그래머를 위한 RDBMS

옵티마이저 맛보기

지노윈 2020. 5. 27. 09:41
반응형

우리는 데이터베이스에게 SQL Query를 통해 문제를 내고 데이터베이스는 옵티마이저는 최선을 다해 그 결과를 가져옵니다.

이 옵티마이저는 우리가 생각하는 이상으로 아주 뛰어난 녀석입니다.

 

 

Nested loop join을 한다면 여러분이 옵티마이저라면 guild와 user 두 테이블중 어떤 테이블을 먼저 드리아빙 하겠습니까?

  1. user 테이블을 읽고 guild테이블을 읽음
  2. 반대로 guild 테이블 읽고 user 테이블을 읽음

select B.guildname, A.userno, A.name
from [user] A, guild B
where A.guildno = B.guildno

Nested loop join : 어느 한 쪽 테이블을 먼저 드라이빙해서 조인하는 방식입니다.

 

select B.guildname, A.userno, A.name
from [user] A, guild B
WHERE A.guildno = B.guildno

-- 1
select B.guildname, A.userno, A.name
from [user] A
INNER LOOP JOIN guild B
ON B.guildno = A.guildno

-- 2
select B.guildname, A.userno, A.name
from [guild] B
INNER LOOP JOIN [user] A
ON A.guildno = B.guildno

먼저 드라이빙 하는 쪽의 테이블은 읽었으므로 이 테이블의 값이 상수로 바뀝니다.

 

2번으로 할 경우, 체크 조건이 없으므로 guild 테이블 1000건을 모두 읽습니다. 이 1000건 중 먼저 1 '테라짱' 이라는 길드가 상수로 바뀝니다.

다음과 같은 쿼리와 같은 형태로요.

select A.userno, A.name
from [user] A
where A.guildno = 1

user 테이블에는 guildno가 인덱스가 잡혀 있지 않으므로 10만건이 들어 있는 user 테이블을 풀 스캔합니다.

동일하게 나머지 99건의 길드를 처리하여 1000번 반복합니다.

1억(1000 X 10만)건의 데이터를 읽습니다.

 

이제 1번 방식으로 수행하는 옵티마이저를 살펴봅시다.

10만건 user 테이블을 먼저 읽습니다. user 테이블의 첫 번째 유저가의 guildno 값이 상수로 바뀝니다.

그러면 위에서와 비슷하게 다음과 같은 쿼리 형태가 됩니다.

select B.guildname
from [guild] B
where B.guildno = 1

이 경우에는 guild 테이블의 guildno는 PK이므로 unique index이므로 바로 row로 억세스하여 결과 값을 바로 얻어옵니다.

user 테이블 1번 full 스캔이 후 유니크 인덱스 스캔만을 합니다. 매번 디스크에서 읽는 것이 아니라 메모리에 올려두고 이러한 처리를 합니다.

당연히 1번 방식이 훨씬 빠릅니다.

 

옵티마이저는 사람들이 만든 것이기에 상식적으로 동작하며 퍼포먼스 향상을 위해 노력을 합니다. 옵티마이저는 절대로 2번 방식으로는 실행 계획을 세우지 않겠죠.

 

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 게임 서버 프로그래머가 알아야 할 RDBMS

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 옵티마이저 맛보기

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 테이블 조인 하면 느리다?

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 리커시브 모델의 활용

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 아크 모델(exclusive or)에서의 주의점

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 부분범위 처리와 전체 범위처리

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 인덱스의 제대 사용하자

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - DB 옵티마이저

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - Nested Loop/Sort Merge/Hash Join

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - DB 테이블 클러스터링 팩터

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - DB 절차적 사고 VS 집합적 사고

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - SQL 집합의 가공

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - SQL IN의 특징과 IN의 활용

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 서브 쿼리 활용

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 인라인 뷰의 활용