database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
ㆍSybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Sybase Q&A 2238 게시물 읽기
No. 2238
오라클의 역순 인덱스로 MAX값 취하는 방법과 비슷한 방법을 알고 싶습니다.
작성자
야옹
작성일
2008-06-11 17:34
조회수
10,716

안녕하세요. 오라클만 사용하다보니 Sybase는 문외한이라..

오라클에서 역순 인덱스로 최대값을 구했었는데 Sybase에서는 어떻게 하는지 모르겠어서 질문을 드립니다.


select /*+ index_desc(a pk_idx) */ nvl(max(col1), 0) + 1 from tab1 where col1 like '1%' and rownum = 1;


이런식으로 구했었는데 sybase에서는 이런 힌트를 주거나 할수 있는 방법이 있나요? 

아니면 그냥 알아서 잘 플랜을 떠주는지.. 알고 싶습니다. 


현재는 이렇게 주고 있습니다.

select max(col1) + 1 from tab1 where like '1%';


그냥 이렇게 주면 플랜이 제대로 떠지는지 알고 싶습니다. 

이 글에 대한 댓글이 총 4건 있습니다.

tab1의 col1이 index로 잡혀 있으면



그냥 젤 마지막 거 읽습니다.



힌트 안주셔요 됩니다.



config에 


allow backward scans이라는 항목이 있는데, default가 1입니다.



신경 안쓰고 하셔도 됩니다.




Sybase는 오라클처럼 hint를 주지 않아도 cost base로 가장 저렴한 경로를 알아서 



잘 찾아줍니다(?)

지연님이 2008-06-12 16:40에 작성한 댓글입니다. Edit

명확히 하고 싶으시면

index create시에 decending index를 create 하시고

select top 1
         col1
  from tab1 (index명칭)

하시면 됩니다.

김충관(kcg1932)님이 2008-06-16 13:27에 작성한 댓글입니다.

힌트를 안 주시면 원하는 결과를 못 가져 오는 경우가 있습니다.

특히, index를 desc로 만들 경우 asc로 가져 올 때 또 고민을 해야하는 경우도 있습니다.


Sybase, MSSQL은 FROM 절에 WITH로 Hint를 주게 됩니다.


참조 URL를 달아 놓습니다.


http://www.ianywhere.com/developer/product_manuals/sqlanywhere/0902/en/html/dbrfen9/00000419.htm

송장원(jnjill)님이 2008-07-15 10:47에 작성한 댓글입니다.

처음에 질문 하신분 sql 에 문제가 있는듯 합니다.
1)
select /*+ index_desc(a pk_idx) */
        nvl(max(col1), 0) + 1 from tab1
where col1 like '1%' and rownum = 1;

위 문장에 index를 desc로 읽으면서 첫번째를 fetch하는것 처럼 보이나
실제 위의 sql문장은 where col1 like '1%' 데이타 전체를 읽게 됩니다.

2)
그리고 /*+ index_desc(a pk_idx) */ 고and rownum = 1

문장은 전혀 필요 없는 문장입니다.

3)
select /*+ index_desc(a pk_idx) */
        col1 + 1 from tab1
where col1 like '1%' and rownum = 1;

이게 원래 하고자 하는 문장이라고 생각이 됩니다.

아마 해당 데이타가 없을 때는 대비해서 max 함수를 사용한거 같은데
max 함수를 사용함으로 인해서 필요 없는 문장이 발생했습니다.

3) 문장과 같이 사용하시고 fetch row가 없으면 1을 Assign 해야 합니다.

그리고 위와 같은 sybase 문장은
select isnull(max(seq ),0) + 1
   from tab1
 where  col1 like '1%'

라고만 해도 Backward Scan이 발생을 합니다.

물론 역순 Index를 만들고 사용해도 되지만
위와 같이 사용하는 것 만으로 충분히 Index를 전부 읽지 않고
index를 역순으로 읽고 첫번째 값에서 Stopkey가 발생을 하게 됩니다.

Plan을 확인해 보시면 될 겁니다.


※ 참고로 Oracle에서도 Optimizer의 버전이 높아지면서
   select nvl(max(seq),0) + 1  from tab1
    where con1 = '1%';

라고 사용을 해도
   INDEX RANGE SCAN (MIN/MAX)
이런 Plan이 나오면서 Sybase와 동일하게 수행을 하게 됩니다.

물론 index_desc를 사용하는 것이 원칙이나
index 컬럼을 이용해서 순번을 채번하는 경우
max 함수를 사용해도 무방할 거 같습니다.

항상 Plan을 보면 답이 나옵니다.
김충관(kcg1932)님이 2008-07-21 16:24에 작성한 댓글입니다.
이 댓글은 2008-07-21 16:37에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
2242listing contents of tape drive [1]
2008-06-18
7555
2241[질문] backup시 발생한 에러 인데 무슨에러인지 알려주세요.. [1]
박민규
2008-06-17
7226
2240쿼리 실행시 에러에 관해 문의해 봅니다. [1]
정승호
2008-06-16
8861
2238오라클의 역순 인덱스로 MAX값 취하는 방법과 비슷한 방법을 알고 싶습니다. [4]
야옹
2008-06-11
10716
2237Database 행 [1]
박충원
2008-06-10
6889
2236변수 선언시 error [1]
유대현
2008-06-04
7695
2235bcp out 시 텍스트 한정자 설정 가능한가요? [1]
이창형
2008-06-04
8058
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다