요새 부쩍 튜닝에 관심을 두고 있는데 질문이 생겨서요~
이거 저거 해봤는데 방법이 없는거 같습니다만... 혹시 방법이 있는가 해서요
아래 내용에서 보면 INNER JOIN을 하면 MARA INDEX를 먼저 타고 MBEW을 읽는데요. 빠릅니다 이렇게 되면
그러나 LEFT JOIN을 하면 MBEW을 INDEX를 타고 MARA를 읽습니다.
그런데 MBEW에 조건이 1개 MANDT만 들어가는것으로 보여지구요. 사실상 없는거죠? 그래서 그런지 상당히 느리네요
이렇게 되는것을 INNER JOIN 결과처럼 MARA를 먼저 읽고 MBEW로 가는 방법이 있을까요?
LEFT JOIN하면 원래 저렇게 되는건가요?
단 WHERE 절 조건은 변경 없이 말입니다.
아 그리고
FOR ALL ENTRIES 쓰라는 말씀은 말아주시구요 ^^ 요놈도 느립니다
아래 결과
-----------------------------------------------------------------
DATA : BEGIN OF it_itab OCCURS 0,
matnr LIKE mara-matnr,
verpr LIKE mbew-verpr,
END OF it_itab.
SELECT
a~matnr
b~verpr
INTO CORRESPONDING FIELDS OF TABLE it_itab
FROM mara AS a INNER JOIN mbew AS b
ON a~matnr = b~matnr
AND bwkey EQ '1000'
AND bwtar EQ space
AND vprsv EQ 'V'
WHERE matkl = '101'
.
-------------------------ST05------------------------------------
0 SELECT STATEMENT ( Estimated Costs = 1.746E+04 [timerons] )
1 RETURN
2 HSJOIN
3 [O] FETCH MBEW
4 IXSCAN MBEW~0 #key columns: 1
5 [I] FETCH MARA
6 IXSCAN MARA~L #key columns: 2
-----------------------------------------------------------------
SELECT
a~matnr
b~verpr
INTO CORRESPONDING FIELDS OF TABLE it_itab
FROM mara AS a LEFT JOIN mbew AS b
ON a~matnr = b~matnr
AND bwkey EQ '1000'
AND bwtar EQ space
AND vprsv EQ 'V'
WHERE matkl = '101'
.
-------------------------ST05------------------------------------
0 SELECT STATEMENT ( Estimated Costs = 1.724E+04 [timerons] )
1 RETURN
2 NLJOIN
3 [O] TBSCAN
4 SORT
5 FETCH MARA
6 IXSCAN MARA~L #key columns: 2
7 [I] FETCH MBEW
8 IXSCAN MBEW~0 #key columns: 4
-----------------------------------------------------------------
답변 부탁드리겠습니다~ 꾸벅!
댓글 5
-
andy
2009.10.16 02:24
-
비와바람
2009.10.16 19:33
WHERE 조건은 변경이 없다는 전제구요
그리고 LEFT JOIN은 WHERE에 쓸수가 없습니다
-
정군
2009.10.17 00:02
hint 사용 고려해 보세요. -
MadMax
2009.10.17 00:04
left 는 OUTER join 이라 driving table 의 검색조건을 where 절에 사용이 안됩니다.
비추중 하나는 oracle hint 를 사용하는 것인데.. 이것은 강제 적용이라 속도가 더 늦어질 수 있습니다.
사용법은 sql 뒤에
%_HINTS ORACLE 'ordered use_nl ( &TABLE 1& &TABLE 2& )'
라고 주심 됩니다
-
비와바람
2009.10.19 17:32
답변 감사합니다! 그냥은 안되는게 맞는거 같군요~
join 조건에 AND bwkey EQ '1000'
AND bwtar EQ space
AND vprsv EQ 'V' 를 넣으셨네요.
where 절로 빼면 될거 같은데요 ^^