오라클/튜닝

SQLP 전문가가이드 정리

dbavayne 2024. 2. 6. 10:39

아래 포스팅은 자격검정시험 1,2 문제에 대한 개념정리를 기본으로 하였으며

추가된 버전은 pdf 로 정리하였습니다. 

필요하신분 댓글로 메일 주시면 보내드릴게요~ 

시험들어가기전 봐야할 요약본

 

1과목 데이터 모델링의 이해

1장 데이터 모델링의 이해

 

2장 데이터 모델과 SQL

1절 정규화

제 1 정규형 : 모든 속성은 반드시 하나의 값을 가져야 한다.

제 1정규형은 각 컬럼에 원자값(atomic value)만 들어가야 한다는 규칙입니다. 즉, 컬럼에 여러 값이 들어가면 안 됩니다.

1NF 위반 데이터

학생번호 | 학생이름 | 전화번호
----------------------------
1        | 김민수   | 010-1234, 010-5678
2        | 이영희   | 010-9876

1NF 적용 후 

학생번호 | 학생이름 | 전화번호
----------------------------
1        | 김민수   | 010-1234
1        | 김민수   | 010-5678
2        | 이영희   | 010-9876


제 2 정규형 : 모든 속성은 반드시 모든 기본키에 종속되어야 한다.

제 2정규형은 제 1정규형을 만족하면서, 부분 함수 종속이 없도록 해야 합니다. 즉, 기본 키의 일부가 아니라, 전체 기본 키에 의존해야 합니다.

"기본 키의 일부가 아닌 전체에 의존한다"는 말은 복합 키에서 모든 기본 키 요소에 대해 종속이 이루어져야 한다는 의미입니다. 즉, 기본 키의 일부만을 기준으로 값이 결정되면 안 되고, 전체가 기준이 되어야 한다는 것입니다. 이 규칙을 지키지 않으면 부분 함수 종속이 발생하고, 이를 제거하기 위해 정규화를 해야 합니다.

2NF 위반 데이터

주문번호(PK) | 상품번호(PK) | 상품명 | 수량
------------------------------
1001         | 001      | 사과   | 10
1001         | 002      | 배     | 5
1002         | 003      | 포도   | 8

여기서 상품명은 상품번호에만 의존하고, 주문번호와는 관계가 없습니다. 
즉, 상품번호가 상품명을 결정하는데, 이 부분이 부분 함수 종속에 해당합니다.



2NF 적용 후 

주문번호(PK) | 상품번호(PK) | 수량
-----------------------
1001         | 001      | 10
1001         | 002      | 5
1002         | 003      | 8

상품번호(PK) | 상품명
----------------
001          | 사과
002          | 배
003          | 포도


제 3 정규형 : 기본키가 아닌 모든 속성간에는 서로 종속될 수 없다.

제 3정규형은 제 2정규형을 만족하면서, 이행적 함수 종속이 없도록 해야 합니다. 즉, 비기본 키 속성이 다른 비기본 키 속성에 의존하지 않도록 해야 합니다.

이행적 함수 종속이란 A → B, B → C라는 관계가 있을 때, A → C라는 관계도 성립하는 상황을 말합니다. 이 경우, A가 B를 결정하고, B가 C를 결정하므로 A는 C를 간접적으로 결정하는 것입니다.

 

3NF 위반 데이터

학생번호(PK) | 학생이름 | 학과명 | 교수명
-----------------------------
1            | 김민수   | 컴퓨터 | 이홍수
2            | 이영희   | 수학   | 박지훈

여기서 학과명은 교수명에 의존하고 있습니다. 
즉, 학과명을 알고 있으면 교수명도 알 수 있기 때문에, 이는 이행적 함수 종속에 해당합니다.

학과명은 교수명을 결정합니다. 즉, 학과명 → 교수명이라는 관계가 있습니다.

예를 들어, "컴퓨터" 학과의 교수는 항상 "이홍수"라는 정보는 학과명에 의존하는 교수명입니다.
이 경우, 이행적 함수 종속이 발생합니다. 
왜냐하면, 학생번호 → 학과명, 그리고 학과명 → 교수명이라는 관계가 성립하므로, 
학생번호 → 교수명도 성립하게 되기 때문입니다.

3NF 적용 후

학생번호(PK) | 학생이름 | 학과번호
------------------------
1            | 김민수   | 101
2            | 이영희   | 102

학과번호(PK) | 학과명   | 교수명
----------------------
101         | 컴퓨터  | 이홍수
102         | 수학    | 박지훈

 

2절 관계외 조인의 이해

3절 모델이 표햔하는 트랜잭션 이해

4절 null 속성이해

5절 본질식별자와 인조식별자

식별자는 대체 여부에 따라 본질식별자와 인조식별자로 나눌수 있다.

 

본질식별자:

업무에 의해 만들어진 식별자, 실제 데이터에서 자연스럽게 존재하는 유일한 속성을 사용하여 레코드를 식별하는 방식

예를 들어, 주민등록번호, 전화번호, 이메일 주소

 

인조식별자:

본질식별자가 복잡한 구성을 가지고 있으 인위적으로 생성한 식별자

실제 데이터에서 의미가 없는 값을 사용하여 레코드를 식별하는 키

 

 


2과목 SQL 기본과 활용

  • 정규표현식
    . 모든문자 일치
    or 대체 문자 구분
    \ 다음 문자는 일반문자로 취급
    ^ 문자열 시작
    $ 문자열 끝
    ? 0 또는 1회 일치
    * 0 또는그 이상 일치
    + 1 또는그 이상 일치
    {m} m회 일치
    {m,} 최소 m회 일치
    {,m} 최대 m회 일치
    {m,n} 최소 m회, 최대 n회 일치
  • pivot / unpivot

pivot

PIVOT은 행 데이터를 열 데이터로 변환하는 기능. 주로 집계 함수와 함께 사용

 

원본 데이터

학생번호 | 과목   | 성적
----------------------
1        | 수학   | 90
1        | 영어   | 80
2        | 수학   | 85
2        | 영어   | 95


각 학생별로 과목을 열로 표시

SELECT *
FROM (
    SELECT 학생번호, 과목, 성적
    FROM 성적
) AS SourceTable
PIVOT (
    MAX(성적) FOR 과목 IN ([수학], [영어])
) AS PivotTable;

결과

학생번호 | 수학  | 영어
-------------------
1        | 90   | 80
2        | 85   | 95

 

unpivot

UNPIVOT은 열 데이터를 행 데이터로 변환하는 기능

 

원본 데이터

학생번호 | 수학 | 영어
---------------------
1        | 90   | 80
2        | 85   | 95

과목별 성적

SELECT 학생번호, 과목, 성적
FROM (
    SELECT 학생번호, 수학, 영어
    FROM 성적
) AS SourceTable
UNPIVOT (
    성적 FOR 과목 IN ([수학], [영어])
) AS UnpivotTable;


결과

학생번호 | 과목   | 성적
---------------------
1        | 수학   | 90
1        | 영어   | 80
2        | 수학   | 85
2        | 영어   | 95

 

 

  • 계층형 질의, 셀프조인 
  • SELECT FROM 테이블 WHERE 조건 START WITH 조건 --root 데이터 시작지점 지정 CONNECT BY [NOCYCLE] 조건 -- (fk) = prior (pk) 부모데이터에서 자식데이터로 전개 , (PK) = PRIOR (FK) 는 역방향 전개 [ORDER SIBILINGS BY 컬럼,컬럼 .. ]
  • top n 쿼리
  • 윈도우 함수 : 행과 행간의 비교, 연산
    SELECT WINDOW_FUNCTION (ARGS) OVER [PARTITION BY 컬럼][ORDER BY 절][WINDOWING 절]
    FROM 테이블명;
    그룹 내 순위 함수 Rank
    dense_rank
    row_number
    동일한 값에 대해
    1-2-2-4 (rank)
    1-2-2-3 (dense_rank)
    1-2-3-4 (row_number)
    그룹 내 집계 함수 sum, max, min, avg, count  
    그룹 내 행 순서 Fisrt_value, last_value
    lag
    lead

    이전 몇번째 행 가져오기 (lag)
    이후 몇번쨰 행 가져오기 (lead)
  • 그룹 함수
    roll up  
    cube  
    grouping set  

 


3과목 SQL 고급 활용 및 튜닝

1장 sql 수행구조

1절 데이터베이스 아키텍처

  • database : 디스크에 저장된 데이터 집합
  • instance : sga 공유 메모리 영역과 액세스하는 프로세스 집합

undo 사용하는 목적 ( snap shot too old)

  • transaction rollback
  • transaction recovery
  • read consistency

 

redo 매커니즘과 관련, redo 로그에 대한 설명

  • media recovery
  • cache recovery
  • fast commit

메모리 캐시에 대한 설명

  • db 버퍼캐시 - 테이블 블록, 인덱스 블록, undo 블록 캐싱
  • 라이브러리 캐시- db 저장 함수/ 프로시저, 트리거 캐싱, sql
  • 딕셔너리 캐시 - 테이블정보, 인덱스정보, 데이터파일 정보, 시퀀스 캐싱
  • result 캐시 - 결과 집합 캐싱

 

2절 sql 처리 과정

sql 처리과정

  1. sql 파싱 : syntax 체크, semantic 체크
  1. sql 최적화 : 옵티마이저가 나타나는 단계, 딕셔너리에 수집한 오브젝트 통계, 시스템 통계 정보 활용
  1. 로우 소스 생성 : 실행경로를 실제 실행 가능한 코드 포맷팅 하는 단계

 

옵티마이저 힌트에 대한 것

  • ms 는 힌트 오류가 나면 컴파일 에러가 발생
  • , 는 힌트와 힌트 사이에는 쓰면 x 하지만 인자와 인자 사이엔 사용 가능

 

3절 데이터베이스 i/o 매커니즘

 

블록 단위로 i/o 하는 오퍼레이션

  • 파일에 저장된 데이터 블록을 버퍼캐시에 적재
  • 버퍼캐시에 데이터 블록을 읽고 쓸때
  • 변경된 데이터 블록을 파일에 쓸때

 

sql 비교 ( * 와 컬럼 차이)

  • 전체 데이터 * 와 컬럼만 가지고 갈때 블록단위 I/O 여서 읽는블록 갯수는 같다.
  • 전송하는 bytes 는 다르다
  • order by가 같이 있다고 하더라도 * 된건 temp에 소트공간을 더 많이 차지한다.

 

메모리 버퍼캐시 경유하는 블록 i/o 오퍼레이션

  • direct path i/o를 제외한 모든 블록 i/o 오퍼레이션은 버퍼 캐시를 경유한다.

 

버퍼 캐시 히트율 계산 공식

  • sql 트레이스 정보에서는 disk (물리적) query , current (논리적)
  • (1 - 물리적io / 논리적 io) * 100

 

multi-block io : 캐시에서 찾지 못한 특정 블록을 읽으려고 io call 할때마다 그 블록과 인접한 블록을 한꺼번에 읽어 캐시에 적재하는 기능

  • db file scattered read 대기 이벤트 발생
  • 익스텐트 경계를 넘지 못한다.

 

2장 sql 분석 도구

1절 예상 실행계획

  • 실행계획 확인하는 방법oracle : explain plan for (sql 쿼리) , dbms_xplan.display (null, null, ‘typical’);
  • ms : set showplan_text on ;

2절 sql 트레이스

  • ms : set statistics profile on
  • 10046 트레이스에서 확인할 수 있는 정보 - 하드파싱 횟수 , cpu time, 실제 디스크 읽은 블록 수
    Call     Count CPU Time Elapsed Time       Disk      Query    Current       Rows
    ------- ------ -------- ------------ ---------- ---------- ---------- ----------
    Parse        1    0.000        0.002          0          0          0          0
    Execute      1    0.000        0.000          0          0          0          0
    Fetch        1    0.000        0.028          3          4          0          0
    ------- ------ -------- ------------ ---------- ---------- ---------- ----------
    Total        3    0.000        0.031          3          4          0          0
  • sga 메모리에 트레이스 정보를 보려고 할 때gather_plan_staticstics 힌트 지정

    -statistics_level all 로 설정

    -_rowsource_execution_statistics 파라미터 true 설정

    -위 힌트 사용

  • dbms_xplan.display_cursor ( sql_id, child_number , ‘’); >> 트레이스 정보를 출력하기 전에 해야하는 것

 

  • dbms_xplan.display_cursor 본 정보
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                      | Name              | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |                   |      1 |        |       |     4 (100)|          |     45 |00:00:00.01 |       3 |       |       |          |
|*  1 |  COUNT STOPKEY                 |                   |      1 |        |       |            |          |     45 |00:00:00.01 |       3 |       |       |          |
|   2 |   VIEW                         |                   |      1 |     45 |  5985 |     4  (25)| 00:00:01 |     45 |00:00:00.01 |       3 |       |       |          |
|*  3 |    SORT ORDER BY STOPKEY       |                   |      1 |     45 |  3105 |     4  (25)| 00:00:01 |     45 |00:00:00.01 |       3 |  6144 |  6144 | 6144  (0)|
|   4 |     TABLE ACCESS BY INDEX ROWID| EMPLOYEE          |      1 |     45 |  3105 |     3   (0)| 00:00:01 |     45 |00:00:00.01 |       3 |       |       |          |
|*  5 |      INDEX RANGE SCAN          | EMP_DEPARTMENT_IX |      1 |     45 |       |     1   (0)| 00:00:01 |     45 |00:00:00.01 |       1 |       |       |          |
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

3절 응답 시간 분석

  • sql 하드파싱과 관련된 대기 이벤트 : latch : shared pool

 

3장 인덱스 튜닝

1절 인덱스 기본 원리

ms : option 절을 활용하려면 힌트 사용 시에 option (table hint (테이블명, index(인덱스명)) 이렇게 사용

 

  • index skip scan : in 조건이 액세스 조건일 때는 skip scan이 불가능하다.ex ) select * from 고객
  • where 고객등급 in (’A’,’B’,’C’)
  • and 생일 =’0326’
  • or 조건에 대해서 index range scan이 가능한 sql을 찾기 위해선 union all로 풀리면서 액세스 조건에 인덱스 들이 있는 sql 들

 

2절 테이블 액세스 최소화

 

3절 인덱스 스캔 효율화

  • 인덱스 스캔 과정 비효율 낮아야함
  • 테이블 액세스 횟수 낮아야함

 

  • null 허용 컬럼 옵션조건을 주었을 때 (예시 SQL - 고객id like :cust_id || ‘%’-고객id null like || ‘%’ 이건 공집합이다. 어차피 null 로 나오는건 없으니까 결과집합이 바뀌지 않음.
  • -고객id가 문자형 컬럼이고 :cust_id 에 값을 입력하지 않으면 ‘모든’ 데이터를 스캔하는 일이 벌어짐
  • 옵션조건에 nvl, decode문을 사용하면 union all 로 풀리게 된다.
  • 옵션조건에 case문을 사용하면 union all 로 풀리지 않게 된다.

 

4절 인덱스 설계

  • 인덱스 액세스 조건에 따라 인덱스 설계
  • ‘=’ 조건이 없다면 in-list(union all) 로 풀리는 조건을 선두로 컬럼을 설계하고 그 이후는 필터 조건(선택도가 낮은)이 되도록 설계함.

 

  • 소트 연산 생략 가능한 설계-’=’ 연산자로 사용한 조건절 컬럼 선정-’=’ 연산자가 아닌 조건절 컬럼은 분포 고려해 추가 여부 결정
  • -order by 절에 기술한 컬럼 추가

 

  • 부분범위 처리가능 하게 >> 소트 연산생략 가능하도록-in-list 도 ‘=’ 조건이라고 생각할 수 있는데 실행계획에 in-list iterator로 풀려야하며 그럴 경우 정렬 순서가 깨진다.
    또한 범위검색 조건 뒤쪽에서 필터로 처리하는 것이 유리하다.
  • 선분이력 테이블 인덱스 설계-시작일자와 종료일자 중 어떤것을 선두로 두겠는가?:최근 데이터를 조회할 경우 종료일자가 선두로
  • :과거 데이터를 조회할 경우 시작일자가 선두로

 

 

4장 조인 튜닝

1절 NL조인

ms : from 절에 나열한 순서대로 조인하고자 할 때 option ( force order )

nl 조인: loop join

hash 조인 : hash join

sort merge 조인 : merge join

 

  • Nested Loops 조인 특징: 랜덤 액세스 위주 조인 방식, 한 레코드씩 순차적으로 진행, oltp에 유리
  • 오라클에서 나타나는 nl 조인 실행 계획 종류 [Prefetch, Batch I/O, Vector I/O이 기능이 활성화 되어있음을 나타냄]
    # 일반 전통적인 NL 조인 실행계획
    ---------------------------------------------------------
    | Id | Operation                    | Name              |
    ---------------------------------------------------------
    |  0 |SELECT STATEMENT              |                   |
    |  1 | NESTED LOOPS                 |                   |
    |  2 |  TABLE ACCESS FULL           | DEPARTMENTS       |
    |  3 |  TABLE ACCESS BY INDEX ROWID | EMPLOYEES         |
    |  4 |    INDEX RANGE SCAN          | EMP_DEPARTMENT_IX |
    ---------------------------------------------------------
    
    # Prefetch기능이 적용되었음을 나타내는 NL 조인 실행계획 (inner table 이 위에 나타나는 형태)
    ---------------------------------------------------------
    | Id | Operation                    | Name              |
    ---------------------------------------------------------
    |  0 | SELECT STATEMENT             |                   |
    |  1 |  TABLE ACCESS BY INDEX ROWID | EMPLOYEES         |
    |  2 |   NESTED LOOPS               |                   |
    |* 3 |    TABLE ACCESS FULL         | DEPARTMENTS       |
    |* 4 |    INDEX RANGE SCAN          | EMP_DEPARTMENT_IX |
    ---------------------------------------------------------
    
    # 배치I/O 기능이 작동할 수 있음을 나타내는 실행계획 (nested loops가 2번 나타나는 형태)
    ----------------------------------------------------------
    | Id | Operation                    | Name               |
    ----------------------------------------------------------
    |  0 | SELECT STATEMENT             |                    |
    |  1 |  NESTED LOOPS                |                    |
    |  2 |   NESTED LOOPS               |                    |
    |* 3 |    TABLE ACCESS FULL         | DEPARTMENTS        |
    |* 4 |    INDEX RANGE SCAN          | EMP_DEPARTMENT_IX  |
    |  5 |   TABLE ACCESS BY INDEX ROWID| EMPLOYEES          |
    ----------------------------------------------------------

 

2절 소트머지 조인

  • Sort Merge 조인 특징 : 스캔위주의 조인 방식, 인덱스 유무에 영향을 받지 않음, 버퍼캐시가 아닌 PGA에 저장, 래치 획득이 없음, 건건이가 아닌 일괄적으로 읽음
  • 장점 : ‘=’ 조건이 아닐 때도 사용할 수 있고, 조인 조건이 없을 때도 사용할 수 있음

 

3절 해시조인

  • 해시 조인 처리 과정-해시맵 생성 (build phase) : 작은 테이블 읽어서 해시맵 생성
  • -해시맵 탐색 (probe phase) : 큰 테이블 스캔하면서 해시맵 탐색, 조인에 성공하면 클라이언트에 전송

 

4절 스칼라 서브쿼리

NL조인처럼 한 레코드씩 처리한다

조인에 실패할 경우 null 리턴

PGA에 캐싱하는 효과로 조인 부하 감소

 

5절 고급조인 기법

 

5장 SQL 옵티마이저

1절 SQL 옵티마이저 원리

  • CBO가 실행계획 수립시 사용하는 정보-인덱스 높이-CPU속도 및 디스크 IO속도
  •  
  • -중복을 제거한 컬럼 값의 수
  • 선택도 1 / NDV (컬럼 값 종류 개수)
  • 카디널리티 총 rows / NDV
  • 컬럼 통계항목-중복 제거한 컬럼 값의 수-null 값을 가진 레코드 수
  • -평균 컬럼 길이
  • -최소값과 최대값
  • 시스템 통계항목 : app 및 하드웨어 성능 특성-평균적인 single block 속도 / multi block 속도,개수
  • -cpu속도
  • 히스토그램 유형-도수분포-상위도수분포
  • -하이브리드(도수분포 + 높이균형)
  • -높이균형
  • 인덱스를 이용한 테이블 액세스 비용 계산 시 통계항목-브랜치 레벨-클러스터링 팩터-유효 테이블 선택도
  • -유효 인덱스 선택도
  • -리프 블록수

 

2절 SQL 공유 및 재사용

  • 바인드 변수를 사용하면 컬럼 히스토그램을 사용하지 못한다.
  • 커서-묵시적 커서 : Declare 문 생략하고 dbms가 자동으로 처리-애플리케이션 커서 : 라이브러리에서 SQL 찾는 작업 생략하고 반복 수행하는 기능
  • -명시적 커서 : Declare 문 정의
  • cursor_sharing 파라미터-기본 값 EXACT
  • -FORCE : 상수 값을 바인드 변수로 강제 변환해줌으로 하드파싱 부하를 줄여준다.

 

3절 쿼리변환

  • 서브쿼리 Unnesting-unnest : 서브쿼리를 unnest하여 조인방식으로 유도
  • -no_unnest : 서브쿼리를 그대로 둔 채 필터방식으로 유도
  • 뷰 Merging-뷰머징이 불가능한 경우
  • :집합(set) 연산자 (union,union all, intersect, minus):ROWNUM pseudo 절:분석 함수(Analytic Function)
  • :select-list 에 집계 함수(avg, count, max,min,sum) 사용
  • :connect by 절
  • 뷰머징을 실패하면 조건절 pushing 시도-조건절 pushing 종류
  • :조건절 push down > 쿼리 블록 밖에 있는 조건절을 쿼리 블록 안쪽으로 밀어 넣음:조인 조건 push down (NL 조인이 전제조건) > NL 조인 수행 중 드라이빙 테이블에서 읽은 값을 건건이 inner 쪽으로 밀어 넣는것을 말함 , VIEW PUSHED PREDICATE 실행계획에 나타남
  • :조건절 pull up > 쿼리 블록 안에 있는 조건절을 쿼리 블록 밖으로 내오는 것
  • 불필요한 조인 제거 > 1:M 관계인 두 테이블을 조인하는데 조인문을 제외한 어디에서도 1쪽 테이블 참조하지 않는다면 1쪽 테이블 조인에서 제거
  • OR 조건을 Union으로 변환-use_concat : or-expansion유도할 떄 사용하는 힌트
  • -no_expend : or-expansion유도할 떄 사용방지하는 힌트

6장 고급 SQL 튜닝 1

1절 소트 튜닝

  • 소트연산 종류
    order by order by 수행 시 sort order by
    group by order by 와 group by 같이 사용할 경우
    group by 만 수행 할 경우
    sort group by
    hash group by
    Distinct, union, minus, in, intersect 집합연산자 사용 sort unique
    hash unique
    window sort 윈도우 분석함수 수행 시 window sort
    sort aggregate 집계함수 사용 ex) sum, max sort aggregate
  • 불필요한 sort 제거, 소트영역 작게 사용
  • Sort unique 피하기>방안1 : 중복결과가 발생하지 않는다면 union all 연산자를 사용
  • >방안2 : in 절을 exists로 변경 시 해당 컬럼으로 사용

 

2절 DML 튜닝

  • merge 문
    MERGE 
        INTO 타켓 테이블명
        USING 소스 테이블명
        ON 조인 조건식
    WHERE MATCHED THEN
        UPDATE
        	SET 수정할 컬럼 = 수정할 값
    WHEN NOT MATCHED THEN
        INSERT [(컬럼1,컬럼2..)]
        	VALUES (값1,값2...);

 

3절 데이터베이스 call 최소화

-recursive call, user call 최소화 > One SQL 구현

-Array Processing 활용

-Array size

 

6장 고급 SQL 튜닝 2

4절 파티셔닝

  • 파티션 pruning-정적(static) pruning : 파티션 키 컬럼을 상수 조건으로 조회하는 경우
  • -동적*dynamic) pruning : 바인드 변수 조건으로 조회하는 경우
  • 파티션 인덱스-local prefixed 인덱스-global prefixed 인덱스 : ‘파티션 삭제 변경시 unusable 됨’-비파티션인덱스 : ‘파티션 삭제 변경시 unusable 됨’
  • -global nonprefixed 인덱스 > oracle not support
  • -local nonprefixed 인덱스

 

5절 대용량 배치 프로그램 튜닝

  • 배치정의 : 일련의 작업을 묶어 일괄 처리하는 것인데 실시간으로 요구하는 on-demand배치도 많이 늘어나는 추세임
  • 병렬처리 : 쿼리 서버 집합 간 Inter-operation-parallelism (P > P)이 일어날땐 사용자가 지정한 병렬도의 2배 갯수 서버프로세스가 필요ex) 병렬도: 4일때 서버프로세스는 8개 파이프라인은 16개

 

  • Intra-operation parallelism : 배타적인 범위를 동시에 처리하는 것
  • Inter-operation parallelism : 데이터 전송, 서버 집합 간에 통신이 발생한다
  • In-Out 오퍼레이션S > P : QC가 병렬 서버 프로세스에게 전달 (통신발생)P > P : 두 개의 병렬 프로세스 집합이 처리 (통신발생)PCWC : 병렬 프로세스 집합이 자식 스텝 까지 처리
  •  
  • PCWP : 병렬 프로세스 집합이 부모 스텝 까지 처리
  • P > S : 병렬 프로세스가 QC에게 전달 (통신발생)
  • 병렬 처리 조인 힌트 종류 /*+ pq_distribute(inner_table, outer_distribution, inner_distribution) */
    pq_distribute(inner, none, none) full partition wise join 유도할 때 사용
    ※ 양쪽 테이블 모두 조인 컬럼에 대해 같은 기준으로 파티셔닝 되어 있어야함
    pq_distribute(inner, partition, none) partital partition wise join 유도할 때 사용
    outer table을 inner table 기준으로 파티셔닝 하라.
    ※ inner table이 조인 컬럼에 파티셔닝 되어 있어야함
    pq_distribute(inner, none, partition) partital partition wise join 유도할 때 사용
    inner table을 outer table 기준으로 파티셔닝 하라.
    ※ outer table이 조인 컬럼에 파티셔닝 되어 있어야함
    pq_distribute(inner, broadcast, none) outer table을 broadcast 하라.
    pq_distribute(inner, none, broadcast) inner table을 broadcast 하라.
    pq_distribute(inner, hash, hash) 조인 키 컬럼을 해시 함수에 적용 > 양쪽 테이블을 동적 파티셔닝 > 파티션 짝 구성 후 partition wise join을 수행
  • 병렬 분배 방식
    range order by또는 sort group by를 병렬로 처리할 때
    hash 조인키나 Hash Group by를 병렬로 처리할 때
    broadcast 모든 병렬 프로세스에게 전송
    매우 작은 테이블 일때 사용
    동적 파티셔닝 join 또는 partial partition wise 조인 시 활용
    key 특정 칼럼들을 기준으로 테이블 또는 인덱스를 파티셔닝 할때 사용하는 분배 방식
    round-robin 무작위로 분배

 

6절 고급 SQL 활용

-case 문 활용

-데이터 복제기법 활용

-union all 화용 M:M 관계 조인

-페이징 처리

-윈도우 함수 활용

-with 절 처리 방식

-Materialize 방식:임시 테이블 생성, 반복 재사용 가능, 실행 계획에 temp table transformation 이라고 뜸

  • 중간 집합을 만드는 과정에 원본 집합을 읽어 Temp 공간에 기록하는 과정을 수반하면서 DISK I/O가 발생한다.
    • 따라서 원본 집합이 작고 동시 수행 빈도가 높을 때에 사용하면 오히려 성능이 저하된다.
    • 매우 많은 데이터를 읽어 group by , 조인 등을 통해 집합 크기를 많이 줄일 수 있을 때 수행하면 성능 개선에 도움이 된다.
  • 해당 뷰를 읽을 때에도 버퍼 캐시를 경유하여 읽는다.

-Inline 방식:임시 테이블 생성 ❌, 참조된 횟수 만큼 런타임시 실행

 

 

7장 Lock과 트랜잭션 동시성 제어

1절 Lock

-블로킹 : lock 경합이 발생해 특정세션이 작업하지 못하고 멈춰 선 상태

-교착상태 : 두 세션이 lock 설정한 리소스를 서로 액세스 하려는 상태

 

2절 트랜잭션

-ACID (원자성,일관성,영속성,격리성)

-트랜잭션 격리수준과 비일관성 현상

레벨 dirty read
(다른 트랜잭션이 수정한 후
커밋하지 않은 데이터를 읽는 현상)
non-repeatable read
(한 트랜잭션내에서 같은 쿼리 2번 수행후
다른 트랜잭션에서 수정하는사이 결과가 다르게 나타나는 현상)
phantom read
(한 트랜잭션내에서 같은 쿼리 2번 수행후
첫 번째 쿼리에서 없던 유령 레코드가 나타나는 현상)
read uncommitted 가능 가능 가능
read committed (기본) 불가능 가능 가능
repeatable read 불가능 불가능 가능
serialize read 불가능 불가능 불가능

3절 동시성 제어

-낙관적 동시성제어 : 같은 데이터를 동시에 수정하지 않을 것이라고 가정

-비관적 동시성제어 : 같은 데이터를 동시에 수정할 것이라고 가정

 

문장수준 읽기 일관성

트랜잭션수준 읽기 일관성

 

 

 

 

 

 

'오라클 > 튜닝' 카테고리의 다른 글

점이력, 선분이력  (0) 2023.04.16
NL 조인 튜닝 예시  (0) 2023.02.21
테이블 random 액세스 쿼리 튜닝 예시  (0) 2023.02.13
7장. SQL 옵티마이저  (0) 2022.06.26
6장. DML 튜닝  (0) 2022.06.26