다운받은 튜닝가이드 pdf파일을 보다보니 이해가 잘안가는 부분이 있습니다.
2. Select without index support vs. Select with index support
빈번히 사용되는 Select statements에서는 index를 사용하세요.
For all frequently used Select statements, try to use an index. You always use an index if you
specify (a generic part of) the index fields concatenated with logical Ands in the Select
statement's Where clause. Note that complex Where clauses are poison for the statement optimizer
in any database system.
DATA: wa_sflight TYPE sflight.
DATA: it_flight LIKE TABLE OF wa_sflight.
DATA: mandt TYPE mandt.
<Worse> : Runtime - 6,787ms
SELECT * FROM sflight CLIENT SPECIFIED INTO wa_sflight
WHERE carrid = 'LH'
AND connid = '0400'.
ENDSELECT.
모든 client에서 데이터를 가져오려 합니다. index를 이용하자.
<Better> : Runtime - 7,468ms (속도가 더 느리게 나왔다. 이럴 수도 있습니다.)
SELECT * FROM sflight CLIENT SPECIFIED INTO wa_sflight
WHERE mandt IN ( select MANDT from T000 )
AND carrid = 'LH'
AND connid = '0400'.
ENDSELECT.
native sql은 잘모르지만 일단 방식자체는 native랑은 틀린듯한데
sap테이블은 기본으로 mandt필드를 가지고 있기에 open sql을 쓸때 따로
mandt를 조건에 넣지 않는다고 최근 native 공부하면서 알게되었는데..
굳이 조건에 다시 mandt를 주는게 왜 인덱스를 타게 되는지 이해가 안됩니다..
댓글 5
-
불꽃남자
2009.02.11 20:22
-
카츠
2009.02.11 20:44
테이블에 항상 mandt가 있기에 따로 조건을 주지 않아도 되는지 알았는데 꼭 기술해야 하는가 보군요. 감사합니다 ^^ -
테리
2009.02.11 20:46
Open SQL 사용시 CLIENT SPECIFIED라는 명령어를 사용하면 Default로 조건에 mandt가 추가되던 것에서
직접 mandt를 지정해 주어야 하는 것으로 변합니다.
-
카츠
2009.02.11 20:50
사실 CLIENT SPECIFIED구문은 전혀 써보질 않았는데 그렇다면 CLIENT SPECIFIED+mandt조건 추가를 쓰지 않으면 인덱스를 타지 않는다는 뜻인가요?
-
진현태
2009.02.11 23:47
CLIENT SPECIFIED 구문을 쓰지 않으면 오픈SQL은 자동으로 MANDT를 현재 클라이언트로 지정되기에 INDEX가 타게 되지만..
CLIENT SPECIFIED 구문을 사용하면 클라이언트를 자기가 명시하겠다고 한건데 MANDT를 조건에 넣지 않으면 자동으로 MANDT가 추가되지 않기 때문에 PK가 순서대로 기술되어지지 않아 INDEX를 타지 않게 됩니다~
mandt가 키로 잡혀있기 때문이죠
primary key 인덱스를 사용하려면 key의 필드를 where절에 모두 기술해줘야 인덱스를 탑니다.