Linux, UNIX 및 Windows용 DB2 액세스 플랜에 대해 액세스 플랜 탐색기에 나타나는 연산자

Linux, UNIX 및 Windows용 DB2®에서 실행되는 SQL문에 대한 액세스 플랜을 분석 중인 경우 다음 연산자가 액세스 플랜 탐색기에 나타날 수 있습니다.
삭제

이 연산자는 필수 연산을 나타냅니다. 액세스 플랜 비용을 향상시키려면 삭제될 행 세트를 정의하는 기타 노드(예: 스캔 및 조인)에 집중하십시오.

성능 제안: 테이블에서 모든 행을 삭제하는 경우, DROP TABLE문 또는 LOAD REPLACE 명령을 사용하십시오.

사용자 정의 인덱스 스캔
스캔은 사용자 제공 탐색 범위 생성 함수의 다중 시작/중지 조건을 사용합니다. 이 연산은 옵티마이저가 술어를 기반으로 기본 테이블에 액세스하기 전에 규정 행 세트를 줄이기 위해 수행됩니다.
성능 제안:
  • 시간이 지나면 데이터베이스 업데이트로 인해 인덱스가 분할될 수 있으므로 인덱스 페이지가 필요 이상으로 늘어납니다. 인덱스를 삭제한 후 재작성하거나 인덱스를 재구성하여 이를 정정할 수 있습니다.
  • 통계가 최신 상태가 아닌 경우, RUNSTATS 명령을 사용하여 업데이트하십시오.
페치
이 연산자는 특정 행 ID(RID)를 사용하여 테이블에서 컬럼 페치를 나타냅니다.
데이터 필터
이 연산자는 레지듀얼(Residual) 술어 적용을 나타내므로 술어가 제공하는 기준에 따라 데이터가 필터링됩니다.
테이블 행 생성
이 연산자는 테이블, 인덱스 또는 연산자의 입력을 사용하지 않고 행 테이블을 생성하는 기본 제공 함수를 나타냅니다.
그룹화
이 연산자는 지정된 컬럼 또는 함수의 공통 값에 따라 행 그룹화를 나타냅니다. 값 그룹을 생성하거나 집합 함수를 평가하려면 이 연산이 필요합니다. GROUP BY 컬럼이 지정되지 않은 경우, SELECT 목록에 집계 함수가 있으면 이 연산자를 여전히 사용할 수 있습니다. 집계 함수가 있으면 해당 집계를 수행할 때 옵티마이저가 전체 테이블을 단일 그룹으로 간주함을 나타냅니다.
성능 제안:
  • 액세스 플랜 비용을 향상시키려면 그룹화될 행 세트를 정의하는 기타 노드(예: 스캔 및 조인)에 집중하십시오.
  • 단일 집계 함수를 포함하지만 GROUP BY 절은 포함하지 않는 SELECT문의 성능을 향상시키려면 다음을 시도하십시오.
    • MIN(C) 집계 함수의 경우, C에 오름차순 인덱스를 작성하십시오.
    • MAX(C) 집계 함수의 경우, C에 내림차순 인덱스를 작성하십시오.
해시 조인
이 연산자는 테이블 컨텐츠를 사전에 순서화하지 않고 직접 조인을 허용하도록 해시될 테이블의 규정된 행에 대한 해시 조인을 나타냅니다.

FROM 절에서 두 개 이상의 테이블을 참조할 때마다 조인이 필요합니다. Join 술어가 서로 다른 두 테이블의 컬럼을 동일시할 때마다 해시 조인이 가능합니다. Join 술어는 똑같은 데이터 유형이어야 합니다. 또한 재작성된 서브쿼리로 인해 해시 조인이 발생할 수 있는데, 중첩 루프 조인의 경우가 그렇습니다.

해시 조인의 경우 입력 테이블을 순서화하지 않아도 됩니다. 조인은 해시 조인의 내부 테이블을 스캔하고 조인 컬럼 값을 해싱하여 검색 테이블을 생성함으로써 수행됩니다. 그런 다음 외부 테이블을 읽고 조인 컬럼 값을 해싱하고 내부 테이블에 대해 생성된 검색 테이블을 체크인합니다.

성능 제안:

  • 로컬 술어(즉, 하나의 테이블을 참조하는 술어)를 사용하여 조인될 행 수를 줄이십시오.
  • 메모리에 해시 검색 테이블을 보유할 수 있도록 정렬 힙 크기를 충분히 늘리십시오.
  • 통계가 최신 상태가 아닌 경우, RUNSTATS 명령을 사용하여 업데이트하십시오.
삽입

이 연산자는 필수 연산을 나타냅니다. 액세스 플랜 비용을 향상시키려면 삭제될 행 세트를 정의하는 기타 노드(예: 스캔 및 조인)에 집중하십시오.

인덱스 교차
이 연산자는 동적 비트맵 기술을 사용하여 다중 인덱스 스캔 결과의 AND 연산을 나타냅니다. 이 연산은 기본 테이블 액세스를 최소로 줄이기 위해 다중 인덱스에 AND 연산 술어를 적용할 수 있게 합니다.
이 연산은 다음을 위해 수행됩니다.
  • 기본 테이블에 액세스하기 전에 행 세트를 줄임
  • 다중 인덱스에 AND 술어 적용
  • 세미조인 결과의 AND 연산(스타 조인에서 사용됨)
성능 제안:
  • 시간이 지나면 데이터베이스 업데이트로 인해 인덱스가 분할될 수 있으므로 인덱스 페이지가 필요 이상으로 늘어납니다. 인덱스를 삭제한 후 재작성하거나 인덱스를 재구성하여 이를 정정할 수 있습니다.
  • 통계가 최신 상태가 아닌 경우, RUNSTATS 명령을 사용하여 업데이트하십시오.
  • 일반적으로 인덱스 스캔은 몇 개 행만 규정하는 경우 가장 효과적입니다. 규정 행 수를 추정하기 위해 옵티마이저는 술어에 참조된 컬럼에 사용 가능한 통계를 사용합니다. 일부 값이 다른 값보다 더 자주 발생하는 경우, RUNSTATS 명령에 WITH DISTRIBUTION절을 사용하여 분산 통계를 요청하는 것이 중요합니다. 옵티마이저는 균일하지 않은 분산 통계를 사용하여 자주 발생하는 값과 드물게 발생하는 값을 구별할 수 있습니다.
  • 시작 및 중지 키가 중요하기 때문에 이 연산은 단일 컬럼 인덱스를 가장 잘 활용할 수 있습니다.
인덱스 스캔
이 연산자는 감소된 행 ID 스트림을 생성하기 위한 인덱스 스캔을 나타냅니다. 스캔은 선택적 시작 및 중지 조건을 사용하거나 인덱스 컬럼을 참조하는 인덱스 가능한 술어에 적용될 수 있습니다.

이 연산은 술어를 기반으로 기본 테이블에 액세스하기 전에 규정 행 세트를 줄이기 위해 수행됩니다.

성능 제안:
  • 시간이 지나면 데이터베이스 업데이트로 인해 인덱스가 분할될 수 있으므로 인덱스 페이지가 필요 이상으로 늘어납니다. 인덱스를 삭제한 후 재작성하거나 인덱스를 재구성하여 이를 정정할 수 있습니다.
  • 두 개 이상의 테이블에 액세스하는 경우, 외부 테이블의 조인 컬럼에 인덱스를 제공하여 인덱스를 통해 내부 테이블에 보다 효율적으로 액세스할 수 있습니다.
  • 통계가 최신 상태가 아닌 경우, RUNSTATS 명령을 사용하여 업데이트하십시오.
  • 일반적으로 인덱스 스캔은 몇 개 행 ID만 규정하는 경우 가장 효과적입니다. 규정 행 ID 수를 추정하기 위해 옵티마이저는 술어에 참조된 컬럼에 사용 가능한 통계를 사용합니다. 일부 값이 다른 값보다 더 자주 발생하는 경우, RUNSTATS 명령에 WITH DISTRIBUTION절을 사용하여 분산 통계를 요청하는 것이 중요합니다. 옵티마이저는 균일하지 않은 분산 통계를 사용하여 자주 발생하는 값과 드물게 발생하는 값을 구별할 수 있습니다.
병합 스캔 조인
외부 테이블과 내부 테이블 둘 다의 규정된 행에 대한 병합 조인은 Join 술어순이어야 합니다. 병합 조인을 병합 스캔 조인 또는 병합 정렬 조인이라고도 합니다.

FROM 절에서 두 개 이상의 테이블을 참조할 때마다 조인이 필요합니다. Join 술어가 서로 다른 두 테이블의 컬럼을 동일시할 때마다 병합 조인이 가능합니다. 또한 재작성된 서브쿼리로 인해 병합 조인이 발생할 수 있습니다.

일반적으로 테이블을 한 번만 스캔하기 때문에 병합 조인의 경우 조인 컬럼에 순서화된 입력이 필요합니다. 인덱스 또는 정렬된 테이블에 액세스하여 이 순서화된 입력을 확보할 수 있습니다.

성능 제안:
  • 로컬 술어(즉, 하나의 테이블을 참조하는 술어)를 사용하여 조인될 행 수를 줄이십시오.
  • 통계가 최신 상태가 아닌 경우, RUNSTATS 명령을 사용하여 업데이트하십시오.
중첩 루프 조인
이 연산자는 외부 테이블의 각 행에 대해 내부 테이블을 한 번씩 스캔(일반적으로 인덱스 스캔을 사용)하는 중첩 루프 조인을 나타냅니다.

FROM 절에서 두 개 이상의 테이블을 참조할 때마다 조인이 필요합니다. 중첩 루프 조인에는 Join 술어가 필요하지 않지만 일반적으로 Join 술어를 사용하면 보다 효율적으로 조인을 수행할 수 있습니다.

중첩 루프 조인은 다음을 통해 수행됩니다.
  • 외부 테이블의 각 액세스 행에 대해 내부 테이블을 스캔
  • 외부 테이블의 각 액세스 행에 대해 내부 테이블에서 인덱스 검색 수행
성능 제안:
  • 내부 테이블의 Join 술어 컬럼에 인덱스가 있으면 중첩 루프 조인이 보다 효율적입니다.

    조인을 보다 효율적으로 수행하는 또 다른 방법(그다지 중요하지 않음)은 외부 테이블이 순서화되도록 외부 테이블의 조인 컬럼에 인덱스를 작성하는 것입니다.

  • 통계가 최신 상태가 아닌 경우, RUNSTATS 명령을 사용하여 업데이트하십시오.
리턴
이 연산자는 쿼리로부터의 데이터 리턴을 나타냅니다. 이는 액세스 플랜의 최종 연산자이며 액세스 플랜에 대한 총 누적 값 및 비용을 표시합니다.
행 ID(RID) 스캔
이 연산자는 하나 이상의 인덱스에서 확보한 행 ID(RID) 목록 스캔을 나타냅니다.
다음과 같은 경우 옵티마이저는 이 연산을 고려합니다.
  • 술어가 OR 키워드로 연결되어 있거나 IN 술어가 있는 경우. 동일 테이블에서 다중 인덱스 액세스의 결과를 결합하는 인덱스 OR 연산 기술을 사용할 수 있는 경우.
  • 기본 행에 액세스하기 전에 행 ID를 정렬하면 입출력이 보다 효율적이므로 단일 인덱스 액세스에 목록 프리페치를 사용하는 것이 유용합니다.
원격 데이터 페치
이 연산자는 페더레이티드 시스템의 원격 데이터 소스에서 데이터 검색을 나타냅니다.
정렬
이 연산자는 테이블의 행을 하나 이상의 컬럼 순서로 정렬함을 나타냅니다(중복 항목을 선택적으로 제거).

요청된 순서화를 충족시키는 인덱스가 없거나 인덱스 스캔보다 정렬 비용이 적게 드는 경우 정렬이 필요합니다. 정렬은 일반적으로 필수 행이 페치된 경우 또는 조인 또는 그룹화 전에 데이터를 정렬하기 위해 최종 연산으로 수행됩니다.

행 수가 많거나 정렬된 데이터를 파이프할 수 없는 경우, 이 연산을 수행하려면 비용이 많이 드는 임시 테이블을 생성해야 합니다.

테이블 스캔
이 연산자는 데이터 페이지에서 직접 모든 필수 데이터를 읽어 행을 검색하는 테이블 스캔(관계 스캔)을 나타냅니다.
옵티마이저는 다음과 같은 경우 인덱스 스캔에 대해 이 스캔 유형을 선택합니다.
  • 스캔된 값 범위가 자주 발생하는 경우(즉, 대부분의 테이블에 액세스해야 하는 경우)
  • 테이블이 작은 경우
  • 인덱스 클러스터링이 낮은 경우
  • 테이블에 인덱스가 없는 경우
임시 테이블
이 연산자는 임시 테이블에 데이터 저장을 나타내므로 다른 연산 중에 데이터를 읽을 수 있습니다.
테이블 큐
이 연산자는 쿼리를 처리하는 데이터베이스 에이전트가 여러 개인 경우 한 데이터베이스 에이전트에서 다른 데이터베이스 에이전트로 테이블 데이터를 전달하는 데 사용되는 테이블 큐를 나타냅니다. 병렬 처리가 관련된 경우 쿼리를 처리하는 데 여러 개의 데이터베이스 에이전트가 사용됩니다.
통합

이 연산자는 필수 연산을 나타냅니다. 액세스 플랜 비용을 향상시키려면 삭제될 행 세트를 정의하는 기타 노드(예: 스캔 및 조인)에 집중하십시오.

중복 제거
이 연산자는 지정된 컬럼에 대해 중복 값을 갖는 행 제거를 나타냅니다.
업데이트

이 연산자는 필수 연산을 나타냅니다. 액세스 플랜 비용을 향상시키려면 삭제될 행 세트를 정의하는 기타 노드(예: 스캔 및 조인)에 집중하십시오.

XML 데이터에 대한 인덱스 스캔
이 연산자는 기본 테이블에 액세스하기 전에 해당 XML 데이터에 대한 연관된 인덱스 범위 스캔을 나타냅니다. 이 연산은 규정 행 ID 및 XML 노드 ID 세트를 줄입니다.
성능 제안:
  • 시간이 지나면 데이터베이스 업데이트로 인해 인덱스가 분할될 수 있으므로 인덱스 페이지가 필요 이상으로 늘어납니다. 인덱스를 삭제한 후 재작성하거나 인덱스를 재구성하여 이를 정정할 수 있습니다.
  • 두 개 이상의 테이블에 액세스하는 경우, 외부 테이블의 조인 컬럼에 인덱스를 제공하여 인덱스를 통해 내부 테이블에 보다 효율적으로 액세스할 수 있습니다.
  • 통계가 최신 상태가 아닌 경우, RUNSTATS 명령을 사용하여 업데이트하십시오.
XML 문서 스캔
이 연산자는 XPath 표현식을 평가하고 필요한 문서 조각의 압축을 풀기 위해 XML 조각 탐색을 나타냅니다.
XML 인덱스 AND 연산
이 연산자는 다중 인덱스 스캔 결과의 XML 데이터에 대한 인덱스 AND 연산을 나타내며 단일 쿼리의 복합 술어 평가에 사용됩니다.
이 연산을 사용하려면 다음 조건이 충족되어야 합니다.
  • 등호 술어만 사용됩니다.
  • 인덱스 검색 경로에 와일드카드가 없습니다.
  • 모든 술어가 동일한 XML 컬럼에서 사용됩니다.

이러한 조건이 충족되지 않으면 인덱스 교차 연산이 대신 사용됩니다.

성능 제안:
  • 시간이 지나면 데이터베이스 업데이트로 인해 인덱스가 분할될 수 있으므로 인덱스 페이지가 필요 이상으로 늘어납니다. 인덱스를 삭제한 후 재작성하거나 인덱스를 재구성하여 이를 정정할 수 있습니다.
  • 통계가 최신 상태가 아닌 경우, RUNSTATS 명령을 사용하여 업데이트하십시오.
  • 일반적으로 인덱스 스캔은 몇 개 행만 규정하는 경우 가장 효과적입니다. 규정 행 수를 추정하기 위해 옵티마이저는 술어에 참조된 컬럼에 사용 가능한 통계를 사용합니다. 일부 값이 다른 값보다 더 자주 발생하는 경우, RUNSTATS 명령에 WITH DISTRIBUTION절을 사용하여 분산 통계를 요청하는 것이 중요합니다. 옵티마이저는 균일하지 않은 분산 통계를 사용하여 자주 발생하는 값과 드물게 발생하는 값을 구별할 수 있습니다.

피드백