2017-01-02 2 views
0

을 위해 내가 (SWcode,cdcardno)지수 절은 두 번째 열

에 인덱스를 만들 경우 2 값에 대한 검사를 생략하고 나는이 쿼리를 실행합니다

SELECT cd.* 
    FROM KS cd 
    where cd.cdcardno in ('6219862012953805') 
ORDER BY cd.ROWID 

와 오라클을 사용 인덱스 스킵 스캔을 그리고 그것은 사실입니다. 하지만이 쿼리를 실행할 때 :

SELECT cd.* 
    FROM KS cd 
    where cd.cdcardno in ('6219861009150391','6219862012953805') 
ORDER BY cd.ROWID 

oracle use Full scan. 나는 이유를 알 수 없다.

+0

인덱스에 필드가 두 개 이상 있고 oracle이 첫 번째 필드 이상을 건너 뛰고 인덱스 트리 아래쪽 필드에서 인덱스를 "스캔"하도록 선택하면 건너 뛰기 스캔이 oracle로 선택 될 수 있습니다. 히스토그램 및 데이터 분포에 대해 말하는 것은 사실이지만 WHERE 절에서 하나의 필드 만 선택하면 건너 뛰기 검색을 기대하는 것은 의미가 없습니다. – sandman

답변

0

가끔 오라클은 두 개의 exec 계획 중 하나가 불량하고 다른 하나가 더 나빠질 때 간혹 플랩합니다. 이 목록의 첫 번째 위치에있는 색인을 작성하십시오. 또는 현재 색인의 열 순서를 뒤집을 수 있습니다.

+0

하지만 왜 이런 일이 발생합니까? 예를 들어 첫 번째 열에 대해 서로 다른 4 개의 값이있는 경우 첫 번째 쿼리에서 오라클 테이블을 4 개의 하위 테이블로 나누고 두 번째 열의 인덱스를 사용하여 각 테이블을 검색합니다. 그것은 사실입니까? 그렇다면 왜 두 번째 열에 두 개의 값을 입력 할 때 오라클은 그런 일을하지 않습니까? –

+0

가능한 설명은 히스토그램입니다. 오라클은 후자의 쿼리가 더 많은 행을 리턴한다고 추정합니다. 어쨌든'SKIP SCAN '은 "최악의"가능한 인덱스 사용법 중 하나입니다. 당신의 진짜 문제는, 당신은'cdcardno'가 선두 칼럼 인 인덱스가 없다는 것입니다. – ibre5041

0

옵티마이 저는 비용을 기반으로 실행 계획을 생성합니다. 이는 차례대로 통계를 기반으로합니다. SQL 모니터 보고서와 같은 진단 데이터를 제공하지 않으면받는 답은 추측이됩니다.