아래의 쿼리는 S_ALR_87012993 오더:실제/계획/차이 :선택 프로그램의 일부입니다.
지난번에 사실 두루뭉실하게 질문을 한번 올렸던 적이 있었죠. 너무 갑갑해서요. 이번에도 그런 맘에서 올려봅니다..ㅠㅠ
아래 쿼리같은게 총 3개가 있습니다. 물론 테이블은 각각 다르죠.(AUFK,COSP,COSS). 동일한 형태의 쿼리 3개가 돌아가는데 거의 50분가량 소요가 됩니다. 하나당 거의 15분씩 수행이 되고 있죠.
CO쪽의 스탠다드프로그램(Report painter로 만들었다고 하네요)을 카피해서 현재 이리저리 해보려고 하는데...쉽지가 않네요. 사실 다른 부분은 어딜 어떻게 손을 대야 할지 엄두가 안나기도 하구요. (카피한 거라 맘대로 쭈물럭 거려도 상관은 없지만, 괜히 손댔다가 오류만 왕창뜰거 같기도 하고...)
그래서 가장 시간이 많이 걸리는 쿼리 부분만 어떻게 해보려고 하는데...도무지 감이 안옵니다. 혹시 아래의 쿼리를 보시고 뭔가 시간을 줄일만한 힌트라도 있으면 고수님들의 조언 부탁드리겠습니다. CO프로세스에 정통하신 분께선 오더를 추려보라고도 하셨는데...현업에서는 어떤 오더가 어떻게 들어 가야할지 결정하는 것은 쉬운일이 아니라고 하시더군요. 그래서 검색할 오더(OBJNR) 범위를 줄이는 것은 힘들것 같구요.
아무래도 GROUP BY쪽에서 뭔가 변화가 있어야 되지 않을까...라는 어렴풋한 생각만 마냥 듭니다.. 참...갑갑합니다...ㅠㅠ 도와주십시오~~~~~~~~~
이것을 실제 쿼리추적을 통해서 봤을 땐 아래처럼 나옵니다.
SELECT |
"LEDNR" , "OBJNR" , "GJAHR" , "WRTTP" , "VERSN" , "KSTAR" , "VRGNG" , |
"BEKNZ" , "TWAER" , "PERBL" , "MEINH" , SUM( "WTG001" ) "WTG001" , |
SUM( "WTG002" ) "WTG002" , SUM( "WTG003" ) "WTG003" , |
SUM( "WTG004" ) "WTG004" , SUM( "WTG005" ) "WTG005" , |
SUM( "WTG006" ) "WTG006" , SUM( "WTG007" ) "WTG007" , |
SUM( "WTG008" ) "WTG008" , SUM( "WTG009" ) "WTG009" , |
SUM( "WTG010" ) "WTG010" , SUM( "WTG011" ) "WTG011" , |
SUM( "WTG012" ) "WTG012" , SUM( "WTG013" ) "WTG013" , |
SUM( "WTG014" ) "WTG014" , SUM( "WTG015" ) "WTG015" , |
SUM( "WTG016" ) "WTG016" , SUM( "WOG001" ) "WOG001" , |
SUM( "WOG002" ) "WOG002" , SUM( "WOG003" ) "WOG003" , |
SUM( "WOG004" ) "WOG004" , SUM( "WOG005" ) "WOG005" , |
SUM( "WOG006" ) "WOG006" , SUM( "WOG007" ) "WOG007" , |
SUM( "WOG008" ) "WOG008" , SUM( "WOG009" ) "WOG009" , |
SUM( "WOG010" ) "WOG010" , SUM( "WOG011" ) "WOG011" , |
SUM( "WOG012" ) "WOG012" , SUM( "WOG013" ) "WOG013" , |
SUM( "WOG014" ) "WOG014" , SUM( "WOG015" ) "WOG015" , |
SUM( "WOG016" ) "WOG016" , SUM( "WKG001" ) "WKG001" , |
SUM( "WKG002" ) "WKG002" , SUM( "WKG003" ) "WKG003" , |
SUM( "WKG004" ) "WKG004" , SUM( "WKG005" ) "WKG005" , |
SUM( "WKG006" ) "WKG006" , SUM( "WKG007" ) "WKG007" , |
SUM( "WKG008" ) "WKG008" , SUM( "WKG009" ) "WKG009" , |
SUM( "WKG010" ) "WKG010" , SUM( "WKG011" ) "WKG011" , |
SUM( "WKG012" ) "WKG012" , SUM( "WKG013" ) "WKG013" , |
SUM( "WKG014" ) "WKG014" , SUM( "WKG015" ) "WKG015" , |
SUM( "WKG016" ) "WKG016" , SUM( "WKF001" ) "WKF001" , |
SUM( "WKF002" ) "WKF002" , SUM( "WKF003" ) "WKF003" , |
SUM( "WKF004" ) "WKF004" , SUM( "WKF005" ) "WKF005" , |
SUM( "WKF006" ) "WKF006" , SUM( "WKF007" ) "WKF007" , |
SUM( "WKF008" ) "WKF008" , SUM( "WKF009" ) "WKF009" , |
SUM( "WKF010" ) "WKF010" , SUM( "WKF011" ) "WKF011" , |
SUM( "WKF012" ) "WKF012" , SUM( "WKF013" ) "WKF013" , |
SUM( "WKF014" ) "WKF014" , SUM( "WKF015" ) "WKF015" , |
SUM( "WKF016" ) "WKF016" , SUM( "MEG001" ) "MEG001" , |
SUM( "MEG002" ) "MEG002" , SUM( "MEG003" ) "MEG003" , |
SUM( "MEG004" ) "MEG004" , SUM( "MEG005" ) "MEG005" , |
SUM( "MEG006" ) "MEG006" , SUM( "MEG007" ) "MEG007" , |
SUM( "MEG008" ) "MEG008" , SUM( "MEG009" ) "MEG009" , |
SUM( "MEG010" ) "MEG010" , SUM( "MEG011" ) "MEG011" , |
SUM( "MEG012" ) "MEG012" , SUM( "MEG013" ) "MEG013" , |
SUM( "MEG014" ) "MEG014" , SUM( "MEG015" ) "MEG015" , |
SUM( "MEG016" ) "MEG016" , SUM( "MEF001" ) "MEF001" , |
SUM( "MEF002" ) "MEF002" , SUM( "MEF003" ) "MEF003" , |
SUM( "MEF004" ) "MEF004" , SUM( "MEF005" ) "MEF005" , |
SUM( "MEF006" ) "MEF006" , SUM( "MEF007" ) "MEF007" , |
SUM( "MEF008" ) "MEF008" , SUM( "MEF009" ) "MEF009" , |
SUM( "MEF010" ) "MEF010" , SUM( "MEF011" ) "MEF011" , |
SUM( "MEF014" ) "MEF014" , SUM( "MEF015" ) "MEF015" , |
SUM( "MEF016" ) "MEF016" , COUNT(*) "_COUNTER" |
FROM |
"COSP" |
WHERE |
"LEDNR" = "00" AND "OBJNR" BETWEEN "OR000070000000" AND "OR000070047489" AND "PERBL" = "016" AND "VERSN" = "000" AND |
"WRTTP" IN ( "04" , "01" , "10" , "11" ) AND "MANDT" = "100" |
GROUP BY |
"LEDNR" , "OBJNR" , "GJAHR" , "WRTTP" , "VERSN" , "KSTAR" , "VRGNG" , |
"BEKNZ" , "TWAER" , "PERBL" , |
"MEINH" WITH UR OPTLEVEL( 5 ) QUERY_DEGREE( 1 ) LOCATION( GP2KE8ZEK |
I6OUJXNHEC7XXHN7R3100 , 2178 ) SYSTEM( HCP , SAPR3 ) |
댓글 5
-
정군
2009.04.28 01:40
-
슈퍼맨아들
2009.04.28 17:57
cosp coss 를 sum해서 가져오는건 별로 query가 안좋아 보이네요..
일단 internal table로 가져와서 원하는 key값 기준으로 collect 시키세요..
-
슈퍼맨아들
2009.04.28 18:03
1. INTO CORRESPONDING FIELDS OF TABLE I_COSP PACKAGE SIZE 1000
- into table i_cosp 쓰도록 바꾸시길..
2. CLIENT SPECIFIED
- 이런 구문은 안씁니다.. 삭제요망
3. GROUP BY (GROUP_LIST).
- 해당 group에 맞는 internal table을 선언해서 collect
-
슈퍼맨아들
2009.04.28 18:12
DATA : BEGIN OF I_COSP OCCURS 0.
INCLUDE STRUCTURE COSP.
DATA : END OF O_COSP.
DATA : BEGIN OF I_COSP_TO OCCURS 0.
DATA : ....... 해당 SUM할 키값 기준
DATA : END OF O_COSP_TO.
SELECT (FIELD_LIST)
INTO TABLE I_COSP PACKAGE SIZE 1000
FROM COSP
WHERE GJAHR IN SELR_GJAHR
AND LEDNR EQ '00'
AND OBJNR IN SELR_OBJNR
AND PERBL IN SELR_PERBL
AND VERSN IN SELR_VERSN
AND WRTTP IN SELR_WRTTP.
LOOP AT I_COSP.
MOVE-CORRESPONDING I_COSP TO I_COSP_TO.
COLLECT I_COSP_TO.
ENDLOOP.
실제 조건으로 보면 PERBL, VERSN 필드가 EQ 조건으로 바뀔거라 생각이 됩니다만...
COSP COSS가 느리지만 OBJNR키값 기준으로 데이타를 한방에 가져와서 INTERNAL TABLE을 튜닝하면
속도가 생각했던것보다는 느리지 않다는걸 알아두세요..
실제 SELECT문에서 집합펑션을 쓰는것보다 .. 일반적으로 INTERNAL TABLE LOOPING이 속도가 빠릅니다..
-
hccpi
2009.09.15 18:50
프로그램을 새로 만들어서 해결했습니다^^;
원래 coss, cosp 가 덩치가 큽니다.
범위를 줄이란 이야긴 저도 드렸지만.. 현실적으로 잘 안되는 경우가 많고, 고객들은 그런거 신경안쓰죠;;;
ST05에서 trace 뜨신거면... explain 버튼 누르시면 exectution plan도 보실수 있습니다.
그것도 좀 올려보시지요.