2013-04-14 2 views
0

최소값의 myDate 열을 가져 오려고합니다. 나는 다음과 같은 쿼리를 사용하는 것이 수행하려면 :Oracle에서 최대 값을 갖는 행을 얻기위한 시간 복잡도

select * from (select * from table where processed = 'N' 
order by myDate) 
where rownum = 1; 

는이 쿼리 O의 것으로 만들 것 인덱스 (들)을 생성하는 것이 가능합니다 (1) 오라클의 시간 복잡도 : 처리되지에서 단지 첫 번째 행을 선택 최소 날짜가있는 행 (예 : processed 열이 두 부분으로 나뉘는 btree 색인과 같은 값은 'Y'또는 'N'값만 가질 수 있습니다).

답변

2

예 (myDate가 처리됨)에 대한 색인을 사용하면 한 행을 직접 검색 할 수 있습니다. O (1) (btree는 제공하지 않음)이지만 전체 테이블 스캔의 O (n)보다 훨씬 낫습니다.

해당 색인의 열 순서가 중요합니다. 일반적으로 myDate에서 먼저 주문하고 그 스위치로 그 플래그를 지정합니다 (아래 참조).

수천 개의 항목이 모두 processed=Y 인 경우 myDate에서 주문한 색인 스캔에서는 여전히 색인에있는 모든 항목을 건너 뛸 때까지 약간의 시간이 소요됩니다. 이것이 모두 항목에 적용되는 경우 최악의 경우는 여전히 O (n)입니다 (그러면 전체 색인 스캔이됩니다).

이것이 문제가되는 경우 색인 열 순서를 (processed, myDate)로 전환 할 수 있습니다. 그런 다음 Y에 대해 하나, N에 대해 하나씩 두 개의 B- 트리 색인을 효과적으로 가질 수 있습니다.