오라클 데이터베이스 성능 튜닝.

Slides:



Advertisements
Similar presentations
CUBRID 소개 (Object 개념) 서비스 사업부 / 기술지원팀. 목차 구조 일반적 특징 객체지향 특징 ORDB 개념을 이용한 스키마 ORDB 개념을 이용한 질의.
Advertisements

SQLite 소개 및 안드로이드에서의 사용법
다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL
강사: 이종인 다우 교육원 전임강사 / 온디멘드 수석 컨설턴트 / FMG 수석 컨설턴트
SQL 언어 SQL.
DB2 Information Management DB2 UDB CLP Command Summary.
SQL Statement Tuning e-Architecture 팀 임성욱.
19.(코드+년도+월)별,(코드)별,전체총액을 한번에
오라클 데이터베이스 성능 튜닝.
Perfect! 대용량 데이터베이스 튜닝Ⅱ.
소리가 작으면 이어폰 사용 권장!.
데이터 모델링 방법론 2003년 03월.
DRIMS-Cloud 소개.
데이터베이스 시스템.
질의어와 SQL 기본 SQL 고급 SQL 데이타의 수정 데이타 정의 언어 내장 SQL
관계 대수와 SQL.
대용량 데이터베이스 솔루션 발표자: 박보영 2007년 5월19일.
오라클 데이터베이스 성능 튜닝.
Database & Internet Computing Laboratory 한 양 대 학 교
박시우 ( 업무에 바로 쓰는 SQL 튜닝 박시우 (
제 5 장 인덱스 생성 및 관리.
SELECT 문 사원 테이블의 모든 정보를 출력하는 예제 1. 비교 연산자 SELECT 문의 형태
4장. 관계 대수와 SQL SQL 관계 데이터 모델에서 지원되는 두 가지 정형적인 언어
다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL
SQL 개요 SQL 개요 - SQL은 현재 DBMS 시장에서 관계 DBMS가 압도적인 우위를 차지하는 데 중요한 요인의 하나
10장. 데이터베이스 보안과 권한 관리 데이터베이스 보안과 권한 관리
SQL Server 2005 데이터베이스 가용성 강화 측면에서 본 데이터베이스 미러링과 스냅샷, 복제
MySQL performance Xhark 김재홍.
데이터베이스 담당교수 신정식 Chapter 4 SQL(1).
Toad for Oracle 설치 방법.
오라클 데이터베이스 성능 튜닝.
데이터베이스 와 JDBC 1.데이터베이스와 데이터베이스 관리 시스템은? 2.데이터베이스 장점?
Chapter 01 데이터베이스 시스템.
11장. 데이터베이스 서버 구축과 운영.
요약 정보 만들기.
kHS 데이터베이스 테이블 및 인덱스 kHS.
14장 뷰.
6장. 물리적 데이터베이스 설계 물리적 데이터베이스 설계
4.2 SQL 개요 SQL 개요 SQL은 IBM 연구소에서 1974년에 System R이라는 관계 DBMS 시제품을 연구할 때 관계 대수와 관계 해석을 기반으로, 집단 함수, 그룹화, 갱신 연산 등을 추가하여 개발된 언어 1986년에 ANSI(미국 표준 기구)에서 SQL.
차례 튜닝 - 프로필러를 이용한 튜닝 프로필러 친해지기 프로필러 결과 테이블로 만들기 프로필러 결과 분석하기
14 뷰(View) 뷰의 개념 뷰 관리.
제 17 장 (Oracle) 오라클에서 질의 최적화
뷰와 저장 프로시저 뷰의 개념을 이해한다. 뷰의 정의와 관리 방법을 이해한다. 뷰를 사용함으로써 생기는 장점을 알아본다.
SELECT empno, ename, job, sal, dname FROM emp, dept
9장 테이블 생성 및 변경, 삭제하기(DDL).
DP-ORA 쿼리 최적화 가이드 쿼리 최적화 방법 2014년 7월.
SQL.
YOU Youngseok 트랜잭션(Transaction) YOU Youngseok
01 데이터베이스 개론 데이터베이스의 등장 배경 데이터베이스의 발전 과정 데이터베이스의 정의 데이터베이스의 특징
강사: 이종인 다우 교육원 전임강사 / 온디멘드 수석 컨설턴트 / FMG 수석 컨설턴트
SQL Server 7.0 세미나 (Performance Tuning)
다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL
SQL (structured query language)
다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL
고급 T-SQL.
CHAPTER 06. 데이터베이스 자료의 조직적 집합체_데이터베이스 시스템의 이해
13장 무결성 제약조건.
정보처리기사 8조 신원철 양진원 유민호 이기목 김다연 윤현경 임수빈 조현진.
JSP 게시판 구현.
View(뷰) 1 가상 테이블(Virtual Relation)
Database 중고차 매매 DB 비즈니스IT 윤동섭.
기본적인 SELECT문 작성.
SQL INJECTION MADE BY 김 현중.
MS-SQL7.0 Implementation 강의 노트
4.DECODE 함수를 이용한 IF 처리의 효율화
06. SQL 명지대학교 ICT 융합대학 김정호.
How I Approach Tuning a SQL Statement
테이블 관리 테이블 생성,수정,삭제 데이터 입력 수정, 삭제 2010학년도 2학기.
뇌를 자극하는 Windows Server 장. 데이터베이스 서버.
Presentation transcript:

오라클 데이터베이스 성능 튜닝

Hint란 Hint 란 EXPLAIN PLAN 오라클은 SQL 문장 수행을 위해 실행계획을 생성한다. Optimizer가 생성한 실행계획이 항상 가장 효율적인 계획이 되지는 않는다. 효율적이지 않은 실행계획을 세우고 수행할 경우 개선을 시켜줄 장치가 필요하다. 이 때 Hint란 도구를 사용해서 효율적인 실행계획을 수립하고 수행하도록 훈수를 둘 수 있게끔 만들어 주는 것을 Hint라고 한다. Hint를 사용할 경우 오라클이 만든 실행계획은 무시되고 유저의 Hint를 참조한 실행계획을 세우는 방향으로 진행된다.

Hint Hint의 사용 방법 여러 줄의 사용 방법 /*+ Hint */ --+ Hint

Hint Hint의 사용 방법 예제 C:\Documents and Settings\Administrator>sqlplus scott/tiger SQL*Plus: Release 10.2.0.1.0 - Production on Copyright (c) 1982, 2005, Oracle. All rights reserved. 다음에 접속됨: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options SQL> CREATE INDEX SCOTT.I_BIG_EMP_DEPTNO ON SCOTT.BIG_EMP(DEPTNO) 2 TABLESPACE USERS; 인덱스가 생성되었습니다. SQL> CREATE UNIQUE INDEX I_BIG_EMP_EMPNO ON BIG_EMP(EMPNO); SQL> ANALYZE TABLE BIG_EMP COMPUTE STATISTICS; 테이블이 분석되었습니다. SQL> EXPLAIN PLAN 2 SET STATEMENT_ID = 'ORIG' 3 FOR 4 SELECT ENAME, DEPTNO 5 FROM BIG_EMP 6 WHERE DEPTNO = 10; 해석되었습니다.

Hint Hint의 사용 방법 예제 SQL> SELECT PLAN_TABLE_OUTPUT 2 FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE','ORIG')); PLAN_TABLE_OUTPUT ------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| | 0 | SELECT STATEMENT | | 294 | 2940 | 42 (3)| |* 1 | TABLE ACCESS FULL| BIG_EMP | 294 | 2940 | 42 (3)| Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("DEPTNO"=10) Note ----- - 'PLAN_TABLE' is old version 16 개의 행이 선택되었습니다. SQL> EXPLAIN PLAN 2 SET STATEMENT_ID = 'HINT1' 3 FOR 4 SELECT /*+ INDEX(BIG_EMP I_BIG_EMP_DEPTNO) */ ENAME, DEPTNO 5 FROM BIG_EMP 6 WHERE DEPTNO = 10; 해석되었습니다.

Hint Hint의 사용 방법 예제 SQL> SELECT PLAN_TABLE_OUTPUT 2 FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE','HINT1')); PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| | 0 | SELECT STATEMENT | | 294 | 2940 | 53 (0)| | 1 | TABLE ACCESS BY INDEX ROWID| BIG_EMP | 294 | 2940 | 53 (0)| |* 2 | INDEX RANGE SCAN | I_BIG_EMP_DEPTNO | 294 | | 1 (0)| Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("DEPTNO"=10) Note ----- - 'PLAN_TABLE' is old version 17 개의 행이 선택되었습니다. SQL>

Hint의 종류 Optimizer Mode ALL_ROWS Cost-Based Optimizer에 의한 실행계획이 수립되며 모든 행이 최대한 빨리 나오는 것을 목표로 실행계획이 수립됨 FIRST_ROWS(N) Cost-Based Optimizer에 의한 실행계획이 수립되며 첫째행이 최대한 빨리 나오는 것을 목표로 실행계획이 수립됨 CHOOSE SQL에 포함되는 각 Object들의 통계 존재여부를 통해 Rule-Based Optimizer와 Cost-Based Optimizer 사이에 선택하여 실행계획을 수립함 RULE Rule-Based Optimizer에 의한 실행계획이 수립되도록 유도함

Hint의 종류 ALL_ROWS 실습 SQL> EXPLAIN PLAN 2 SET STATEMENT_ID = 'ALL_ROWS' 3 FOR 4 SELECT /*+ INDEX(BIG_EMP I_BIG_EMP_DEPTNO) */ ENAME 5 FROM BIG_EMP 6 WHERE DEPTNO = 20 7 AND EMPNO BETWEEN 100 AND 200 8 ORDER BY ENAME; 해석되었습니다. SQL> SELECT PLAN_TABLE_OUTPUT 2 FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE','ALL_ROWS')); PLAN_TABLE_OUTPUT -------------------------------------------------- Plan hash value: 65844923 ----------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | 0 | SELECT STATEMENT | | 1 | 12 | 54 (2)| 00:00:01 | 1 | SORT ORDER BY | | 1 | 12 | 54 (2)| 00:00:01 |* 2 | TABLE ACCESS BY INDEX ROWID| BIG_EMP | 1 | 12 | 53 (0)| 00:00:01 |* 3 | INDEX RANGE SCAN | I_BIG_EMP_DEPTNO | 294 | | 1 (0)| 00:00:01 Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter("EMPNO"<=200 AND "EMPNO">=100) 3 - access("DEPTNO"=20) 16 개의 행이 선택되었습니다. SQL>

Hint의 종류 FIRST_ROWS(N) 실습 SQL> EXPLAIN PLAN 2 SET STATEMENT_ID = 'FIRST_ROWS' 3 FOR 4 SELECT /*+ FIRST_ROWS(1) */ ENAME 5 FROM BIG_EMP 6 WHERE DEPTNO = 20 7 AND EMPNO BETWEEN 100 AND 200 8 ORDER BY ENAME; 해석되었습니다. SQL> SELECT PLAN_TABLE_OUTPUT 2 FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE','FIRST_ROWS')); PLAN_TABLE_OUTPUT -------------------------------------------------- Plan hash value: 3671819838 ----------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | 0 | SELECT STATEMENT | | 1 | 12 | 5 (20)| 00:00:01 | 1 | SORT ORDER BY | | 1 | 12 | 5 (20)| 00:00:01 |* 2 | TABLE ACCESS BY INDEX ROWID| BIG_EMP | 1 | 12 | 4 (0)| 00:00:01 |* 3 | INDEX RANGE SCAN | I_BIG_EMP_EMPNO | 99 | | 2 (0)| 00:00:01 Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter("DEPTNO"=20) 3 - access("EMPNO">=100 AND "EMPNO"<=200) 16 개의 행이 선택되었습니다. SQL>

Hint의 종류 CHOOSE 실습 SQL> EXPLAIN PLAN 2 SET STATEMENT_ID = 'CHOOSE' 3 FOR 4 SELECT /*+ CHOOSE */ ENAME 5 FROM BIG_EMP 6 WHERE DEPTNO = 20 7 AND EMPNO BETWEEN 100 AND 200 8 ORDER BY ENAME; 해석되었습니다. SQL> SELECT PLAN_TABLE_OUTPUT 2 FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE','CHOOSE')); PLAN_TABLE_OUTPUT -------------------------------------------------- Plan hash value: 3671819838 ----------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | 0 | SELECT STATEMENT | | 1 | 12 | 5 (20)| 00:00:01 | 1 | SORT ORDER BY | | 1 | 12 | 5 (20)| 00:00:01 |* 2 | TABLE ACCESS BY INDEX ROWID| BIG_EMP | 1 | 12 | 4 (0)| 00:00:01 |* 3 | INDEX RANGE SCAN | I_BIG_EMP_EMPNO | 99 | | 2 (0)| 00:00:01 Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter("DEPTNO"=20) 3 - access("EMPNO">=100 AND "EMPNO"<=200) 16 개의 행이 선택되었습니다. SQL>

Hint의 종류 RULE 실습 SQL> EXPLAIN PLAN 2 SET STATEMENT_ID = 'RULE' 3 FOR 4 SELECT /*+ RULE */ ENAME 5 FROM BIG_EMP 6 WHERE DEPTNO = 20 7 AND EMPNO BETWEEN 100 AND 200 8 ORDER BY ENAME; 해석되었습니다. SQL> SELECT PLAN_TABLE_OUTPUT 2 FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE','RULE')); PLAN_TABLE_OUTPUT -------------------------------------------------- Plan hash value: 65844923 --------------------------------------------------------- | Id | Operation | Name | | 0 | SELECT STATEMENT | | | 1 | SORT ORDER BY | | |* 2 | TABLE ACCESS BY INDEX ROWID| BIG_EMP | |* 3 | INDEX RANGE SCAN | I_BIG_EMP_DEPTNO | Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter("EMPNO"<=200 AND "EMPNO">=100) 3 - access("DEPTNO"=20) Note ----- - rule based optimizer used (consider using cbo) 20 개의 행이 선택되었습니다.

Hint의 종류 Table Access 유형 FULL full table scan 실행계획이 수립되도록 함 INDEX index를 사용한 실행계획이 수립되도록 함 NO_INDEX index를 사용하지 않는 실행계획이 수립되도록 함 INDEX_ASC index를 올림차순으로 사용하는 실행계획이 수립되도록 함 INDEX_DESC index를 내림차순으로 사용하는 실행계획이 수립되도록 함 INDEX_FFS index만을 검색하는 실행계획이 수립되도록 함

Hint의 종류 FULL 실습 SQL> EXPLAIN PLAN 2 SET STATEMENT_ID = 'FULL' 3 FOR 4 SELECT /*+ FULL(BIG_EMP) */ ENAME 5 FROM BIG_EMP 6 WHERE DEPTNO = 20 7 AND EMPNO BETWEEN 100 AND 200 8 ORDER BY ENAME; 해석되었습니다. SQL> SELECT PLAN_TABLE_OUTPUT 2 FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE','FULL')); PLAN_TABLE_OUTPUT -------------------------------------------------- Plan hash value: 4283132093 ------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | | 0 | SELECT STATEMENT | | 1 | 12 | 44 (5)| 00:00:01 | | 1 | SORT ORDER BY | | 1 | 12 | 44 (5)| 00:00:01 | |* 2 | TABLE ACCESS FULL| BIG_EMP | 1 | 12 | 43 (3)| 00:00:01 | Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter("EMPNO"<=200 AND "DEPTNO"=20 AND "EMPNO">=100) 14 개의 행이 선택되었습니다. SQL>

Hint의 종류 INDEX 실습 SQL> CREATE INDEX TEST_INDEX ON BIG_EMP(EMPNO, ENAME); 인덱스가 생성되었습니다. SQL> EXPLAIN PLAN 2 SET STATEMENT_ID = 'INDEX' 3 FOR 4 SELECT ENAME, DEPTNO 5 FROM BIG_EMP 6 WHERE EMPNO = 10; 해석되었습니다. SQL> SELECT PLAN_TABLE_OUTPUT 2 FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE','INDEX')); PLAN_TABLE_OUTPUT -------------------------------------------------- Plan hash value: 3379895701 ----------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | | 0 | SELECT STATEMENT | | 1 | 12 | 2 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID| BIG_EMP | 1 | 12 | 2 (0)| 00:00:01 | |* 2 | INDEX UNIQUE SCAN | I_BIG_EMP_EMPNO | 1 | | 1 (0)| 00:00:01 | Predicate Information (identified by operation id): 2 - access("EMPNO"=10) 14 개의 행이 선택되었습니다. SQL>

Hint의 종류 INDEX 실습 SQL> EXPLAIN PLAN 2 SET STATEMENT_ID = 'INDEX1' 3 FOR 4 SELECT /*+ INDEX(BIG_EMP TEST_INDEX) */ ENAME, DEPTNO 5 FROM BIG_EMP 6 WHERE EMPNO = 10; 해석되었습니다. SQL> SELECT PLAN_TABLE_OUTPUT 2 FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE','INDEX1')); PLAN_TABLE_OUTPUT -------------------------------------------------- Plan hash value: 1704472701 ------------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | | 0 | SELECT STATEMENT | | 1 | 12 | 3 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID| BIG_EMP | 1 | 12 | 3 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | TEST_INDEX | 1 | | 2 (0)| 00:00:01 | Predicate Information (identified by operation id): 2 - access("EMPNO"=10) 14 개의 행이 선택되었습니다. SQL>

Hint의 종류 INDEX_ASC 실습 SQL> EXPLAIN PLAN 2 SET STATEMENT_ID = 'INDEX_ASC' 3 FOR 4 SELECT /*+ INDEX_ASC(BIG_EMP TEST_INDEX) */ ENAME, DEPTNO 5 FROM BIG_EMP 6 WHERE EMPNO = 10; 해석되었습니다. SQL> SELECT PLAN_TABLE_OUTPUT 2 FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE','INDEX_ASC')); PLAN_TABLE_OUTPUT -------------------------------------------------- Plan hash value: 1704472701 ------------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | | 0 | SELECT STATEMENT | | 1 | 12 | 3 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID| BIG_EMP | 1 | 12 | 3 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | TEST_INDEX | 1 | | 2 (0)| 00:00:01 | Predicate Information (identified by operation id): 2 - access("EMPNO"=10) 14 개의 행이 선택되었습니다. SQL>

Hint의 종류 INDEX_DESC 실습 SQL> EXPLAIN PLAN 2 SET STATEMENT_ID = 'INDEX_DESC' 3 FOR 4 SELECT /*+ INDEX_DESC(BIG_EMP TEST_INDEX) */ ENAME, DEPTNO 5 FROM BIG_EMP 6 WHERE EMPNO = 10; 해석되었습니다. SQL> SELECT PLAN_TABLE_OUTPUT 2 FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE','INDEX_DESC')); PLAN_TABLE_OUTPUT -------------------------------------------------- Plan hash value: 2076808727 ------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | | 0 | SELECT STATEMENT | | 1 | 12 | 3 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID | BIG_EMP | 1 | 12 | 3 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN DESCENDING| TEST_INDEX | 1 | | 2 (0)| 00:00:01 | Predicate Information (identified by operation id): 2 - access("EMPNO"=10) 14 개의 행이 선택되었습니다. SQL>

Hint의 종류 INDEX_FFS 실습 SQL> EXPLAIN PLAN 2 SET STATEMENT_ID = 'INDEX_FF' 3 FOR 4 SELECT /*+ INDEX_FFS(BIG_EMP TEST_INDEX) */ EMPNO 5 FROM BIG_EMP 6 WHERE EMPNO < 200; 해석되었습니다. SQL> SELECT PLAN_TABLE_OUTPUT 2 FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE','INDEX_FF')); PLAN_TABLE_OUTPUT -------------------------------------------------- Plan hash value: 9946052 ----------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | | 0 | SELECT STATEMENT | | 192 | 768 | 21 (0)| 00:00:01 | |* 1 | INDEX FAST FULL SCAN| TEST_INDEX | 192 | 768 | 21 (0)| 00:00:01 | Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("EMPNO"<200) 13 개의 행이 선택되었습니다. SQL>

Hint의 종류 SQL transformation 유형 USE_CONCAT full table scan 실행계획이 수립되도록 함 NO_EXPAND index를 사용한 실행계획이 수립되도록 함 MERGE index를 사용하지 않는 실행계획이 수립되도록 함 NO_MERGE index를 올림차순으로 사용하는 실행계획이 수립되도록 함 REWRITE index를 내림차순으로 사용하는 실행계획이 수립되도록 함 NOREWRITE index만을 검색하는 실행계획이 수립되도록 함

Hint의 종류 USE_CONCAT 실습 SQL> CREATE INDEX TEST_INDEX1 ON BIG_EMP(SAL); 인덱스가 생성되었습니다. SQL> EXPLAIN PLAN 2 SET STATEMENT_ID = 'USE_CONCAT' 3 FOR 4 SELECT /*+ RULE USE_CONCAT */ * 5 FROM BIG_EMP 6 WHERE EMPNO > 50 7 OR SAL < 50000; 해석되었습니다. SQL> SELECT PLAN_TABLE_OUTPUT 2 FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE','USE_CONCAT')); PLAN_TABLE_OUTPUT -------------------------------------------------- Plan hash value: 137407120 ---------------------------------------------------- | Id | Operation | Name | | 0 | SELECT STATEMENT | | | 1 | CONCATENATION | | | 2 | TABLE ACCESS BY INDEX ROWID| BIG_EMP | |* 3 | INDEX RANGE SCAN | TEST_INDEX1 | |* 4 | TABLE ACCESS BY INDEX ROWID| BIG_EMP | |* 5 | INDEX RANGE SCAN | TEST_INDEX |

Hint의 종류 USE_CONCAT 실습 Predicate Information (identified by operation id): --------------------------------------------------- 3 - access("SAL"<50000) 4 - filter(LNNVL("SAL"<50000)) 5 - access("EMPNO">50) Note ----- PLAN_TABLE_OUTPUT -------------------------------------------------- - rule based optimizer used (consider using cbo) 23 개의 행이 선택되었습니다. SQL>

Hint의 종류 NO_EXPAND 실습 SQL> EXPLAIN PLAN 2 SET STATEMENT_ID = 'NO_EXPAND' 3 FOR 4 SELECT /*+ INDEX(BIG_EMP TEST_INDEX) NO_EXPAND */ * 5 FROM BIG_EMP 6 WHERE EMPNO > 50 7 OR SAL < 50000; 해석되었습니다. SQL> SELECT PLAN_TABLE_OUTPUT 2 FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE','NO_EXPAND')); PLAN_TABLE_OUTPUT -------------------------------------------------- Plan hash value: 400756699 ------------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | | 0 | SELECT STATEMENT | | 28955 | 1017K| 623 (1)| 00:00:08 | |* 1 | TABLE ACCESS BY INDEX ROWID| BIG_EMP | 28955 | 1017K| 623 (1)| 00:00:08 | | 2 | INDEX FULL SCAN | TEST_INDEX | 28955 | | 89 (0)| 00:00:02 | Predicate Information (identified by operation id): 1 - filter("SAL"<50000 OR "EMPNO">50) 14 개의 행이 선택되었습니다. SQL>

Hint의 종류 JOIN 방법 유형 ORDERED full table scan 실행계획이 수립되도록 함 LEADING index를 사용한 실행계획이 수립되도록 함 USE_NL index를 사용하지 않는 실행계획이 수립되도록 함 USE_MERGE index를 올림차순으로 사용하는 실행계획이 수립되도록 함 USE_HASH index를 내림차순으로 사용하는 실행계획이 수립되도록 함

Hint의 종류 JOIN 방법 유형 DRIVING_SITE full table scan 실행계획이 수립되도록 함 HASH_AJ, MERGE_AJ, NL_AJ index를 사용한 실행계획이 수립되도록 함 HASH_SJ, MERGE_SJ, NL_SJ index를 사용하지 않는 실행계획이 수립되도록 함

Hint의 종류 JOIN 방법 유형 DRIVING_SITE full table scan 실행계획이 수립되도록 함 HASH_AJ, MERGE_AJ, NL_AJ index를 사용한 실행계획이 수립되도록 함 HASH_SJ, MERGE_SJ, NL_SJ index를 사용하지 않는 실행계획이 수립되도록 함

Hint의 종류 병렬 옵션 Parallel Execution Parallel execution을 사용하면 하나의 일을 여러 개의 일로 쪼개서 병렬로 수행한다. 이는 단일 수행보다 수행시간에 이득을 가져온다. (parallel query, parallel DDL, parallel DML, parallel Data Loading)

Hint의 종류 병렬 옵션 동작원리 유저가 SQL문을 수행하면 오라클은 서버 프로세스를 구동하고 이는 SQL 수행과 유저(유저프로세스)에게 결과 제공하는 일을 수행한다. 아래는 Single execution에 해당하는 그림이다. SELECT COUNT(*) FROM ORDERS; User process Server process Database

Hint의 종류 병렬 옵션 동작원리 다음은 parallel execution에 대항하는 그림이다. SELECT /*+ parallel (orders, 4) */ COUNT (*) FROM ORDERS; parallel execution에서는 서버 프로세스는 parallel execution server들의 상위의 역할을 수행하는 parallel execution coordinator 역할을 수행한다. 그리고 더 이상의 일은 수행하지 않는다. 위의 쿼리는 4개의 sub task로 나뉘어서 수행된다. User process Server process (Query coordinator) Database Parallel execution server processes

Hint의 종류 병렬 옵션 Parallel Query full table scan, full index scan, partition range scan, index range scan을 수행하는 SELECT문에서 사용된다. parallel 힌트 사용을 통해 수행할 수 있다. 또는 테이블을 변경하여 쿼리 수행 시 해당 테이블이 위 경우에 해당하면 자동으로 parallel 정도로 수행이된다. 세션 레벨에서 parallel execution에 대해서 사용을 금할 수 있다 또는 문장 단위로 사용을 금할 수 있다. SELECT /*+ parallel (orders, 4) */ COUNT (*) FROM ORDERS; ALTER TABLE ORDERS PARALLEL (DEGREE 4); ALTER SESSION DISABLE PARALLEL QUERY; SELECT /*+ NO_PARALLEL (ORDERS) */ COUNT (*) FROM ORDERS;

Hint의 종류 병렬 옵션 Parallel DML INSERT, UPDATE, MERGE, DELETE 문에서 사용이 가능하다. 이는 배치 job, 집계 정보 생성, 대량 데이터 Moving에 유용하다. INSERT INTO … VALUES (…)문장은 row 하나씩 작업을 하기 때문에 parallel execution이 수행되지 않는다. 하지만 INSERT INTO … SELECT … FROM문장은 수행이 가능하다. Parallel DML은 기본으로 Disable 되어 있다. Parallel DML을 사용 전에 명시적으로 다음을 선언해야 한다. 명시적으로 세팅한 후 parallel 힌트나 테이블의 parallel 속성을 변경하여 parallel DML 수행이 가능한다. ALTER SESSION ENABLE PARALLEL DML;

Hint의 종류 병렬 옵션 Parallel DML 위 문장은 SELECT 문은 Single execution으로 수행이 되고 INSERT 문은 parallel로 수행된다. 반면 위 문장은 SELECT 문과 INSERT 문 모두가 parallel로 수행된다. INSERT /*+ PARALLEL (TEMP_ORDERS, 4) */ INTO TEMP_ORDERS SELECT * FROM ORDERS; INSERT /*+ PARALLEL (TEMP_ORDERS, 4) */ INTO TEMP_ORDERS SELECT /*+ PARALLEL (ORDERS, 4) */ * FROM ORDERS;