2010-04-26 5 views
3

SQL 쿼리를 수행하고 있으며 실행하는 데 너무 오래 걸리므로 최적화하려고합니다.oracle select query - 여러 열에 대한 인덱스

사이에 몇 가지 선택 및 UNION이 있습니다. 모든 선택 항목은 동일한 테이블에 있지만 WHERE 절의 조건이 다릅니다. 는 기본적으로 나는에 allways 같은 있습니다

select * from A 
where field1 <=TO_DATE ('01/01/2010', 'DD/MM/YYYY') 
AND field1 >= TO_DATE(some date) 
and field2 IN (...) 

UNION 
select * from A 
where field1 <=TO_DATE ('01/01/2010', 'DD/MM/YYYY') 
AND field1 >= TO_DATE(some date2) 
and field2 =(...) 

UNION 
.... 

내가 필드 1에 인덱스가 (이 날짜 필드를, 그리고 FIELD2는 숫자입니다). 지금, 나는 선택을하고 난 단지

WHERE field1 <TO_DATE ('01/01/2010', 'DD/MM/YYYY') 

넣어 경우는 인덱스를 사용하지 않을 때. 나는 일반 설명보기 위해 두꺼비를 사용하고 있는데 말했다 :

SELECT STAITEMENT Optimiser Mode = CHOOSE 
TABLE ACCESS FULL 

그것은 거대한 테이블이며,이 컬럼에 인덱스가 있습니다.

이 최적화 도구에 대한 의견이 있으십니까? 왜 인덱스를 사용하지 않습니까?

또 다른 질문은 field1과 field2에 where 절이 있으면 각 필드에 하나의 인덱스 또는 하나의 인덱스 만 만들어야한다는 것입니다.

답변

0

두 열 모두에 하나의 색인을 만들 수 있습니다. 그러나 귀하의 질문은 위의 문자열처럼 field1을 취급하고 아래 날짜를 좋아합니다. 그게 의도적 인거야? 또한 옵티마이 저는 생각하는 바를 기반으로 선택합니다. 그래서 당신의 통계는 최신입니까? 그렇지 않다면 FTS가 원하는 기록을 찾는 가장 좋은 방법이라고 생각할 수 있습니다.

+0

실제로 하나의 날짜 필드와 숫자 필드가 있습니다. –

-1

저는 오라클 전문가 중 가장 큰 전문가는 아니지만 '>'또는 '<'연산자를 사용할 때 인덱스를 활용할 수 없다고 생각합니다. 인덱싱은 값 범위가 아닌 특정 값을 빠르게 찾을 수있는 방법을 제공합니다. 따라서 특정 값보다 작은 값을 찾을 때 인덱스는 아무 것도하지 않습니다.

+0

인덱스의 범위 스캔이 전체 테이블 스캔보다 여전히 빠르다는 것을 확신합니다. 색인은 더 작습니다. – MJB

+0

이것은 잘못된 것입니다. – Quassnoi

+0

Oracle은 범위의 범위 스캔을 수행 할 수 있습니까? 내가 말했듯이, 나는 나 자신 오라클 사람이 아니야. 나는 주로 Teradata를 사용합니다. – brydgesk

0

이 최적화 도구에 대한 의견이 있으십니까? 왜 인덱스를 사용하지 않습니까?

대부분의 아마이 상태

field1 < '12/12/2010' 

이 반환하는 모든 또는 거의 모든 행하기 때문이다.

이 경우 FULL TABLE SCAN이 좋습니다.

field1과 field2에 where 절이 있으면 각 필드에 대해 하나의 인덱스 또는 하나의 인덱스 만 만들어야한다는 또 다른 질문이 있습니까? 이 쿼리

:

CREATE INDEX ix_a_2_1 ON A (field2, field1) 

이 연속 범위 및 사용의 번호로 쿼리를 분할하는 INLIST ITERATOR를 사용합니다 :

select * from A 
where field1 <"toto" 
and field2 IN (...) 

, 당신은 종합 지수를 작성해야 INDEX RANGE SCAN 각 범위에서 값을 반환합니다.

+0

아인 모든 쿼리 나는 DATHIS이 <= TO_DATE ('30// 2010 03 ','DD/MM은/YYYY ') 및 DATHIS> ='다른 일 ' 모든 쿼리의 날짜 변경의 두 번째 조건 . –

0
  • 는 필드 1에 대한 날짜와 상대하고 있기 때문에, 당신은 TO_DATE을 사용하고 싶습니다. 예 : WHERE field1 < TO_DATE('2010/12/12 12:00:00', 'yyyy/mm/dd hh24:mi:ss').

  • 필드에 어떤 유형의 색인이 있습니까? 나는 b-tree 인덱스를 가정하고 있는데, less-than 연산자는 괜찮지 만 옵티마이 저는 현재 테이블 통계에 따라 사용하지 않기로 결정할 수 있습니다. 색인을 강제 사용하려면 힌트로 색인을 지정하고 성능에 미치는 영향을 확인하십시오.

    SELECT /*+ index(tbl.INDEX_NAME) */
    tbl.*
    FROM A tbl WHERE field1 < TO_DATE('2010/12/12 12:00:00','yyyy/mm/dd hh24:mi:ss');
    당신의 마지막 질문에 대해서는

  • , 당신은 개별적으로 각각의 컬럼에 인덱스를 생성 할 수 있습니다, 또는 종합 지수는 모두 열을 사용. 두 열의 값을 기준으로 항상 선택하려면 해당 열의 두 가지 모두에 대한 복합 인덱스가 더 좋을 것입니다.

1

유니언이 없으면 더 좋지 않겠습니까? 아니면 다른 절 사이의 OR을 사용 하시겠습니까?

select * from A 
where (
    field1 <"toto" 
    and field2 IN (...) 
) 
OR 
(
    field1 >"toto2" 
    and field2 IN (...) 
) 
OR 
.... 

2 열의 색인을 가질 수도 있습니다.

CREATE INDEX index_name 
ON A (field1, field2); 
+0

잘 모르겠습니다. 나는 그것을 시도하지 않았다. 더 빠를거야? –

+0

솔직히 잘 모르겠습니다. 오라클이이를 최적화 할 수 있습니다. –