본문 바로가기

오라클 실무..

Tuning 기초 - 1

튜닝기초-1.(단순엑세스 분석).pdf

이 기사에서는 단순 액세스 분석을 통한 튜닝 첫 번째 시간으로 'IN 조건에 대한 튜닝 및 문제 해결'에 대한 정보를 얻을 수 있다.

이외의 정보에 대한 부분은 밑의 첨부된 PDF 파일을 다운로드 하면 더 자세한 정보를 얻을 수 있다.

IN 조건에 대한 액세스 분석 및 문제 해결

IN의 사용은 LIKE,BETWEEN 성격의 액세스 문제점을 해소하기 위한 좋은 해결책을 제시하는 개념이다.

이것은 LIKE,BETWEEN의 조건이 안고 있는 값의 DISTINCT를 보장하기 못하는 기본적인 한계를 극복하게 해 주는 것이다.

실행계획상에서 INLIST나 CONCATINATION이 나타나면 IN의 사용으로 인해 조건범위를 그냥 스캔하지 않고 인덱스에서 정확하게 해당 값을 찾아 널뛰기를 하였다는 증거이므로 항상 실행계획을 통해 본인이 의도한 IN의 효과가 나타났는지 확인하는 주의가 필요하다.

INLIST는 CONCATINATION 실행계획의 복잡성을 간소화한 것으로 액세스량에는 별차이가 없는 것으로 인식하면 된다.

한가지 주의할 것은 IN 조건에 값을 열거한 경우는 가장 뒤의 값부터 먼저 실행되어 나타나므로 정렬을 위하여 사용할 수도 있고, SUB-QUERY가 들어가는 경우는 값을 UNIQUE하게 만든 다음 액세스가 이루어진다는 사실을 기억하기 바란다.

특히 이러한 성격은 MAIN절의 두 테이블의 연결(조인)을 위해 IN SUBQUERY(CORLATED QUERY)를 사용할 수 있는 아주 적절한 방법을 제공한다는 것이다. 이러한 내용이 뒤에 소개하는 SUBQUERY를 이용한 데이터 연결편에서 자세히 다루어지므로 참고하기 바란다.

LIKE,BETWEEN의 해결책으로 IN을 사용하여 연결액세스를 의도한 경우는 실행계획상에서 반드시 IN안의 SUBQUERY가 먼저 수행되도독 강제하는 것이 좋다.

이러한 강제는 PUSH_SUBQ과 같은 힌트를 사용하기 보다는 일반적인 조인에서의 연결키 한쪽을 부러뜨리는 서프레싱기법을 이용하는 것이 무난하다.

SELECT *

FROM SALE

where SALEDATE = '19971219'

AND CUST_CODE IN ('C30060','C30050','C30040','C30030','C30020')

Rows Execution Plan

------- ---------------------------------------------------

SELECT STATEMENT

0 INLIST ITERATOR CONCATENATED

20 TABLE ACCESS BY INDEX ROWID :SALE

25 INDEX RANGE SCAN :PK_SALE (U)

IN 안의 각각의 값에 의해 4건씩이 SELECT된 것일까?

아래를 보면 그러지 않음을 알 수 있다.

SELECT /*+ USE_CONCAT */ *

FROM SALE

where SALEDATE = '19971219'

AND CUST_CODE IN ('C30060','C30050','C30040','C30030','C30020')

Rows Execution Plan

------- ---------------------------------------------------

SELECT STATEMENT

0 CONCATENATION

0 TABLE ACCESS BY INDEX ROWID :SALE

1 INDEX RANGE SCAN :PK_SALE (U)

0 TABLE ACCESS BY INDEX ROWID :SALE

1 INDEX RANGE SCAN :PK_SALE (U)

0 TABLE ACCESS BY INDEX ROWID :SALE

1 INDEX RANGE SCAN :PK_SALE (U)

10 TABLE ACCESS BY INDEX ROWID :SALE

11 INDEX RANGE SCAN :PK_SALE (U)

10 TABLE ACCESS BY INDEX ROWID :SALE

11 INDEX RANGE SCAN :PK_SALE (U)

SELECT CUST_CODE,COUNT(*)

FROM SALE

where SALEDATE = '19971219'

AND CUST_CODE IN

('C30060','C30050','C30040','C30030','C30020')

CONFIDENTIAL 23 2001-09-06

GROUP BY CUST_CODE

CUST_C COUNT(*)

------ ----------

C30050 10

C30060 10

SELECT /*+ INDEX(SALE SALE_CUST_SALEDATE_IDX) */ *

FROM SALE

where SALEDATE = '19971219'

AND CUST_CODE IN ('C30060','C30050','C30040','C30030','C30020')

Rows Execution Plan

------- ---------------------------------------------------

SELECT STATEMENT

0 INLIST ITERATOR CONCATENATED

20 TABLE ACCESS BY INDEX ROWID :SALE

25 INDEX RANGE SCAN :SALE_CUST_SALEDATE_IDX(NU)

SELECT /*+ INDEX(SALE SALE_CUST_SALEDATE_IDX) USE_CONCAT */ *

FROM SALE

where SALEDATE = '19971219'

AND CUST_CODE IN ('C30060','C30050','C30040','C30030','C30020')

Rows Execution Plan

------- ---------------------------------------------------

SELECT STATEMENT

0 CONCATENATION

0 TABLE ACCESS BY INDEX ROWID :SALE

1 INDEX RANGE SCAN :SALE_CUST_SALEDATE_IDX(NU)

0 TABLE ACCESS BY INDEX ROWID :SALE

1 INDEX RANGE SCAN :SALE_CUST_SALEDATE_IDX(NU)

0 TABLE ACCESS BY INDEX ROWID :SALE

1 INDEX RANGE SCAN :SALE_CUST_SALEDATE_IDX(NU)

10 TABLE ACCESS BY INDEX ROWID :SALE

11 INDEX RANGE SCAN :SALE_CUST_SALEDATE_IDX(NU)

10 TABLE ACCESS BY INDEX ROWID :SALE

11 INDEX RANGE SCAN :SALE_CUST_SALEDATE_IDX(NU)

첨부된 문서에는 다음과 같은 정보가 담겨져 있다. - 단순 액세스 분석.PDF

제1절 액세스 분석을 시작하기 전에

제2절 액세스 분석을 위한 기본모델의 설정

제3절 UNIQUE INDEX의 UNIQUE SCAN 과 RANGE SCAN(PLUS ONE SCAN)

제4절 NON-UNIQUE INDEX의 RANGE SCAN

제5절 INDEX COLUMN EXTERNAL SUPPRESSING & INTERNAL SUPPRESSING

제6절 LIKE,BETWEEN 조건의 액세스 분석

제7절 복합컬럼인덱스에서 중간컬럼값의 WHERE조건 부재로 인한 액세스 분석

제8절 IN 조건에 대한 액세스 분석