select를 할때 날짜 기준으로 제일 최신꺼 한건만 가지고 오고 싶은데 어떻게 해야할까요?
SELECT *
INTO ls_018t
FROM zsd018t UP TO 1 ROWS
WHERE werks = gt_tab-bwkey
AND matnr = gt_tab-matnr
AND budat <= lv_budat_to
AND zfgi_hd_qty NE 0
ORDER BY budat DESCENDING.
ENDSELECT.
우선 이렇게 쓰고 있는데.. 너무 느린것 같네요.. select single을 하면 order by를 못쓰는것 같던데 도움좀 부탁드릴께요
^^
댓글 13
-
밥~~
2010.12.01 23:39
-
초밥
2010.12.01 23:47
앗 감사합니다 ^^ 그런데 그렇게 차이가 안나네요 ㅎㅎ;; 원래 느릴 수밖에 없는건가요 ㅠ -
밥~~
2010.12.02 00:02
느리다면 인덱스를 안 타고 있는것 같은데.. index 타는지 체크 먼저 해 보시구요..
아래처럼 서브쿼리도 써 보시고.... 아는 방법을 다 동원해서 해 보세요~~
SELECT single *
INTO ls_018t
FROM zsd018t
WHERE werks = gt_tab-bwkey
AND matnr = gt_tab-matnr
AND budat = ( select max( budat ) from zsd018t
WHERE werks = gt_tab-bwkey
AND matnr = gt_tab-matnr
AND budat <= lv_budat_to
AND zfgi_hd_qty NE 0 ). -
초밥
2010.12.02 01:23
관심가지고 봐주셔서 감사합니다!
인덱스를 타는지 안타는지는 어떻게 보는지 잘 모르겠구요..
기술해주신 쿼리는 해봤었지만 느리더군요 ㅎㅎ;; 감사합니다.
-
ASDF
2010.12.02 01:45
인덱스 타는지 여부는,, 제 생각엔 말이죠,,
T-code : se11 해서 table 을 한번 보시면,,
indexes.. 이런 아이콘이 있을겁니다!
클릭하시면,, 생성되어있는 인덱스 목록이 나올건데요,, 더블클릭 한번 하시면
필드 몇개씩 있을겁니다! 거기에 해당 안되는 필드를 쓰신거면
인덱스를 사용 안하신 거니까,, 속도가 느린거 같아요!
-
아밥 잭
2010.12.02 02:43
티코드 : st05를 사용하여 성능을 확인하세요.
사용 방법은 여기 사이트에서 검색해 보시면 있습니다.
-
해보자
2010.12.02 09:30
Index는 아마도 안탈듯 싶네요.
AND zfgi_hd_qty NE 0 요 부분을...
AND zfgi_hd_qty > 0 로 바꾸어 주세요.. 아마도 QTY니까... 0이 아니면.. 크겟죠?
NE 조건은 Index를 안타게 됩니다.
추가로... 조건에 해당되는 데이타가 많지 않다면..(약 1만건 이하쯤?) 데이타를 가져올때..
싱글이 아닌 해당하는 데이타 전부를 가져온후..
인터널 테이블 내에서 Sorting하여 첫번째 데이타를 사용하시는것도 고려해보세요.
-
해보자
2010.12.02 09:31
SELECT *
INTO table lt_018t
FROM zsd018t
WHERE werks = gt_tab-bwkey
AND matnr = gt_tab-matnr
AND budat <= lv_budat_to
AND zfgi_hd_qty NE 0
ORDER BY budat DESCENDING.
sort lt_018t by budat DESCENDING.
read table lt_018t index 1.
이런식으로 해보세요..
-
낙천
2010.12.02 17:04
SELECT SINGLE과 MAX함수를 사용해보세요~
-
아밥어렵네요
2010.12.02 19:00
데이터 건수가 좀 많으시면
LOOP 안에서 SELECT 사용하시는것 같은데 LOOP 이전에
다 데이터 다 구한다음 LOOP안에서 BINARY SEARCH 쓰시면 안될까요?
SELECT bwkey matnr BUDAT
INTO CORRESPONDING FIELDS OF TABLE lT_018t
FROM zsd018t
FOR ALL ENTRIES IN gt_tab
WHERE werks = gt_tab-bwkey
AND matnr = gt_tab-matnr
AND budat = ( SELECT MAX( BUDAT )
FROM werks = gt_tab-bwkey
AND matnr = gt_tab-matnr
AND budat <= lv_budat_to
AND zfgi_hd_qty > 0 )
AND zfgi_hd_qty > 0.
SORT LT_018t BY bwkey matnr .
LOOP AT gt_tab INTO gS_tab.
READ TABLE LT_018t INTO LS_018t WITH KEY bwkey = gS_tab-bwkey
matnr = gS_tab-matnr
BINARY SEARCH.
IF SY-SUBRC = 0.
~~~~
ENDIF.
ENDLOOP.
-
천사
2010.12.02 19:00
해보자님처럼 하면 안될까요? -
야생이
2010.12.02 21:07
어차피 한줄만 읽으실꺼면
SELECT SINGLE ~~ 로.. 하시면 편할꺼 같아요^^
-
초밥
2010.12.06 20:13
아 감사합니다 여러분 ㅠㅠ 이렇게 관심을 가져주셨네요.
전 두번 날려서 했는데 일단 빨라졌습니다
우선 날짜 max 값을 구하구요
그다음에 구한 날짜를 조건에 줬더니 빠르게 돼더군요 ㅎㅎ
select max( budat )
into lv_max_budat
from zsd018t
WHERE werks = gt_tab-bwkey
AND matnr = gt_tab-matnr
AND ( budat >= lv_budat_fr
budat <= lv_budat_to )
AND zfgi_hd_qty NE 0.
요렇게 구하구요.
select single *
into ls_zsd018t
from zsd018t
WHERE werks = gt_tab-bwkey
AND matnr = gt_tab-matnr
and budat = lv_max_budat.
요렇게요!
해보자님말씀대로 통째로 다 읽어서 리드 하는걸 해봤었는데 통째로 읽는데 시간이 오래 걸리더라구요 ㅠㅠ
뭐.. 어떻게 보면 두번 읽는거라서 안좋을 수도 있는지 모르겠지만.. 해본 방법 중 제일 빨라서 이렇게 해결 했습니다.
모두 관심가져주셔서 감사합니다 ㅠㅠ
SELECT *
INTO ls_018t
FROM zsd018t UP TO 1 ROWS
WHERE werks = gt_tab-bwkey
AND matnr = gt_tab-matnr
AND budat <= lv_budat_to
AND zfgi_hd_qty NE 0
ORDER BY budat DESCENDING.
exit. ---------------------------> 추가요..
ENDSELECT.