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 40092 게시물 읽기
No. 40092
파티셔닝 테이블에서 index_desc 처리
작성자
김지호(jihonull)
작성일
2013-04-09 14:21
조회수
6,529

파티셔닝 테이블에서 index_desc 와 2 개의 inline 절을 사용하여 쿼리한 결과에 대해서 문의 드립니다.

아래에서 보시면 t_event 는 1~12월까지 month 로 나누어진 partitioning 테이블이입니다.

--------------------------------------------------------------------------------------

select /*+index_desc( t_event  i_event_alarmtime)*/
rownum rnum, seq_no 

from t_event

where ((user_id in  (select user_id from t_user where user_no = 1163))

     and user_id not in (select user_id from t_deleted_user  where status = 1 ) )

     and alarm_time between to_date('2013-03-27 00:00:00','yyyy-mm-dd hh24:mi:ss')

               and to_date('2013-04-01 23:59:59','yyyy-mm-dd hh24:mi:ss')

-----------------------------------------------------------------------------------------

A 사이트 : 4월 1일 치 이벤트 부터 순서대로 나옵니다. desc 이므로.

B 사이트: 3월 27일 치 이벤트 부터 나옵니다. asc 순서  --> 잘못된 결과이고 간헐적으로 asc 로 결과가 나옴 ㅜ,ㅜ

위의 sql 문에서 파란색 부분을 다음 처럼 하면 B 사이트에서도 문제는 없습니다.

and user_id not in (122, 4344 )

1)두번째 inline 절이 들어가면서 inline 절이 처리대는 순서에 따라 옵티마이저가 index_desc 를 사용할수도, 안할수도 있는건가요?

2) 그렇다면, 힌트에 ordered 를 추가하면 될까요 ? 

어떤 연관이 있는지 고수님들께서 의견 좀 주세요 

필요하면 실행계획도 올리겠습니다 ^^

꾸벅

 

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

INDEX_DESC 힌트보다는
ORDER BY alarm_time DESC 정렬구문이 필요해 보입니다.
ROWNUM 조건과 함께 사용한다면 힌트가 의미 있겠지만.
단지 정렬을 위해 추가한 힌트라면
정렬구문으로 바꾸시기를 권합니다.
정렬구문만 사용하더라도 거꾸로 읽어야 할 필요가 있다고 판단된다면
옵티마이저가 지가 알아서 인덱스 거꾸로 읽습니다.


반면에 힌트는 실행계획이 어떻게 세워지는냐에 따라
인덱스를 탈 수도 있고 안탈 수도 있으며
힌트대로 인덱스를 거꾸로 탔다고 치더라도 조인과정에서
정렬이 흐트러질 수 있습니다.
중첩루프(NL)조인의 경우엔 Driving 테이블 조회 순서대로 나오지만
해쉬나 소트머지 조인의 경우엔 그렇지 않지요.
결국 정렬을 원한다면 정렬구문을 추가하세요.


Not In 은 실행계획을 어렵게 만드는 경향이 있습니다.
다른 방식으로 바꿔보세요.
 WHERE user_id IN (SELECT a.user_id
                     FROM t_user a
                        , t_deleted_user b
                    WHERE a.user_no = 1163
                      AND a.user_id = b.user_id(+)
                      AND b.status(+) = 1
                      AND b.user_id IS NULL
                   )

마농(manon94)님이 2013-04-09 15:16에 작성한 댓글입니다.

마농님 답변 감사드립니다.

위 sql을 subquery 로 아래처럼 또 추출합니다.

------------------------------------------------

 

select to_char(seq_no) seq_no from (

select /*+index_desc( t_event  i_event_alarmtime)*/

rownum rnum, seq_no 

from t_event

where ((user_id in  (select user_id from t_user where user_no = 1163))

     and user_id not in (select user_id from t_deleted_user  where status = 1 ) )

     and alarm_time between to_date('2013-03-27 00:00:00','yyyy-mm-dd hh24:mi:ss')

) where rnum > 0 and rownum <= 10;

 

말씀하신것처럼 rownum 과 사용되기 때문에 hint 는 유효할 거 같습니다.

몇가지 질문이 더 있습니다.

1. 

제 생각에는 where 조건에 alarm_time is not null 을 넣어서 옵티마이저가 꼭 힌트를 타도록 하는게 어떨까 ???  합니다.

 

     and user_id not in (select user_id from t_deleted_user  where status = 1 ) )

     and alarm_time is not null

     and alarm_time between ~~~

 

시험서버에서는 정상이고 사이트 서버에서는 간헐적으로 정렬이 잘못되어져 나오는데.

위처럼 추가하면 반드시 힌트를 탈거 같은데요. 어떤가요 ??

 

2. 사이트 서버에서 sqlplus 사용하여 테스트 해보면 잘 나오는데, 

    애플리케이션에서 수행하면 간헐적 발생합니다. 이러한 애플리케이션에서

수행된 쿼리의 실행계획을 얻으려면 확인방법이 어떤게 있을까요??

 

부탁드려요 ,. 꾸벅

 

 

 

 

김지호(jihonull)님이 2013-04-10 13:29에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
40096CASE WHEN 문에 대해 [2]
도움이 필요해요
2013-04-15
6642
40095[재질문] index_desc 힌트의 반대 정렬 경우 [1]
김지호
2013-04-12
7215
40093DB연결이 자주 끊기는 현상
한상원
2013-04-10
7025
40092파티셔닝 테이블에서 index_desc 처리 [2]
김지호
2013-04-09
6529
40091sqlplus 계정 <VIEW.sql 실행 시 [1]
소태섭
2013-04-05
6239
40089[질문] 쿼리 문의 [2]
박원
2013-04-05
6702
40086특정문자로 시작하는지 판단 [2]
이민우
2013-04-04
5935
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다