요약

6. SQL튜닝 요약(1) - 패스트캠퍼스 백엔드 부트캠프 3기

gkss2tpt 2025. 3. 7. 14:13

1. 최적화

SQL 처리 과정과 I/O
SQL 파싱과 최적화
SQL(Structured Query Language) : 구조적(Structured), 집합적(Set-based, 선언적(Declarative) 질의 언어
구조적 : 2차원 테이블
집합적 : 데이터
선언적 : SELECT, DELETE... 이나 함수형
명력적 : JAVA

옵티마이저(컴파일러 역할) : 최적의 데이터 액세스 경로를 선택해 주는 DBMS의 핵심 엔진
특징
Rule base : 규칙기반(이제 안씀)
Cost base : 통계기반

SQL 최적화의 순서
파싱 -> 문법체크 -> 의미체크 -> 최적화 -> 명령어 생성
SQL 파싱
1. 파싱 트리 생성
2. 문법체크(Syntax) : 문법적 오류가 없는지 확인
3. 의미체크(Semanic) : 의미상 오류가 있는지, 권한이 있는지 확인
SQL 최적화
옵티마이저를 사용  : 통계정보를 바탕으로 비교 후 가장 효율적인 것을 선택

실행계획 : SQL실행경로 미리보기 기능(옵티마이저가 생성한 처리절차를 확인가능) - 트리구조

옵티마이저 힌트 : 주석(Java의 애너테이션과 같은 역할)
주의 사항 : 주석이기때문에 오류를 찾을 수 없다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

SQL 공유 및 재사용
소프트 파싱 : 캐시에서 데이터 가져오기
SGA(System Global Area) : 서버와 백그라운드가 공통으로 액세스하는 데이터와 제어 구조를 캐싱하는 메모리 공간
DB Buffer Cache : 데이터 캐시
Library Cache : SQL 캐시 - 최적화 과정을 거쳐 생성한 데이터를 반복 재사용

하드 파싱 : 디스크에서 데이터 가져오기, CPU를 많이 소비하는 작업, 압축작업
옵티마이저의 사용 정보 : 테이블,컬럼,인덱스구조에 관한 기본 정보, 테이블 통계, 인덱스 통계, 컬럼통계 등

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

바인드 변수의 중요성(PreparedStatement) - ?
SQL문을 함수로 사용한다.
이름없는 SQL : SQL은 이름이 따로 없고, 전체 SQL 텍스트가 이름 역할을 한다.
공유가능 SQL : 동적으로 변하는 부분을 바인드 변수(?)로 나머지 SQL문은 공유해서 사용

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

데이터 저장 구조 및 I/O 메커니즘
I/O 튜닝이 곧 SQL 튜닝이다.

SQL이 느린 이유
디스크 I/O 때문,  I/O를 하는 동안 CPU는 쉰다.

데이터베이스 저장 구조
논리적 저장 구조 - [테이블스페이스[세그먼트[익스텐트[블록[로우]]]]], 논리적으로는 하나의 저장공간처럼 나타낸다.
테이블 스페이스 : 세그먼트를 담는 콘테이너
세그먼트 : 여러 익스텐트로 구성된 데이터 저장 단위
익스텐트 : 여러 블록으로 구성된 데이터 할당 단위
블록 : 로우가 저장되는 실제 저장공간, I/O의 최소단위
로우 : DB테이블의 한 행, 하나의 데이터 단위

물리적 저장 구조 - [테이블스페이스[익스텐트(파일)[블록[로우]]]], 물리적으로 여러개의 저장공간으로 나타낸다.

블록 단위 I/O
오라클은 기본적으로 8KB 크기의 블록을 사용(2,4,16KB사용가능, OS에따라 32KB블록지원)
My SQL은 8KB 단인 사이즈 블록만지원

테이블스페이스의 저장 구조
테이블 세그먼트 : 배열 기반(시퀀셜 액세스), Single Block + Multiblock I/O(대용량 데이터를 읽을 때 빠르다)
인덱스 세그먼트 : 링크드리스트 기반(랜덤 액세스), Single Block I/O(소용량 데이터를 읽을 때 빠르다)

시퀀셜 액세스 : 순서대로 읽는 방식
랜덤 액세스 : 건너뛰어 읽는 방식 

논리적 I/O : 캐시에서 읽어오기
물리적 I/O : 디스크에서 읽어오기

메모리 캐시가 클수록 좋지만, 데이터를 모두 캐시에 적재할 수 없다.
Single Block I/O : 한 블록씩 요청해서 메모리에 적재하는 방식
Multiblock I/O : 여러 블록씩 요청해서 메모리에 적재하는 방식

테이블에 저장된 데이터를 읽는 두 가지 방식
Table Full Scan : 테이블 전체를 스캔해서 읽는 방식(시퀀셜 액세스)
Index Range Scan : 인덱스를 이용한 테이블 액세스(랜덤 액세스)