Posts List

Translate

2014년 5월 29일 목요일

Nested Loop ,Sort Mertge ,Hash Join

1. Nested Loop Join을 사용하는 경우

(1) 부분범위 처리시 유리

(2) Join 되는 테이블이 상호 의존적인 경우

(3) 처리량이 적은 경우

(4) Driving Table의 선택이 관건


2. Sort Merge Join을 사용하는 경우

(1) Equi-join에 대해서만 가능

(2) HINT USE_MERGE를 사용해서 일반적으로 구현

(3) SORT 하는 작업을 수행

(4) 전체처리를 할 경우


3. Hash Join을 사용하는 경우

(1) Equi-join에 대해서만 가능

(2) HINT USE_HASH를 사용해서 일반적으로 구현

(3) 작은 Table 과 큰 Table의 Join시에 유리

(4) Cost-Based 옵티마이저를 사용할 경우만 Hash Join

(5) 전체처리를 할 경우

2014년 5월 17일 토요일

데이터 모델링 표기법 이해

1. 바커 표기법(Barker Notation)
가. 엔티티(Entity)
    엔티티가 되기 위해서는 두 개 이상의 속성을 가져야 한다.
    속성이 없는 실체는 존재할 수 없다. 엔티티란 실제 세상세 있는 객체이다.

• 엔티티는 네 부분의 모서리가 둥근 형태인 소프트-박스(Soft-box)로 표현
• 엔티티는 하나 이상의 속성으로 구성된다.


바터 엔터티 예














나. 속성(Attribute)
속성은 하나의 엔티티에 종속되는 명사적 단어들
일반적으로 명사적 단어 중에 구성요소를 포함하고 있는 명사들은 엔티티가 되고
그렇지 못한 명사들은 속성이 된다.
* : 어떤 값을 반드시 저장해야 하는 경우
o : 어떤 값이 존재할 수도 있고 존재하지 않을 수도 있는 경우


바커 속성 예
















다. 관계(Relationship)
 두 개의 엔티티 간에 카디널리티를 표기한 후 해당 엔티티의 가까운 위치에 관계 명칭을 표기
 실세계의 해당 엔티티에서 발생하는 동사적 단어들을 표기한다.
관계

1) 엔티티와 엔티티 간의 관계
■ 1:1 관계
■ 1:M 관계
■ M:M 관계

2) 엔티티와 엔티티 간 상관 관계의 조건
■ 필수 조건
   필수 사항은 실선으로 표시하고 상대 엔티티에 대해 해당 엔티티에 조건을 만족하는 엔티티가
   반드시 존재할 경우에 표시
■ 선택 조건
   선택 사항은 점선으로 표시하고 상대 엔티티에 대해 해당 엔티티에 조건을 만족하는 엔티티가
   존재할 수도 존재하지 않을 수도 있을 경우 표시

바커 관계 예















라. 식별자(Unique Identifier)
하나의 엔티티에 구성되어 있는 여러 개의 속성 중에 엔티티를 대표할 수 있는 속성
하나의 엔티티에는 반드시 하나의 식별자가 존재
논리 데이터 모델링 단계 : 식별자
물리 데이터 모델링 단계 : 키

1) 식별자의 유형
■ 본질 식별자
   속성 중에서 집합의 본질을 명확하게 설명할 수 있는 의미상의 주어
   인조 식별자 : 사원번호, 상품번호처럼 집합을 식별하기 위해 임의의 유일 값을 사용
   내가 태어나기 위해서 절대적으로 존재했어야만 하는 본질 속성들에 해당하는 것으로
   자신의 고유 속성과 부모로부터 물려받은 속성들로 이루어진 식별자도 있다.

■ 후보 식별자
   각 인스턴스를 유일하게 식별할 수 있는 속성 또는 속성들의 집합,
   후보 식별자로 속성 집합을 선택하는 경우에는 개념적으로 유일해야 한다.

■ 대체(보조) 식별자
   보조 식별자 : 원래의 식별자를 대신할 수 있는 또는 다른 속성들이나 릴레이션십을 말한다.
   예) 주민등록번호 : 유일한 값이면서 필수적으로 정의해야 하는 값

■ 인조 식별자
   식별자 확정 시 기존의 본질 식별자를 그래로 실질 식별자로 인정할 수 없는 여러가지 상황이
   발생했을 때, 임의의 값을 가진 속성들로 대체하여 새롭게 구성

■ 실질 식별자
   인스턴스를 식별하기 위해 공식적으로 부여된 식별자

바커 식별자 예

마. 서브타입(Sub-type)
    슈퍼타입 안에 서브타입을 상자로 나타낸다.
    이것은 다이어그램에서 공간을 적게 사용하는 장점을 가지고 있다.
    서브타입은 서브타입의 중복을 허락하지 않는 상호 배타적 관계이다.

바커 서브타입 예














바. 관계의 표현 비교

바커 표기법의 관계의 표현 예

















2. I/E 표기법
가. 엔터티(Entity)
I/E 엑터티 예
나. 속성(Attribute)
I/E 속성 예

다. 관계(Relationship)

라. 식별자(Unique Identifier)
I/E 식별자 예














마. 서브타입(Sub-type)
1)배타적 서브타입


I/E 배타적 서브타입 예


















2)포괄적 서브타입


포괄적 서브타입 예


2014년 5월 8일 목요일

데이터베이스 설계와 이용 - ORACLE TRACE FILE 보는 방법

TKPROF 통계정보 내용

【  Parse 】
- SQL문이 파싱되는 단계에 대한 통계
- 새로 파싱을 했거나, 공유 풀에서 찾아 온 것도 포함됨.
- 단, PL/SQL 내에서 반복 수행(Loop)된 SQL이나 PL*SQL에서 보존 커서(Hold cursor)를      지정한 경우에는 한 번만 파싱됨.

【  Execute 】
- SQL문의 실행단계에 대한 통계임.
- UPDATE, INSERT, DELETE 문들은 여기에 수행한 결과가 나타나게 됨.
- 전체범위 방식으로 처리된 결과가 여러 건인 경우는 주로 여기에 많은 값이 나타나며      
   Fetch에는 아주 적은 값이 나타남.

【  Fetch 】
- SQL문이 실행되면서 Fetch된 통계임.
- 부분범위 방식으로 처리된 SELECT 문들이나 전체범위 처리를 한 후 한 건을 추출하는 경우 (AGGREGATE, 전체집계, COUNT 등)는 주로 여리게 많은 값들이 나타나고 EXECUTE에는 아주 적은 값이 나타남.

【  COUNT 】
- SQL문이 파싱된 횟수, 실행된 횟수, FETCH가 수행된 횟수

【  CPU 】
- PARSE, EXECUTE, FETCH가 실제로 사용한 CPU 시간(1/100초 단위)

【  ELAPSED 】
- 작업의 시작에서 종료시까지 실제 소요된 총 시간

【  DISK 】
- 디스크에서 읽혀진 데이타 블록의 수

【  QUERY 】
- 메모리 내에서 변경되지 않은 블록을 읽거나 다른 세션에 의해 변경되었으나 아직 Commit
  되지 않아 복사해 둔 스냅샷 블록을 읽은 블록의 수
- SELECT 문에서는 거의가 여기에 해당하며 UPDATE, DELETE, INSERT시에는 소량만 발생됨.

【  CURRENT 】
- 현 세션에서 작업한 내용을 Commit하지 않아 오로지 자신에게만 유효한 블록(Dirty Block)을 액세스한 블록 수
- 주로 UPDATE, INSERT, DELETE 작업시 많이 발생
- SELECT문에서는 거의 없으나 아주 적은 양인 경우가 대부분임.

【  Logical I/O 】 : QUERY + CURRENT

【  ROWS 】
- SQL문을 수행한 결과에 의해 최종적으로 액세스된 ROW의 수
- 서브쿼리에 의해서 추출된 ROW는 제외됨.
- 만약 SUM, AVG, MIN, COUNT 등의 그룹함수를 사용한 경우라면 큰 의미가 없음.

TKProf를 사용한  Trace 파일 분석시 참고사항

execute, fetch의 횟수가 동일하다는 것은 SQL 수행시마다 기본키에 의해 한건씩만 처리되고 있다는 것을 의미한다. 만약 pares가 1인데 execurte와 fetch가 100이라면 루프가 100번 수행되면서(어프리케이션은 한번만 수행되고 SQL은 루프 내에서 반복수행되었다. 왜냐하면, 어플리케이션이 여러번 실행되었다면 비록 SQL이 실제 파싱하지 않고 Shared SQL Area에서 찾아 왔다고 해도 parse의 횟수는 증가되기 때문이다) 보관커서 상태의 SQL이 한 건씩을 추출한 상태이다. 이 경우의 SQL문은 'SELECT ... INTO ...'형식으로 사용되었을 것이다.

parse가 1이고 execute가 1이며, fetch가 100이라면 SQL은 단 한번 수행되었고 (루프 내에서 수행되지 않았음) 페치만 연속해서 100번을 수행한 것이다. 이 경우의 SQL문은 대개 'DECLARE CURSOR'로 선언한 SQL이 'FETCH ... INTO ...'에 의해 SQLCODE가 '1403'(Date Not Found)일 때까지 수행되었거나 부분범위 처리에 의해 일정 양만큼만 수행하고 멈추었을 때이다.

parse : execute : fetch의 비율은 공통 작업이 여러번 수행되면 그 배수로 나타난다. 예를 들면 parse : execute : fetch가 10 : 10 : 1000인 경우는 1 : 1 : 100인 작업이 10번 수행되었다는 것을 의미한다.

fetch가 10인데 rows가 100이라면 운반단위가 10인 다중처리(Array Processing)를 사용하여 한번 페치마다 10건의 로우가 추출되었음을 의미한다.

트레이스의 중간부분에 'Misses im library cache during parse : 1'이라는 문장이 있다. 이것은 공유 SQL 영역에서 파상된 결과를 찾지 못하여 실제 파싱작업을 하게 되었다는 것을 의미한다.

최종적으로 추출된 로우의 수는 적으나 많은 CPU 시간이 소요되었다면 이것은 분명히 적절한 액세스 경로로 수해되지 않았음을 의미한다.

CPU 시간과 ELAPSED 시간의 차이는 적을수록 좋다. 만약 CPU시간에 비해 ELAPSED 시간이 훨씬 많다면, 그 원인은 다음 중 하나일 가능성이 높다.
   - 주변의 다른 세션에서 많은 부하를 발생시켜 시스템 전체에 부하가 많이 걸려있는 경우
   - 어플리케이션의 문제이거나 다량의 데이타 처리에 따른 I/O 병목현상이 발생한 경우

disk, query, current의 숫자는 적을수록 좋다. 이 숫자들이 커다는 것은 메모리 공유영역의 적중률(Hit Ratio)이 낮다는 것을 의미한다.

Overall totals For All Statements에서 적중률 계산은 다음과 같다.
   - (Execute 'disk' + Fetch 'Disk')
     /(Execute 'query' + Execute 'current' + Fetch 'query' + Fetch 'Current') 
       * 100
- 이 값이 10%이상이라면 메모리 캐쉬에서 데이타를 찾는 비율(적중률)이 너무 낮은 것

⇒ 다음은 아주빠른 응답이 요구되는 온라인프로세싱시스템의 경우에서만 적용되는 규칙들이다.
   - 모든 Execute 'CPU'가 1초보다 적어야 한다.
   - Parse 'CPU' 시간이 Parse당 0.01초보다 적어야 한다.
   - 작은 테이블(200로우 이하)에서만 전체 테이블 스캔이 일어나게 한다.
   - sysdate만 찾아오거나, 오직 연산만 하거나, 'SELECT.. INTO ...'로 값을
      복사하는 경우를 위해서 DUAL 테이블들을 불필요하게 사용하는 것은 모두 없앤다.
   - 동시에 작업되는 SQL들은 가능한 PL/SQL을 사용한다.
   - 조인시에 옵티마이져가 적절한 드라이빙 테이블을 선택하는지를 확인하거나, 여러개의      조건들 중에서 주(드라이빙)가 되는 조건들과 부(체크)가 되는 조건들을 확인한다. 또한        적적한 인덱스가 사용될 수 있는지를 확인하여 주조건의 처리범위가 넓지 않도록 항상        유의한다.