Cardinality
- 행 수 추정 (Cardinality Estimation)
- (열)밀도 (Destiny)
- 유일값의 비율
- ( 1 / 열의 유일값 개수 )
- 1에 가까울 수록 중복값 높아짐
- 0에 가까울 수록 유니크값 낮아짐
- (쿼리) 선택도 (Selectivity)
- (결과 행 수 /테이블 행 수)
- 결과 행수가 낮은 경우 (쿼리)선택도가 좋다
- 30%,50% (쿼리) 선택도가 낮다
OLTP vs OLAP 쿼리 특성 비교
쿼리를 이 2개중 어느것으로 분류해야 함
예를 들면, OLTP가 OLAP으로 가게 되면 잘못된 튜닝임
OLTP
작은 범위 Data 처리( Join 한두개 )
⇒ 빠른 응답 속도 목표
서버 스펙 낮은 경우
주로 Index Seek
랜덤 I/O
하드웨어 성능 낮은 경우
OLAP
대량 범위 Data 처리
⇒ 전체 처리 성능 목표
주로 Scan
주로 순차 I/0
병렬 처리 필요
하드웨어 성능이 좋아야함
고부하 쿼리(=악성 쿼리)의 주요 원인들
- 부적합한 인덱스 전략
- 부적합한 통계 개체 정보 구성/관리
- 과도한 조각화
- 잘못 설계된 데이터베이스
- 실행 계획 재사용 부족
- 과도한 (재)컴파일
- 부적절한 커서 사용
- 과도한 차단 및 교착상태
- 잘못 설계된 Data Access Code
~2012
ABS, DATEDIFF, DATEADD 버그
쿼리 분석 전 재구성 작업
- 조건절 상수화
- 로컬변수, 함수, 복잡한 수식 등을 상수로 대체
- 모순점 제거
- 잘못된 혹은 불필요한 조건 제거 (SELECT PK IS NULL)
- 불필요한 조인 제거 혹은 변경 (OUTER → INNER or INNER → OUTER)
- 구문 변환(옵션)
- 조인 → 서브쿼리로 대체 혹은 반대
- 뷰 혹은 함수 해체
Query optimizer 의 결과물
- 논리적/물리적 연산자 유형과 상세 정보
- 연산 순서
- 행 수, I/O 등의 성능 정보
- 추정 비용(CPU, I/O 메모리 등)