Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- windows11setup
- w3wp.exe
- SQL
- 코딩테스트
- 윈도우11인터넷없이설치
- 알고리즘
- 상태공간트리
- 예제
- it자격증추천
- It
- 선택정렬
- windows11install
- SQLD
- 톰캣버전확인
- mssql함수검색
- sql튜닝
- 윈도우11네트워크없이설치
- 삽입정렬
- 순환
- mssql프로시저검색
- GROOUPING SETS
- adsp공부방법
- 분할정복법
- 독학
- 비밀번호
- mssql호환성수준
- 프로세스에연결
- 코테
- 호환성수준변경
- mssql호환성수준확인
Archives
- Today
- Total
404 not found
[SQL 성능 분석하기] 옵티마이저 본문
옵티마이저
1. 옵티마이저의 개념
: 사용자가 실행한 SQL을 해석하고, 데이터를 추출을 위한 실행계획을 수립하는 프로세스
2. 옵티마이저의 종류
오라클: RBO/CBO (다른 DBMS는 CBO만 존재)
1) RBO(Rule Based Optimizer)
: 15개의 순위가 매겨진 규칙 존재
: SQL에 대한 실행계획이 하나 이상일 경우, 순위가 높은 규칙 이용
: 수립된 실행계획이 예측 가능하여 개발자가 원하는 처리 경로로 유도하기 쉬움
2) CBO(Cost Based Optimizer)
자원사용을 최소화하여 데이터를 빨리 처리하는 데 목적
통계정보
: CBO의 성능을 최적의 상태로 유지시키기 위해서 테이블, 인덱스, 클러스터 등을 대상으로 통계정보를 생성함. (정기적으로 ANALYZE작업을 하는 것이 중요)
ANALYZE 실행
ANALYZE TABLE emp COMPUTE STATISTICS;
ANALYZE TABLE emp COMPUTE STATISTICS SAMPLE 10 PERCENT;
ANALYZE TABLE emp COMPUTE STATISTICS SAMPLE 5 ROW;
ANALYZE 실행 여부 확인
SELECT table_name, num_rows, last_analyzed
FROM user_tables
WHERE table_name IN ('EMP','DEPT');
> 확인 시 결과가 나오는 경우는 실행, 결과가 나오지 않으면 실행된적 없음
DBMS_STATS Package
DBMS_STATS.GATHER_TABLE_STATS
('hr' // 테이블오너
,'EMP' // 테이블명
, NULL //파티션
, 20 //샘플크기
,FALSE
,'FOR ALL COLUMNS'
,4 // 병렬처리 프로세스 수)
: ANALYZE로는 힘든 병렬처리가 가능
3. 옵티마이저의 레벨별 설정
Instance Level
: initSID.ora를 이용해 지정함
OPTIMIZER_MODE = [RULE/CHOOSE/FIRST_ROWS/ALL_ROWS] //v.10부터는 ALL ROWS가 기본
Session Level
SQL>ALTER SESSION SET OPTIMIZER_MODE =
[RULE/CHOOSE/FIRST_ROWS/ALL_ROWS]
Statement Level
:SQL문에 힌트로 사용
SQL> SELECT /*+first_rows*/
ename
FROM emp;
> 우선순위가 높은건 SQL이 갖는 힌트
4. RBO와 CBO의 실행계획 비교
CBO
---------------------------------------------------------------------------------------------------
| id| Operation | NAME | ROWS |
--------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3 |
| 1 | NESTED LOOPS | | 3 |
| 2 | TABLE ACCESS BY INDEX ROWID | DEPT | 1 |
|* 3 | INDEX UNIQUE SCAN | PK_DEPT | 1 |
|* 4 | TABLE ACCESS FULL | EMP | 3 |
---------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
--------------------------------------------------------------------------
|
3 - access("D"."DEPTNO" = 10)
4 - filter("E"."DEPTNO" = 10)
RBO
---------------------------------------------------------------------------------------------------
| id| Operation | NAME |
--------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | NESTED LOOPS | |
| 2 | NESTED LOOPS | |
|* 3 | TABLE ACCESS FULL | EMP |
|* 4 | INDEX UNIQUE SCAN | PK_DEPT |
| 5 | TABLE ACCESS BY INDEX ROWID | DEPT |
---------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
--------------------------------------------------------------------------
|
3 - access("E"."DEPTNO" = 10)
4 - filter("E"."DEPTNO" = "D"."DEPTNO")
NOTE
-----
- rule based optimizer used (consider using cbo)
'SQL > SQL튜닝' 카테고리의 다른 글
[SQL 성능 분석하기] NESTED LOOPS 조인 (0) | 2021.07.19 |
---|---|
[SQL 성능 분석하기] 인덱스 활용이 불가능한 경우 (0) | 2021.07.13 |
[SQL 성능 분석하기] 결합 인덱스 (0) | 2021.07.13 |
[SQL 성능 분석하기] 인덱스 (0) | 2021.07.12 |
[SQL 성능 분석하기] 실행계획 (0) | 2021.07.08 |
Comments