DATABASE(oracleDB 11g)/Tuning 13

[Performance Tuning]기본 튜닝 진단

기본 튜닝 진단 성능 튜닝 진단 누적통계 시간 정보가 포함된 대기 이벤트 (wating event) 시간 모델 Metrics 기준에 따라(초당, tx당, user당) physical read를 얼마나 했나에 대한 수치를 의미있게 가공한 지표 판단의 근거가 될 수 있다. 샘플링 통계(Active Session History) 지금 활성화된 세션들의 정보 세션별 통계 SQL별 통계 서비스별 통계 기타 차원(Dimension) 튜닝 목표 대기의 최소화를 통해 응담시간을 최소화한다. 일하는 얘들이 cpu를 조금쓰게 하여 처리량을 증가한다. 리커버리 시간을 단축한다. AWR(Automatic Workload Repository) 모든 주요 통계와 적업 로드에 대한 정보를 스냅샷 형태로 저장하는 저장소 기본적으로 ..

[Performance Tuning]Performance Tuning

Performance Tuning 실행계획 확인하는 방법 explain plan : plan_table에 저장 SCOTT@orcl2> explain plan set statement_id = 'test01' into plan_table for select * from emp where job = 'CLERK'; -- plan 테이블을 식별하기 위한 표시 test01 -- plan_table은 temporary table로 만들어져 있다 SCOTT@orcl2> select * from table(dbms_xplan.display); -- temporary table을 보기 좋게 보여준다. SCOTT@orcl2> @$ORACLE_HOME/rdbms/admin/utlxplan -- SCOTT 유저에 plan_..

[SQL Tuning]바인드 변수의 사용

바인드 변수의 사용 바인드 변수의 기본적인 사용 USER01@orcl2> variable job_id varchar2(10) USER01@orcl2> exec :job_id :='SA_REP'; PL/SQL procedure successfully completed. USER01@orcl2 select count(*) from employees where job_id = :job_id; COUNT(*) ---------- 30 USER01@orcl2> exec :job_id := 'AD_VP'; USER01@orcl2> select count(*) from employees where job_id = :job_id; COUNT(*) ---------- 2 USER01@orcl2> col sql_text ..

[SQL Tuning]옵티마이저 통계

옵티마이저 통계 옵티마이저 통계 옵티마이저가 참고하는 통계 시스템 통계 (I/O 속도, CPU 속도 등 하드웨어적 성능) 시스템 통계는 sys가 소유하고 있다.(sys.aux_stats$) 인스턴스가 기동될때 기본적인 통계 정보가 수집이 된다. 객체통계 테이블 통계 컬럼 통계 인덱스 통계 user_indexes(blevel, lead_blocks, clustering_factor) 수집방법 자동 : auto task (22:00 - 04:00) 수동 : DBMS_STAT Dynamic Sampling : 옵티마이저가 스스로 진행 클러스터링 팩터(cf) 클러스터링 이라는 것은 군집되어있다는 말. 인덱스 컬럼의 순서대로 데이터블럭에 행이 정렬된 정도 cf 가 blocks에 수렴하면 가장 좋다. cf 가 nu..

[SQL Tuning]Partitioned table

Partitioned table partition이란? 테이블, 인덱스를 파티션 단위로 나누어서 저장하는 것 하나의 테이블이 별도의 세그먼트로 저장되고 여러 테이블스페이스에 저장될 수 있다. 장점 관리상 장점 성능상 장점 파티션 프루닝(pruning) : 불필요한 파티션을 액세스 하지 않고 필요한 파티션만 액세스 xplan으로 확인 가능 파티션 와이즈 조인 : emp 파티션, dept 파티션 둘다 파티션 테이블이라면 둘을 조인할때 해당 파티션끼리만 조인을 할 수 있다. 병렬처리를 할 수 있다. 파티션의 종류 range 파티셔닝 파티션 키값의 범위(RANGE)에 따라서 각각의 파티션에 데이터를 저장하는 방식 데이터를 골고루 분포하게 (well distribute 하게) 집어 넣는다. ============..

[SQL Tuning]Subquery operation(서브쿼리 오퍼레이션)

Subquery operation Subquery SQL문 안에 select 문이 있는 쿼리 Nested Subquery where 절에 사용 Inline View From 절에 사용 Scalar Subquery "하나"의 컬럼 값 "하나"를 리턴 Nested Subquery Single Row Subquery Multiple Row Subquery Multiple Column Subquery USER01@orcl2> select last_name, salary, department_id from employees where salary in (select min(salary) from employees group by department_id); -- dept는 중복되서 나온다. -- mulitiple..

[SQL Tuning]Join operation(조인 오퍼레이션)

Join operation Nested Loops Join 선행 테이블 (Outer Table) 결정 후 후행 테이블(Inner Table)에 반복적인 접근 후행 테이블의 조인 컬럼에 인덱스 필요 소량의 데이터를 조인 시 사용 부분 범위 (first_rows) 처리에 최적화 많은 양의 데이터 조인 시 Random Access 증가 8i Driving outer 이것을 선택하는게 가장 중요하다 작은 table 우선으로 선택 1건만 찾아낼 수 있다면 걔가 무조건 outer 추가조건 Drived inner 인덱스가 존재하면 좋다. optiomizer_mode 가 all_rows면 이 방법을 잘 사용하지 않으므로, first_rows로 둔다. 가장 일반적인 실행 계획 Nested Loop Outer table ..

[SQL Tuning]인덱스(Index)의 기초

인덱스(Index)의 기초 인덱스 양방향 링크가 되어있으므로, range scan이 가능 B*트리 인덱스 가장 기본적인 인덱스 비트맵 인덱스 DML이 덜 일어나도록 하는 DW(data warehouse) and와 or이 많은 경우 cardinality를 줄여야 할 경우 USER01@orcl2> select count(*) from custs; COUNT(*) ---------- 55500 USER01@orcl2> select count(*) from sales; COUNT(*) ---------- 918843 USER@orcl2> select count(distinct(cust_city)) from custs; COUNT(DISTINCT(CUST_CITY)) -------------------------..

[SQL Tuning]인덱스를 사용하지 못하는 사례 6가지와 해결책

인덱스를 사용하지 못하는 사례 6가지와 해결책 인덱스를 사용하지 못하는 사례 6가지와 해결책 FULL TABLE SCAN NO INDEX 인덱스가 있지만 범위가 넓어서 FTS이 더 효율적일때 인덱스를 쓰면 더 효율적일듯.. BUT 사용 못하는 경우 조건식의 부재 --> 문장 수정 (표준) != IS NULL 변형 인덱스 사용 불가능 사례 1. 잘못 사용된 조건식 또는 조건식의 부재 SCOTT@orcl2> select ename, rowid from emp where ename = 'SCOTT'; ENAME ROWID ---------- ------------------ SCOTT AAAR3dAAEAAAACXAAH SCOTT@orcl2> select * from emp where rowid = 'AAAR3..

[SQL Tuning]옵티마이저 연산자

옵티마이저 연산자 Optimizer가 선택하는 Access PATH Table Access 전체 테이블 읽기(Full Table Scan : 실행 계획상에서는 'Table Access Full(TAF)' 로 출력) SQL> select * from emp; SQL> select /*+ FULL(emp) */ * from emp where deptno=10; HINT : Optimizer에게 이 경로를 이용하라고 지시 USER01@orcl2> select * from emp; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- --------- ---------- ---------- ----------..