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

테이블 조인 하면 느리다?

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

다음의 1번과 2번 중 어느쪽이 더 빠를까요?

 

1. Join이 빠르다.

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

 

2. Join하지 않는 것이 빠르다.

select userno, name, guildname
from [user]

1번이 더 빠릅니다. 디스크 IO 보다 CPU와 메모리가 훨씬 빠르기 때문입니다. 퍼포먼스에 가장 큰 영향을 주는 것이 디스크 IO 입니다.

그럼 디스크 IO량이 어떻게 되는지 따져봅시다.

1번은 108 * 100 바이트(약 1만)+ 32 * 10만 바이트(약 320만) = 약 321만 바이트

2번은 132 * 10만 바이트(약 1320만) 바이트 = 약 1320만 바이트

디스크 IO량이 2번의 경우가 약 999만 바이트 더 많기 때문에 2번이 더 느립니다.

 

이러한 쿼리들을 실행하면 처음에 느립니다. 그런데 같은 쿼리를 또 실행하면 빨라 집니다. 왜일까요? 디스크 IO를 한 것이 아니라 메모리에 올라와 있기 때문에 메모리에서 바로 읽었기 때문입니다. 물런 같은 이유혼자 개발할때는 SQL을 어떻게 짜도 빠릅니다. 테스트 데이터만 입력해서 한다면 더더욱 그렇겠죠.

 

프로그래밍에서 CPU 캐시 히트율이 퍼포먼스에 영향을 주듯이 DB는 메모리 히트율이 성능에 영향을 줍니다. DB가 메모리 히트율 좋게 잘 돌아 가다가 갑자기 큰 테이블 풀 스캔해서 많은 량을 퍼 올려 버리면 자주 사용되어 메모리 히트가 되던 것들이 내려 가여 쓸모 없는 데이터가 메모리에 올라 옵니다. 그럼 DB 시스템이 엉망이 되겠죠. 이런 쿼리가 실행되는 것은 미꾸라지 한 마리가 흙탕물 만드는 것과 같습니다.

 

이러한 원리들을 모르고 막연히 잘 모르는 사람들은 Join 사용하지 말아라 심지어는 Join 사용 금지를 시키는 사람들도  있습니다. 지금은 이런 사람이 없겠죠. :)

Join을 하면 느리다고 생각하는 이유는 조인을 잘못하고서는 느리다고 생각하는 것입니다.

데이터베이스를 제대로 알고 사용하면 여렵지 않고 느리지도 않습니다.

 

[데이터베이스/게임 서버 프로그래머가 알아야 할 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] - 인라인 뷰의 활용