2010-02-24 5 views
0

최대 절전 모드에서 사용할 다음 쿼리를 내부 쿼리에서 rownum 변수를 사용하는 방법을 알아낼 수 없습니다. 다음과 같이 쿼리입니다 : 내가하는 방법을 사용할 수 있습니다내부 쿼리의 최대 절전 모드 및 rownum

select emp.prof_key, emp.prof_display_name 
from empinst.emp emp 
where emp.prof_key IN (select x.object_key 
        from (select event.object_key as object_key 
         from empinst.eventlog event 
         where event.event_name = 'profiles.created' 
         and event.event_source = 'Profiles' 
         order by event.created desc) x 
        where rownum <= 10) 

유일한 방법은 두 부분으로 쿼리를 파괴하는 것입니다하지만 난 최대 절전 모드에서 그것을 할 수있는 더 효율적인 방법이 있어야합니다 가정합니다.

미리 감사드립니다.

마이클.

+1

왜 당신이 하위를 제한 할 않습니다

예를 들어,이보기는 당신이 주문 열 event_date에 따라 (event_name, event_source)의 조합을 위해 최근 10 개의 기록을 필터링하는 데 사용할 수있는 순위 열이 포함됩니다 -질문? 하위 쿼리에서 반환되는 행 수와 실제 결과 집합의 행 수 사이에는 (대개) 많은 관계가 없습니다. – APC

+0

이벤트 로그에서 처음 10 개의 행을 임의로 선택하는 것은 의미가 없습니다. 무작위 샘플링을 할 의도가 있습니까? 또한 "rownum variable"은 무엇을 의미합니까? 리터럴 값을 사용했습니다. 대신 바인드 변수를 사용하는 방법을 묻고 있습니까? –

+0

rownum 변수는 행 번호를 리턴하고 페이지 매김에 사용되는 oracle의 예약어입니다. 가장 최근 10 개의 이벤트 로그 레코드를보고 싶기 때문에 10 개의 행만 표시하려는 이유가 있습니다. 10이라는 숫자는 임의적이지만 최대 x 레코드 만보고 싶습니다. 테이블 자체에는 10,000 개의 레코드가 포함될 수 있습니다. 내부 쿼리없이 쿼리를 실행하면 쿼리는 약 24 초 만에 반환하고 내부 쿼리는 0.3 초 ​​내에 반환합니다. –

답변

1

귀하의 검색어로 최근 10 개의 레코드가 필터링되지 않습니다. ORDER BY 절이 없기 때문에 10 임의의 레코드 (신뢰할 수없는 순서와 무작위)를 반환합니다.

나는 최대 절전 모드의 한계에 익숙하지 않지만, 모든 제한 도구와 마찬가지로 잘 생각한보기로 주위를 해결할 수 있다고 확신한다.

CREATE VIEW eventlog_rank_v AS 
SELECT e.*, 
     row_number() OVER (PARTYTION BY e.event_name, 
             e.event_source 
          ORDER BY e.event_date DESC) event_rank 
    FROM empinst.eventlog e; 
+0

안녕하세요, 잘 발견되었습니다! by 질의에서 빠진 순서대로 (최대 절전 모드에서 꺼내서 sqldev에서 수정하여 명령문을 놓치기 시작했습니다. 원래 질문을 편집하여 편집했습니다. –

+0

@Michael : 당신의 질의는 여전히 수정이 필요하다 :'ORDER BY' 절은'WHERE' 절 다음에 * 평가된다. 기본적으로 당신의 질의는 SELECT 10 행 ** 무작위 **, 그리고 나서'ORDER BY event.created'를 참조한다. TOP의 예 : //stackoverflow.com/questions/1735614/how-to-select-n-rows/1735644#1735644 또는 http://stackoverflow.com/questions/909923/more-elegant-sql/909963#909963 - N queries –

+0

당신이 맞습니다. 당신이 제공 한 링크와 좀 더 가깝게 쿼리를 보았습니다. 당신이 설명한대로 정확하게 쿼리가 수행되고있는 것처럼 보였습니다. 이제 올바른 데이터를 생성하고있는 것을 볼 수 있기 때문에 다시 변경했습니다. –