Nested loop join#

http://www.atmarkit.co.jp/fdb/rensai/orasql03/oracle_sql03_01.gif

테이블의 일부분을 결합하는 경우에 유효한 결합 방법으로 내부테이블의 결합 조건열에 인덱스가 작성되고 있어 그 인덱스를 사용하는 것으로 데이터에 효율적으로 액세스 할 수 있는 경우에 사용. 규칙기반 최적화에서는 결합 조건열에 대한 인덱스가 다른 한쪽의 테이블 밖에 존재하지 않는 경우는 인덱스가 존재하는 테이블이 내부테이블이 되고, 쌍방으로 인덱스가 존재하는 경우에는 FROM구의 선언된 차례가 뒤의 테이블(그림 1에서는 DEPARTMENT 테이블)가 외부테이블이 됩니다. 비용기반 최적화의 경우에는, 비용에 근거해 외부테이블이 결정. 어느 쪽의 테이블을 외부테이블로 할까에 따라서 액세스 하는 데이터·블록수는 크게 다르기 때문에 결합 순서가 중요한 포인트가 됩니다. Nested loop join을 효율화하기 위해서는 결합을 시도하는 레코드수가 적은 쪽을 외부테이블, 레코드수에 큰 차이가 없는 경우에는, 결합 조건열의 색인 스캔이 보다 효율적인 쪽을 내부테이블로 할 필요가 있다.

특징

  1. 순차적인 처리로 Fetch의 단위마다 결과 레코드를 반환받을수 있다.
  2. 드라이빙 테이블에서 많은 레코드들이 필터링되어 이너 테이블로 찾아들어가는 부분을 줄여야 하므로 드라이빙 순서가 중요
  3. 이너 테이블은 드라이빙 테이블의 반환되는 모든 레코드들에 대해서 반복실행하므로 엑세스 효율이 좋아야 한다. 그래서 대부분의 이너 테이블은 인덱스가 있어야 한다. 또한 인덱스의 효율이 좋아야 한다.
  4. 주로 인덱스 위주의 싱글 블럭 I/O의 랜덤 I/O 위주이므로 OLTP에서 적은 데이터 범위 처리에 주로 사용된다. 즉 부분처리가 아닌 대략 15%이상의 부분처리및 전체처리의 경우 sort merge또는 hash조인이 적절한다.
  5. 드라이빙 테이블이 full table scan에 병렬로 처리된다면 이너 테이블도 병렬로 처리된다.

Sort merge join#

http://www.atmarkit.co.jp/fdb/rensai/orasql03/oracle_sql03_02l.gif

Sort merge join은 테이블의 대부분을 결합하는 경우에 유효한 방법으로 그림처럼 쌍방의 테이블을 결합 조건열로 정렬해 결과를 머지 하는 것으로 대상 레코드를 추출. 결합 조건이 등가 조건(=)의 경우에는 주로 해시 조인이 사용 가능해지기 때문에 결합 대상이 많고 결합 조건이 등가 조건이 아닌(<,<=,>,>=) 경우에 사용. 검색 조건열에 인덱스가 작성되고 있어 사전에 그 인덱스로 좁혀지고 있는 경우에는 결합전의 정렬 처리가 불필요(색인은 데이터를 소트 해 보관 유지하고 있기 때문에)하게 되기 때문에 크게 결합 처리의 퍼포먼스를 개선

특징

  1. 전체범위, 즉 전체 레코드를 가지고 어떤 작업을 하기 전까지는 어떠한 레코드도 반환하지 않음
  2. Nested Loop 조인처럼 드라이빙 테이블의 반환되는 레코드 개수와 이너 테이블의 엑세스 패턴에 의해 엑세스의 효율이 좌우되지 않으며, 조인 테이블간의 자신의 처리범위로만 처리량을 결정하므로 개별 테이블간에 독립적.
  3. 정렬에 대한 CPU사용의 오버헤드가 크다. 많은 레코드들과 전체적으로 조회결과의 합이 큰 테이블의 조인에는 문제가 있다. 즉 디스크 정렬을 피할수가 없으며, 정렬에 대한 CPU 비용이 많이 든다.
  4. 디스크 정렬만 발생하지 않는다면 넓은 범위 처리에 유리하다.

Hash join#

http://www.atmarkit.co.jp/fdb/rensai/orasql03/oracle_sql03_03.gif

결합 조건에 등가 조건(=)이 지정되어 대량의 레코드 혹은 테이블의 대부분을 결합하는 경우에 유효한 결합 방법으로 비용기반 최적화의 경우만 사용 가능. Sort merge join에 비해 사전의 정렬 처리가 불필요 하므로 효율적인 조인 방법입니다. 각각의 조인 방법의 특징을 이해해 각 테이블의 레코드 건수나 검색의 조건 대상 데이터의 히트율등의 정보를 기본으로 대상의 SQL에 있어서의 최적인 결합 방법을 판단

특징

  1. 두개의 조인 테이블중 작은 테이블을 가지고 HASH_AREA_SIZE 에 지정된 메모리내에 해시 테이블을 만든다.
  2. 해시 테이블을 만든뒤는 부분범위처리 형태. 앞서본 두가지 조인 방법의 장점을 일부 모두 가진다.
  3. Nested Loop조인처럼 드라이빙 테이블의 반환되는 레코드의 수와 이너 테이블의 엑세스 패턴에 의해 엑세스 효율이 좌우되지는 않으며 조인 테이블간 자신의 처리 범위로만 처리량을 결정하므로 독립적이다.
  4. Sort Merge 조인의 단점인 많은 레코드들과 전체적으로 조회목록의 크기의 합이 큰 테이블의 조인시 정렬로 인한 CPU 사용에 대한 오버헤드및 디스크 정렬과 같은 문제점은 없다. 결과적으로 최소한 Sort Merge 조인보다는 높은 성능을 낸다.
  5. 한개의 테이블은 작고 다른 테이블의 크기가 매우 큰 경우 유리하다. 이런 경우 작은 테이블로 해시 테이블을 만들어야 한다.

통계정보 추출#

통계 정보란 테이블, 색인등의 레코드 건수나, 사용하고 있는 영역, Cardinallity注2, 데이터 분포注3 등의 데이터 특성을 나타내는 정보이며, 테이블, 색인, 혹은 열단위로 취득할 수 있습니다.구체적으로는, 표 1과 같은 정보를 가리키고 있습니다.

Cardinallity <div class="information"> 레코드중의 중복의 값의 개수를 가리킵니다.예를 들면, 성별 데이터(남자, 여자)와 같이 값의 종류가 적은 경우에는 cardinallity가 낮다고 합니다.반대로 사원 번호와 같이 대부분의 값이 중복인 경우는 cardinallity 높다고 합니다. </div>

데이터 분포 <div class="information"> 열 단위로 취득했을 경우만 수집됩니다.코스트 베이스·어프로치는, 값이 평균적으로 분산되어 있는 것을 전제로 해서 동작하기 때문에 특정의 종류의 데이터가 극단적으로 많다 등, 데이터의 편향이 큰 경우에는 적절하지 않은 실행 계획을 선택해 버리는 경우가 있습니다. 이러한 경우, 열단위로 보다 상세한 통계 정보(히스토그램)를 취득하는 것으로, 오프티마이자에 데이터의 분포도 고려시킬 수 있습니다. </div>

Add new attachment

Only authorized users are allowed to upload new attachments.
« This page (revision-5) was last changed on 10-Jan-2008 15:46 by DongGukLee