2013-08-22 2 views
1

레코드가 있고 데이터가 기록 될 때 하나의 열에 값이 저장됩니다. 레코드의 대부분은 여전히 ​​열려 있으므로 end_date 열에는 값이 저장되지 않습니다.오라클 : 날짜가 같지 않은 경우 날짜가 더 작습니다.

아직 활성 상태 인 모든 레코드를 선택하고 싶습니다. (내 머리의 상단에서) 이것을 달성하는 한 가지 방법 :

select * 
from table t 
where nvl(t.end_date, to_date('2099-DEC-31', 'MM-DD-yyyy')) > sysdate 

하지만 잘 생각하지 않습니다. 내가 원하는 것을 성취 할 수있는 더 좋은 방법이 있습니까?

편집 : BTW, 테이블은 거대하지 않고, 성장 :

+0

처럼 조회 할 수 ... 또한, 당신은 심지어 더 빠른 만들기 위해'NVL()'식으로 기능 인덱스를 만들 수 있습니다. (최적화가 필요한 경우에만) – ppeterka

+1

'MM-DD-yyyy'가 적합하지 않습니다. 'yyyy-mon-dd'여야합니다. :) –

+0

@Florin Ghita - * 내 머리 꼭대기. – hogni89

답변

2
select * 
    from table t 
where nvl(t.end_date, to_date('2099-DEC-31', 'MM-DD-yyyy')) > sysdate 

가 "정상"이 아닌 함수 기반 인덱스를 사용하지 않을 것입니다, 그래서 성능에 손상을 줄 수 있습니다 .

대신

select * 
    from table t 
where t.end_date > sysdate OR t.end_date is null 

이 일반적으로 사용된다

+2

두 번째 경우에는 시간이 지나면 NULL 값을 포함하지 않는 인덱스로 인해 여전히 고통을 겪을 수 있습니다. 거기에 더 많은 닫힌 된 값이있을 것입니다, 전체 테이블 스캔 costlier ... (하지만 다시 이것을 읽고, 이것은 조기 최적화로 계산할 수 있습니다) – ppeterka

+0

감사합니다 .. 'OR'가능성에 대해 잊어 버린 .. : O) – hogni89

+0

당신은 절대적으로 맞습니다 @ppeterka .. 나는 단지 몇 가지 최적화가시기 상조라고 생각합니다. 이 열이 인덱스에 사용 된 유일한 열이면 테이블 스캔이 발생할 가능성이 높습니다. 나 자신의 경험에 편향 되었기 때문에 대부분의 시간에 필터링 할 때 다른 제약 조건도 색인의 일부이므로 일부 null 값은 색인 사용에 영향을 미치지 않습니다. 그것을 분명히하는 힌트에 감사드립니다! – Linky