2013-10-15 6 views
1

프로덕션 환경에 Oracle 11G R2가 있습니다.날짜 필드를 사용하여 쿼리 실행 성능 향상

나는 열이 DATE 1 개 쿼리

select .... 
    from FORMX 
where (INF_TYP =?) 
    AND (STATUS IN (?, ?, ?, ?, ?, ?)) 
    AND ((VAL_DAT>=? OR VAL_DAT IS NULL)); 

유형 VAL_DAT의의 성능을 향상시키는 것을 좋아합니다. VAL_DAT에 색인을 추가해도 눈에 띄는 효과가 없습니다.

어떻게 조정할 수 있으며 검색어를 변경하는 방법에 대한 아이디어가 있으십니까?

편집

우리는 완전히 그 테이블에 대한 150K 기록이 조건 (생산 1 년) VAL_DAT is null 레코드의 약 8 %에 해당됩니다.

'INF_TYP'및 'STATUS'의 유형은 VARCHAR2 (2 CHAR) 및 VARCHAR2 (10 CHAR)입니다.

+0

정보가 충분하지 않습니다. 테이블의 크기 (행 수, 평균 행 공간)는 얼마나됩니까? 각 필터가 반환해야하는 행의 비율은 얼마입니까? VAL_DAT = null 인 행의 수는 얼마입니까? 인덱스의'clustering_factor'는 무엇입니까? –

+0

@ Vincent가 말한 것과 + 조건 1과 2는 무엇입니까? 이미 다른 어떤 인덱스가 테이블에 있습니까? – StevieG

+0

질문을 업데이트했습니다. @ Vincent Malgrat 나는이 순간에 clustering_factor의 가치를 알지 못한다. 왜냐하면 나는 지금 색인이 없다. –

답변

5

당신은 다음과 같이 인덱스를 추가하는 시도 할 수 : 0 null는

create index ... 
on   formx (val_dat, 0) 

때문에, val_dat 심지어 null 항목을 인덱싱 할 것입니다.

inf_typ이 일반적으로 val_dat과 함께 조건으로 사용되는 경우 inf_typ로 이어지는 합성 색인이 좋은 선택입니다. val_dat의 술어가 범위이기 때문에 inf_type을 지정해야합니다.

create index ... 
on   formx (inf_typ, val_dat) 
+1

+1 멋지게 완료되었습니다. 이걸 몰랐어. 그래도 이해하기 힘들다;) –

+2

'(inf_typ, val_dat)'에 대한 색인은 같은 효과가 있겠는가? –

+2

inf_typ이 null이 아니도록 제한되면 확실히 가능합니다. –