메뉴 건너뛰기

bysql.net

 

1.1  부분범위 처리의 개념

 

ㅁ 부분범위 처리란 조건을 만족하는 전체범위를 처리하는 것이 아니라 일단 운반단위(Array Size) 까지만 처리 하여

     추출하는 처리방식.

ㅁ 처리 범위가 넓더라도 빠른 속도를 얻도록 하기 위함.

ㅁ 일부분만 처리하고서도 Optimizer의 특성을 이용하여 정확한 결과 도출.

 

 

ㅁ 부분범위 처리의 개념

    -조건에 맞는 Data가 많을 수록 Array Size는 빨리 찰 확률이 높다.

    -Array Size에 빨리 차기만 하면 DB는 바로 보내준다.

 

ㅁ 전체범위 처리 : 조건이 Table의 전체를 읽어야만 결과가 나옴

ㅁ 부분범위 처리 : 조건이 일부분만 Access하고도 운반단위로 넘길수 있음.

*실행계획에서 Sort가 나오면 전체범위 처리를 함. 

 그림1.jpg

 1.2 부분범위 처리의 적용원칙

 

논리적으로 보았을 때 반드시 전체범위를 읽어서 가공을 해야만 하는 경우를 제외한 모든 형태에서 가능합니다.

1)Select ?List 에 Sum.Count 등의 Group Function 이 있으면 불가능
2)Order by가 사용되었다면 불가능

?Driving 역할을 하는 Index와 Order by 에 사용된 Column이 동일하다면 가능.

  (Index의 Access 순서와 Order by 순서가 동일 함으로 Optimizer는 Order by를 무시하고 Index로 처리하여 결과를 부분범위 Return)

?Union 과 UnionAll

  Union : 중복을 제거 하므로 전체범위 처리

  UnionAll : 중복을 확인 하지 않으므로 부분범위 처리

 

1.2.2.  Optimizer Mode에 따른 부분범위처리

 

Select ord_dept,ordqty

From order

Where ord_dept > ‘1000’;

 

논리적으로 부분범위 처리가 가능하나 Optimizer Goal이 ‘All_Rows’라면?

 ->손익분기점을 초과한다면 Index를 사용하지 않고 전체 Table Scan 한다.
 

?전체범위를 처리한다면 Index, First_Rows와 같은 Hint를 사용하라.
?온라인 위주의 처리라면 Optimizer 목료를 ‘First_Rows’로 지정하라
 

1.3.  부분범위처리의 수행속도 향상원리 Ⅰ

 

 

Select * from order;

->부분범위 처리 되므로 빠름

 

Select * from order

Order by item;

->정렬작업을 위해 전체 범위를 모두 처리함으로 느림.

 

Item에 Index가 있다면?

Select * from order

Where item >’’;

->Optimizer 목표가 ‘All_Rows’가 아니라면 Item index를 사용하여 부분범위 처리.
 

Select /*+ index(order item_index) */ *

From order

Where item > ’’;

 

1.3.  부분범위처리의 수행속도 향상원리 Ⅱ

 

 

Select  *

From order

Where ordno between 1 and 1000

And custno like ‘DN%’;

 

조건: Order Table에는 Ordno 조건을 만족하는 Row가 1000건 Custno를 만족하는 Row가 10건이고 각각 별도의 Index가 생성되어 있다. 

1)Ordno Index를 사용한 경우

  -운반단위를 채우기 위해서는 최악의 경우 1000건을 다 뒤져봐야 알 수 있다. page 421 그림

2) Custno Index를 사용한 경우

  로우가 10건이므로 10회만 처리하면 됨.

  만족하는 조건도 1000건으로 많음.

  page 422 그림

 

 

1.3.  부분범위처리의 수행속도 향상원리 Ⅲ

 

Ordno 실행계획

그림2.jpg  

 

 

Custno 실행계획

그림3.jpg 

 

??