📊 DBMS와 SQL 처리 과정 🛠️
1. DBMS와 SQL
- DBMS (Database Management System): 데이터베이스 관리 시스템 (예: Oracle, MySQL, PostgreSQL 등)
- SQL (Structured Query Language): DBMS에 명령을 내리기 위한 언어, 구조적이고 집합적이며 선언적인 질의 언어
2. DBMS가 SQL을 처리하는 과정
- 사용자가 SQL 입력
사용자가 원하는 데이터를 찾기 위해 SQL을 작성
- SQL 분석 & 실행계획 생성
SQL은 선언적으로 실행방법이 정해져 있지 않기 때문에 DBMS는 사용자가 작성한 SQL을 분석하여, 가장 효율적인 실행계획을 프로시저 형태로 자동 생성
- SQL 최적화
실행계획을 컴파일하여 실제 실행 가능한 상태로 변환
⚙️ SQL 최적화 과정 🧑💻
- SQL 파싱
- 파싱 트리를 생성하여 SQL의 각 구성 요소를 분석
- SQL의 문법(Syntax)과 의미(Semantics)를 체크
- SQL 최적화
- DBMS는 여러 실행계획을 평가하고 가장 효율적인 실행계획을 선택
- 로우소스 생성
- 최적화된 실행계획을 실제 실행 가능한 코드나 프로시저 형태로 변환
🧠 소프트파싱 vs 하드파싱 🔄
-
SGA (System Global Area)
DBMS의 메모리 공간으로, 데이터베이스 인스턴스가 작동하는 동안 필요한 공유 메모리 구조
- DB Buffer Cache: 디스크에서 읽어온 데이터를 저장하여, 반복적인 접근 시 성능을 높임
- Shared Pool: 실행 계획, 파싱된 SQL, 데이터 딕셔너리 정보 등을 저장하여 동일한 SQL이 다시 실행될 때 성능을 향상
- Redo Log Buffer: 트랜잭션 로그를 저장하여 복구에 활용
-
하드파싱(Hard Parsing)
- SQL을 실행할 때, DBMS는 최적의 실행계획을 찾아야 함. 이 과정은 CPU 자원을 많이 사용하고, 실행계획을 새로 생성하는 하드파싱이 발생
- 하드파싱이 끝난 후 실행계획은 Shared Pool의 라이브러리 캐시(Library Cache)에 저장되어, 재사용이 가능
-
소프트파싱(Soft Parsing)
- 쿼리가 라이브러리 캐시에 이미 존재하면, DBMS는 실행계획을 재사용하여 최적화 없이 바로 실행.
💡 SQL 처리 속도가 느려지는 이유 🐢
- SQL 처리 속도는 디스크 I/O(디스크에서 데이터를 얼마나 읽느냐)에 달려 있음
📊 논리적 I/O와 물리적 I/O의 개념 🧠
-
논리적 I/O:
- 데이터가 메모리에 이미 존재할 때 발생하는 I/O로, 디스크에서 데이터를 읽지 않고 메모리 내에서만 데이터를 처리합니다. 논리적 I/O는 디스크 액세스가 없으므로 속도가 빠름.
-
물리적 I/O:
- 데이터가 메모리에 없을 때, 즉 Buffer Cache에 데이터가 없을 때 발생하는 I/O로, 디스크에서 데이터를 읽어와야 하므로 디스크 액세스가 발생하고, 상대적으로 속도가 느림. 이 과정에서 데이터는 디스크 블록 단위로 읽혀 Buffer Cache에 적재.
- 사용자가 SQL을 실행하면
- 서버 프로세스가 SGA의 Buffer Cache를 확인
- 데이터가 캐시에 있으면: 논리적 I/O 발생
- 데이터가 캐시에 없으면: 디스크 I/O 발생하여, 디스크에서 블록 단위로 읽어와 Buffer Cache에 적재
- 읽은 블록에서 필요한 Row 추출
- 결과 반환
목표: 물리적 I/O를 최소화하고, 논리적 I/O를 최대화해야 성능을 최적화할 수 있음.
⚙️ I/O를 줄이는 방법 💨
- 데이터를 적게 읽는 방법으로 I/O를 줄일 수 있음
- 인덱스 사용
데이터를 빠르게 조회할 수 있도록 인덱스를 활용
- 적절한 조인 순서 및 방식
쿼리의 조인 순서와 방식을 최적화하여 불필요한 데이터 조회를 줄임
- 실행계획 분석
실행계획을 분석하여, 최적화되지 않은 부분을 찾아 개선
🧾 정리: DBMS는 SQL을 어떻게 실행할까?
DBMS는 사용자가 입력한 선언적 SQL 문을 아래와 같은 일련의 절차를 거쳐 실행합니다:
-
SQL 파싱
- 문법과 의미를 분석하여 파싱 트리를 생성합니다.
-
실행계획 최적화
- 다양한 실행 방법 중 가장 효율적인 실행계획을 선택합니다.
-
실행계획 컴파일 및 실행 준비
- 실행계획을 실제 실행 가능한 형태(로우 소스)로 변환합니다.
-
라이브러리 캐시 확인 (소프트파싱 여부)
- 동일한 SQL이 이미 처리된 적이 있다면 소프트파싱을 통해 실행계획을 재사용합니다.
- 없다면 하드파싱이 수행되어 새로운 실행계획을 생성합니다.
-
데이터 액세스 (논리적/물리적 I/O)
- 필요한 데이터가 메모리(Buffer Cache)에 있으면 논리적 I/O,
- 없으면 디스크에서 읽어오는 물리적 I/O가 발생합니다.
-
결과 반환
✅ 즉, DBMS는 SQL을 파싱 → 최적화 → 컴파일 → 실행의 단계를 거쳐 실행하며,
메모리 활용과 실행계획 재사용 여부, I/O 효율성이 성능에 결정적인 영향을 미칩니다.
출처 : 도서<친절한 SQL튜닝>