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
운영게시판
최근게시물
Oracle Q&A 23981 게시물 읽기
No. 23981
정렬을 위해 힌트를 사용하는 게 괜찮은가요?
작성자
음..
작성일
2005-09-07 09:49
조회수
2,249

오라클을 이용한 게시판에서 페이징에 대해 검색해보니 대부분 INDEX_DESC 힌트를 사용해서

역순 정렬하고 rownum 으로 범위를 제한해 가져오는 방식을 취하더군요.

그런데 궁금한게 이게 항상 작동하나요? 테스트하는 동안에 옵티마이저가 힌트를 적용했다고해서

실제 돌아가는 환경에서도 옵티마이저가 항상 힌트를 사용하라는 보장은 없지 않나요?

말 그대로 힌트일 뿐이니까요. 인덱스 힌트가 질의 속도에만 영향을 주는 경우라면 몰라도

INDEX_DESC 를 이용한 게시판 페이징처럼 힌트가 질의 결과에도 영향을 주는 경우라면 사용해서는

안되는게 아닌지하는 생각이 들어서 그럽니다.

제 생각이 맞는지 가르침 좀 주세요~

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

힌트를 주면 대부분 힌트대로 합니다.

다만 힌트를 정확하게 상세하게 주셔야 합니다.

 

예를 들면 t1, t2 테이블을 조인한다고 하고, t1 테이블에 t1_ind2 라는 인덱스가 있다고 가정합니다.

 

이때 역순으로 원하는 최대값만 가져오기 위해서 index_desc ( t1 t1_ind2) 라는 힌트만 주었다고 모든 access path를 오라클 옵티마이저에게 알려준 것이라고는 할 수 없겠죠? 당연히 가장 중요한 드라이빙 테이블도 알려주지 않았으니까요. 이럴 때 driving 테이블이 t2가 된 경우에는 아마도 원하는 결과를 가져올 수 없을 경우가 생길 것입니다.

 

이럴 경우에는 힌트를 보다 상세하게 주어야 합니다.

/*+ ordered index_desc ( t1 t1_ind2) */ 또는 /*+ leading(t1) index_desc ( t1 t1_ind2) */ 으로 할 수 있겠죠.

 

또는 더욱 상세하게 조인 방법까지 알려줄 필요가 있을 수도 있습니다.

/*+ leading(t1) use_nl(t1 t2) index_desc ( t1 t1_ind2) */

 

결론을 내리자면, 옵티마이저에게 모든 access path를 알려주면 그대로 따라한다는 것입니다.

 

그리고 주의할 것은 어떤 경우에는 힌트가 무시될 수 밖에 없습니다.

예를 들면  outer join을 할 경우에는 이미 드리이빙 테이블이 고정되는데 이를 바꾸려는 힌트를 주는 경우는 무시될 수 밖에 없겠지요. 또 테이블의 storage절에 parallel degree가 설정되어 있는 경우 RBO가 작동되지 않는데 힌트로 /*+ RULE */ 적어 준다고 rule-based optimizer가 작동하지는 않겠지요

 

아마도(amado)님이 2005-09-07 11:04에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
23984쿼리좀 알려주세요.. [1]
궁금이
2005-09-07
1231
23983Character set, DB link 어떤 문제인지? [8]
핸시기
2005-09-07
14390
23982dblink 질문 [2]
이인호
2005-09-07
2943
23981정렬을 위해 힌트를 사용하는 게 괜찮은가요? [1]
음..
2005-09-07
2249
23980힌트 질문입니다. [3]
...
2005-09-07
1683
23979쿼리 질문 좀..ㅠㅠ [1]
오라클초보
2005-09-06
669
23978리두로그파일 잘못 생성...TT [3]
이영주
2005-09-06
2891
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다