SELECT A~MATNR B~MAKTX C~ZMODULE
INTO CORRESPONDING FIELDS OF TABLE GT_MOD
FROM MARA AS A JOIN MAKT AS B
ON B~MATNR = A~MATNR
AND B~SPRAS = SY-LANGU
JOIN ZQMT001 AS C
ON C~MATNR = A~MATNR
WHERE A~MTART IN S_MTART
AND A~ATTYP = '02'
AND A~MATNR IN S_MATNR.
위와 같은 sql문이 있습니다.
ST05 로 Trace 해보면 ZQMT001 이 FULL SCAN 되고 있습니다.
근데 ZQMT001은 MATNR 이 primary index 입니다.
왜 index 를 안타고 full scan 하는지 이유를 모르겠습니다.
왜 그럴까요?
댓글 7
-
MadMax
2010.02.09 01:48
-
아밥
2010.02.09 02:11
아닙니다. ZQMT001 의 key는 MANDT MATNR 두개 뿐입니다.
-
MadMax
2010.02.09 03:05
ST05 trace 추적 List 에 해당 row 정보중(아래 기준으로)
DD02T 를 클릭 하시면 Index 정보가 나옵니다.
1 TABLE ACCESS FULL DD02T
( Estim. Costs = 1,713 , Estim. #Rows = 955,270 )
Estim. CPU-Costs = 285,115,405 Estim. IO-Costs = 1,689
예상되는 문제점으로.
1.해당 인덱스 (~0) 에 해당 필드의 값이 다 있는지 확인
-> 가끔은 Join 시 mandt 도 지정을 해야 하는 경우도 있습니다.
2. DB Utility 에서 인덱스 삭제후 재 생성 -> Table 변경이 아니라 인덱스 변경 입니다.
그래도 안되면.. ㅜㅜ;
-
Jonc
2010.02.09 03:05
드라이빙 테이블이 어떤건지요?
mtart , matnr 조건 들어오는지요 ?
플랜 캡처 올려 주실수 있는지요?
드라이빙이 잘못되고 있는것 같기도 합니다.
관련 정보 좀 더 올려주세요.....
-
아밥
2010.02.09 04:52
드라이빙이란 어떤걸 말씀하시는건지 잘 모르겠습니다,
드라이빙 테이블이 뭔가요?
-
MadMax
2010.02.09 18:01
full scan하는 실행 Plan 을 올려 주세요. 입력된 값도 같이.. s_matnr, s_mtart 값이 어떤것이 들어가는지... data 건수도....
예) 입력되는 s_matnr, s_mtart (mtart 값이 있어도) 이 없는 경우 mara 와 zqmt001 의 data 건수를 비교해보면(예상으로 zqmt001 이 적을것 같음) 적은쪽 table 을 full scan 한후 그 값으로 많은쪽을 index scan 하는쪽이 시간이 덜 걸리겠지요.(상식적으로)....
즉 조건에따라서 full scan 하는 것이 index scan 하는것 보다 유리 할 수 있다는.... 참고하세요..
-
나무나라
2010.02.10 00:39
제 생각에도 MadMax님께서 말씀하신 내용과 같습니다.
조건에 따라 다를것 같은데...
만약 MATNR 또는 MTART 값이 조회 조건으로 들어 오면 TABLE ZQMT001을 조회 할때 부분 범위 처리가 가능하여 index scan을 할수 있겠지만...
위의 두개 조회 조건 입력이 되어 있지 않으면 ATTYP이 INDEX가 되어 있지 않아 MARA FULL SCAN을 할겁니다.
이때 COST 값이 작은 ZQMT001 부터 FULL SCAN으로 처리 되지 않을까 합니다.
만약 MATNR / MTART 값이 입력해도 FULL SCAN으로 나오면 아마 INDEX SCAN보다 COST값이 작아서 FULL SCAN 처리 할 겁니다.
정확한 것은 TABLE의 상태나 DB 설정 값 데이터 건수등등.. 보다 많은 데이터가 필요하지만,
최소한 PLAN 값이라도 있어야 할듯 합니다...
ZQMT001 Key 구성이 어떻게 되어 있는지요? 혹쉬 MANDT 와 MATNR 사이에 다른 필드가 있는지요.
있다면 Full Scan 하는것이 맞습니다.