[DB]데이터베이스 SQL튜닝

2 minute read

데이터베이스 SQL튜닝

모든 서비스는 데이터베이스가 존재합니다. 우린 서비스를 사용할 때 데이터베이스의 데이터를 조회,삽입,삭제를 하게 되는데 이러한 행위를 프로그래밍언어로 SQL이라는 언어를 통해서 내부적으로 발생하게 됩니다.

SQL(Structed Query Language) 은 구조화된 언어라는 뜻으로 RDBMS를 위한 언어이기도 합니다.
RDBMS는 관계형 데이터베이스로 보통 Oracle, Mysql, SQL Server 등을 말하죠.

대부분의 서비스들은 RDBMS를 사용하고 있고, SQL을 통해서 데이터를 조작합니다.

대규모 데이터

데이터베이스에는 여러개의 스키마로 이루어져 있습니다. 하나의 스키마에는 많은 테이블이 존재하죠.
데이터가 많은 여러개의 테이블에 복잡한 SQL을 조회하다보면 속도가 현저히 떨어질 수 밖에 없습니다.

  • 옵티마이저
  • 인덱싱
  • Join Operation

옵티마이저

Optimizer는 SQL을 최적화 시켜주는 핵심엔진입니다. 개발자나 DBA가 작성한 SQL을 자동으로 최적화 시켜주는 엔진이죠.

  • 규칙기반 옵티마이저
    규칙기반은 말 그대로 규칙대로 옵티마이저가 실행됩니다. 1~10번 순서에 만족하는 규칙에 따라 SQL이 실행됩니다.

  • 비용기반 옵티마이저
    SQL을 분석하여 비용을 계산하여 최적화된 SQL로 실행됩니다. Oracle, Mysql 등 대부분의 DBMS가 현재 비용기반 옵티마이저입니다.

Image Alt 텍스트
이미지 출처 : 옵티마이저설명

Indexing

SQL은 Indexing을 통해서 SQL을 작성해야 합니다. Index는 테이블을 생성할 때 추가할 수 있고, ALTER 구문을 통해서 추가할 수 있습니다.
아래는 기본적으로 Table을 Create할 때 사용되는 Index DDL 문법입니다. 보통 Private Key에는 Index가 적용되어 있습니다.

SQL에 무조건 Index를 건다고 성능이 최적화 되는것은 아닙니다. 데이터조회의 양에 따라서 Index Scan이 더 비효율적일 수 있습니다.

  • Full Scan
    말 그대로 전체 테이블을 조회하거나 테이블의 데이터의 대다수를 조회할 때 Full Scan이 더 유리합니다.

  • Index Scan
    Index를 통해서 조회하는 방식입니다. 단건 조회에 Index Scan이 유리합니다.

* Full Table Scan
- 많은 양의 데이터 검색  유용함
- High Water Mark 아래의 모든 블록 I/O
- Multi Block I/O 수행 (db_file_multiblock_read_count)
* Index Unique Scan
- Unique Index 필요
- Single Block I/O 사용

Join Operation

테이블 조인에 대한 수행은 3가지로 나뉘어집니다. SQL작성시 3가지만 안다면 SQL튜닝 및 작성을 훨씬 수월하게 할 수 있습니다.

  • Nested Loops Join
  • Sort Merge Join
  • Hash Join
* Nested Loops Join
- 선행 테이블 (Outer Table) 결정  후행 테이블(Inner Table) 반복적인 접근
- 후행 테이블의 조인 컬럼에 인덱스 필요
- 소량의 데이터를 조인  사용
- 부분 범위 (first_rows) 처리에 최적화
- 많은 양의 데이터 조인  Random Access 증가
- DB 버전에 따라 Nested Loops Join 처리 절차는 개선된 부분이 존재함
* Sort Merge Join
- 각각의 집합을 조인 컬럼으로 정렬  조인 수행
- 정렬 작업이 완료되기  부분적인 조인 결과 도출 불가능
- 정렬해야  데이터가 많은 경우 부담이 가장  조인 방법
- Non equi join  사용 가능
* Hash Join
-  집합  크기가 작은 테이블을 선행 테이블(hash table) 결정  후행 테이블(Probe Table)
엑세스하여 조인
- Equi Join 에서만 사용 가능
- 대량의 데이터를 조인  사용
- 전체 범위 (all_rows) 최적화
- 소량의 데이터를 조인할  Hash Join  사용되면 불필요한 I/O 증가

Tags: ,

Categories:

Updated: