Files
kui-vault/content/03.Note/데이터 조인이 느린 이유.md
T
2026-05-04 10:30:04 +09:00

2.5 KiB

id, created, tags, aliases
id created tags aliases
데이터 조인이 느린 이유 20260420 2026-04-20 10:55

💡 생각

조인은 무거운 연산이 맞고 인덱스를 잘 걸어야 그나마 좀 빠릿빠릿하게 동작한다.


📑 개념

관계형 데이터베이스(RDBMS)에서 조인(Join) 이 무거운 연산으로 취급되는 이유는 단순히 데이터를 합치는 것을 넘어, 컴퓨터 자원(CPU, Memory, I/O)을 집약적으로 사용하기 때문입니다.

📌 상세

1. 데이터의 곱집합(Cartesian Product) 기반 탐색

기본적으로 조인은 두 테이블의 행들을 조합하는 과정입니다. 최악의 경우, 한쪽 테이블의 행 개수가 $M$이고 다른 쪽이 $N$이라면 $M \times N$만큼의 연산이 필요할 수 있습니다.

  • 비교 횟수: 적절한 인덱스가 없다면, 시스템은 모든 경우의 수를 하나하나 대조해야 합니다. 데이터가 커질수록 이 비교 횟수는 기하급수적으로 늘어납니다.

2. 디스크 I/O 발생

데이터베이스 성능의 가장 큰 병목은 디스크 읽기입니다.

  • 조인을 수행하기 위해 서로 다른 테이블의 데이터 블록을 메모리(Buffer Pool)로 끌어올려야 합니다.

  • 데이터가 너무 커서 메모리 공간이 부족하면, 중간 결과를 다시 디스크에 썼다가 읽는 Temporary I/O가 발생하여 속도가 급격히 느려집니다.

[!question] Q. Temporary I/O가 일종의 스왑메모리같은 그런 느낌인거야? A. 네, 정확한 비유입니다. Temporary I/O는 데이터베이스 입장에서 일종의 '디스크 기반 스왑(Swap)' 역할을 한다고 이해하시면 됩니다.

데이터를 처리하려면 메모리에 올려야하는데 처리해야하는 데이터가 너무 커서 db에 할당된 메모리 크기를 초과할 경우 DB는 Temporary I/O 처리를 하게된다. 이게 결국 하드디스크에 데이터를 기록해뒀다가 다시 메모리로 올리는 작업을 의미하기 때문에 속도에 굉장히 큰 악영향을 미치게 된다.

3. 인덱스 관리 및 랜덤 액세스

인덱스를 타고 데이터를 찾는 과정에서도 비용이 발생합니다.

  • 랜덤 액세스: 인덱스를 통해 테이블의 실제 데이터 위치를 찾아갈 때, 디스크의 여기저기를 흩어져서 읽어야 하는 '랜덤 액세스'가 발생하며 이는 연속된 데이터를 읽는 것보다 훨씬 느립니다.