메뉴 건너뛰기

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 역할을 하는 IndexOrder by 에 사용된 Column이 동일하다면 가능.

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

?Union UnionAll

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

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

 

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

 

Select ord_dept,ordqty

From order

Where ord_dept > ‘1000’;

 

논리적으로 부분범위 처리가 가능하나 Optimizer GoalAll_Rows라면?

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

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

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

 

 

Select * from order;

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

 

Select * from order

Order by item;

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

 

ItemIndex가 있다면?

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 조건을 만족하는 Row1000Custno를 만족하는 Row10건이고 각각 별도의 Index가 생성되어 있다. 

1)Ordno Index를 사용한 경우

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

2) Custno Index를 사용한 경우

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

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

  page 422 그림

 

 

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

 

Ordno 실행계획

그림2.jpg  

 

 

Custno 실행계획

그림3.jpg 

 

??