DBMS가 데이터에 접근 하는 방법
RDB에서 데이터 접근 절차를 결정하는 모둘은 쿼리 평가 엔진이라 부릅니다.
1. 파서(parser) [서류 심사]
이름 그대로 (구문 분석) 하는 것입니다.
프로그래밍 언어의 컴파일 시점에서도 실행 되는 그 오류 비스무리 합니다.
2. 옵티마이져(optimizer) [최적화]
위 (구문 분석) 과정을 서류 심사라고 부르겠습니다.
서류 심사를 통과한 쿼리는 옵티마이져로 전송됩니다.
최적화의 대상은 실행 게획 입니다. 즉 실행 계획을 최적화 하는 역활을 하는 아주 중요한 녀식이죠
옵티마이져는 인텍스 유무, 데이터 분산 또는 편향 정도, DBMS 내부 매개변수 등 여러 조건을 고려해서 , 선택 가능한 많은 실행 계획을 작성하고, 이들의 비용을 연산하고, 가장 낮은 비용을 가진 실행 계획을 선택합니다.
3. 카탈로그 매니저(catalog manager)
카탈로그란 DBMS의 내부 정보를 모아놓은 데이블들로, 인덱스 통계 정보가 저장 되어 있습니다.
통계 정보
- 각 테이블의 레코드 수
- 각 테이블 필드 수와 크기
- 필드의 카디널리티(값의 수)
- 필드값의 히스토그램(어떤 값이 얼마나 분포되어 있는가)
- 필드 내부에 있는 NULL 수
- 인덱스 정보
4. 플랜 평가(plan evaluation)
옵티마이저가 SQL 구문에서 여러 개의 실행 계획을 세운 뒤 그것을 받아 최적의 실행 결과를 선택합니다.
최적의 실행 계획 작성
테이블의 데이터가 많이 바뀌면 카탈로그의 통계 정보도 함께 갱신해야 한다는 것은 데이터베이스 엔지니어 사이의 상식입니다.
기본적인 갱신 명령어
이름 | 명령어 |
Oracle | exec DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => [스키마 이름], TABNAME => [테이블 이름]); |
MSSQL | UPDATE STATISTICS [테이블 이름]; |
MYSQL | ANALYZE TABLE [스키마 이름],[테이블 이름]; |
PostgreSQL | ANALYZE [스키마 이름],[테이블 이름] |
스키마 : 데이터베이스를 구성하는 레코드의 크기, 키(key)의 정의, 레코드와 레코드의 관계, 검색 방법 등을 정의한 것.
저는 Mysql로 명령어를 입력 했습니다.
SQL 구문의 성능을 결정하는 실행 계획
실행 계획 확인 방법
이름 | 명령어 |
Oracle | set autotrace traceonly |
MSSQL | EXPLAIN ALL WITH SNAPSHOST FOR SQL 구문 |
MYSQL | EXPLAIN EXTENDED SQL 구문 |
PostgreSQL | EXPLAIN SQL 구문 |
3개의 기본적인 SQL구문의 실행 계획을 보겠습니다.
1. 테이블 풀 스캔(Full Scan)의 실행 계획
2. 인덱스 스캔의 실행 계획
3. 간단한 테이블 결합의 실행 계획
FULL SCAN(ALL)
type : ALL
INDEX SCAN
type : const
'SQL' 카테고리의 다른 글
[SQL] 집약 (0) | 2020.09.02 |
---|---|
[SQL] 어쩔 수 없는 UNION (1) | 2020.09.01 |
[SQL] 조건 분기 CASE,UNION 차이 (0) | 2020.08.31 |
[SQL] SQL 조건 분기, 집합 연산, 윈도우 함수, 갱신 (0) | 2020.08.30 |
[SQL] DBMS 아키텍처 Part 1 (0) | 2020.08.28 |
댓글