안녕하세요..
막대한 양의 데이타를 조회하는 것두 아니고, 단지 데이타가 많은 테이블을
조회한다는 이유로 Select 시간 겁나게 걸리네요..
Select 문은 다음과 같네요
* 아래 쿼리문 Select 하는 데 걸리는 시간 : 약 3분 2초
SELECT a~charg a~mblnr b~budat c~ebeln c~ebelp c~effwr
c~menge d~knumv d~waers d~wkurs d~lifnr
INTO CORRESPONDING FIELDS OF TABLE gt_postk
FROM mseg AS a
JOIN mkpf AS b
ON a~mblnr = b~mblnr AND a~mjahr = b~mjahr
JOIN ekpo AS c
ON a~ebeln = c~ebeln AND a~ebelp = c~ebelp
JOIN ekko AS d
ON c~ebeln = d~ebeln
FOR ALL ENTRIES IN gt_bill
WHERE a~charg = gt_bill-charg
AND ( a~bwart = '101'
OR a~bwart = '545' ).
* 아래 쿼리문 Select 하는 데 걸리는 시간 : 약 2분 36초
SELECT a~charg a~mblnr b~budat
APPENDING CORRESPONDING FIELDS OF TABLE gt_postk
FROM mseg AS a
JOIN mkpf AS b
ON a~mblnr = b~mblnr AND a~mjahr = b~mjahr
FOR ALL ENTRIES IN gt_bill
WHERE a~charg = gt_bill-charg
AND a~bwart = '561'.
gt_bill에는 66건의 데이타가 있습니다.
위의 퀴리문을 실행하는 데 무려 약6분이 걸리네요..
좀 더 빠르게 데이타를 가져올 수는 없을까요?
첫 번째 Select문에서 join된 PO 테이블(EKKO, EKPO)을 분리하면 좀 더 괜찮을 까요?
고수님들의 부탁드립니다.
6분이라....휴~~~실행하고 담배하나 피고 들어오면 될러나...
댓글 7
-
e-abap
2007.05.17 02:49
-
강진규
2007.05.17 03:49
where 조건에 키값이 하나도 없네요..
인덱스를 잡으시던가
아니면 최소한 연도라도 주면 나아지지 않을까요??
-
鵬의 날개
2007.05.17 04:02
저도 강진규님 생각과 같습니다...
키값이 전혀 없네요...
그런데 for all entry가 select ~ endselect 보다 빠르지 않나요???
튜닝시 디비 접근 횟수를 줄이는 것도 중요시 생각합니다...
위와 같이 조건이 광범위 하게 잡혀 있을시...
loop~endloop 돌며 select ~ endselect 처리하면 오히려 더 느려질것 같군요...
-
dams80
2007.05.17 04:54
For all entries in 강추! Where 절에 index 조건 초 강추... 개발 서버와 운영서버에서의 데이터 핸들링 시 index 의 힘을 느끼시게 될겁니다. 열심히 하세요 -
김지성
2007.05.17 17:46
e-abap님, 강진규님,鵬의 날개님,dams80님 답변 고맙습니다.
Index를 어떻게 잡아야 하는 지, 해본 적이 없어서리..ㅠ.ㅠ;...
dams80님 저두 Index의 힘을 느끼게 해주세염.....
-
skna
2007.05.17 21:30
인덱스 생성시 필드의 순서에는 영향을 받지 않는지 궁금하네요..
인덱스를 타지 않는 경우가 종종 발생을 하는 건 어찌된 일인지..
소견으로는
gt_bill 건수가 많지 않으니..
두개다 range 변수로 사용해서 in 구문으로 사용하는게 좋을거 같은데요.
for all entry는
select ~ endselect 를 loop 처리하면서 처리합니다. 위 구문에서 인터널테이블 66개니 66번 도는거죠.
range 변수는 한번에 select 합니다. select ~ where charg eq '1' or eq '2' eq 3~~ 이런식으로 해석해서 수행되죠.
어느게 빠른지 테스트 해보시고 리턴 부탁드립니다.