2017-11-24 1 views
0

두 개의 가능한 값 (Y 및 N)이있는 열에 인덱스를 만들었습니다. 데이터 유형은 두 값 모두에 대해 동일합니다.두 가지 유형의 값만있는 열에 인덱스를 만드는 것이 얼마나 효과적입니까

열 이름이 표시기라고 가정합니다. 나는 SQL 개발자에서이 쿼리에 대한 계획을 설명 사용할 경우 내가 select 문 같은

SELECT INDICATOR 
FROM TEMP_TABLE 
ORDER BY INDICATOR 

를 썼다는 전체 테이블 인덱스 스캔을 검사하지 사용하고 있습니다.

인덱스 테이블 스캔을 사용하지 않는 이유는 무엇입니까?

+0

두 값이 있습니다. 그들은 같은 유형입니다.두 가지 유형의 값이 없습니다. – mathguy

+0

값은 동일한 데이터 유형이지만 두 개의 다른 값 Y 및 N이 있습니다. –

+0

테이블에 몇 행이 있습니까? –

답변

0

인덱스가없는 테이블에서 레코드를 찾으려면 DBMS는 일치하는 레코드를 모두 읽어야합니다. 인덱스를 사용하면 DBMS는 일치하는 레코드를 찾기 위해 일련의 레코드를 읽는 것만으로 테이블의 해당 레코드를 찾아야합니다. 따라서 DBMS에서 색인을 사용하는 추가 단계가 있습니다.

대략적인 기준으로 테이블에서 레코드의 5 % 이상을 읽는 경우 전체 테이블 검색이 인덱싱 된 검색보다 빠릅니다.

그러나 데이터 배포 또한 중요합니다. 데이터의 99 %가 'Y'인 경우를 생각해보십시오. 인덱스를 사용하여 'Y'를 사용하여 레코드를 분석하는 것은 매우 비효율적입니다 (엄지 손가락의 법칙을 적용하면 전체 테이블 스캔보다 20 배 이상 오래 걸림). OTOH는 인덱스를 사용하여 'N'으로 레코드를 찾으면 전체 테이블 스캔보다 5 배 더 효율적입니다.

오라클이 더 복잡한 인덱스 속성에 히스토그램을 사용하는 이유입니다.

오라클에는 바인드 엿보기라는 기능이 있습니다.이 기능은 배포 문제를 활용하여 검색 대상이되는 술어를 기반으로 가장 효율적인 쿼리를 선택합니다. 쿼리 패턴이 데이터 패턴과 일치 할 때 어떤 일이 발생하는지 생각해보십시오. 캐싱 된 계획은 처음 처리되는 쿼리 버전에 따라 달라집니다.

짧은 버전 : 카디널리티가 매우 낮은 (일련의) 속성에는 색인을 사용하지 마십시오.

+0

나는 동의하지 않는다. 예에서와 같이 데이터의 99 %가 'Y'라고 가정합니다. 'N'플래그가있는 행을 선택하는 쿼리 (또는 자주 실행되는 쿼리가 거의없는 경우)는 인덱스가 적합합니다. – mathguy

+0

또한 - 방금 OP가 인덱싱 된 열만 읽었 음을 알았습니다. 이 경우 데이터베이스는 인덱스 만 읽어야하며 기본 테이블에서 ANYTHING을 읽을 필요가 없습니다. 그래서 OP의 특정 질문에 적용되지 않기 때문에 내 대답을 삭제했습니다 (위의 설명에서 지적한 것 외에는 귀하의 것과 비슷했습니다). – mathguy

0

인덱스 - 적어도 Oracle에서는 다른 데이터베이스에 대해서는 알지 못합니다 - 기본 컬럼에 NULL을 저장하지 않습니다. 칼럼에서 모든 값을 읽으려고하기 때문에, 오라클은 인덱스 된 칼럼 만 읽는 경우에도 기본 테이블에서 칼럼을 읽어야합니다. 카디널리티 예측 및 기타 요인에 관계없이 인덱스를 사용해야하는 경우입니다. .

이제 열에 NULL이 없다고 말했을 것입니다. 정말로 말한 것을 의미하고 모든 행에 'Y'또는 'N'이 있으며 NULL이 없습니다.

괜찮습니다. 그러나 데이터를 검색하고 검사 한 후에 만 ​​알 수 있습니다. 오히려 인덱스가 예상대로 사용되기를 원한다면 오라클은 먼저 데이터를 보지 않고 해당 열에 NULL이 없음을 알아야합니다. 즉, 테이블에 CONSTRAINT가 필요합니다. 실제로 열은 NULL NOT 있어야 경우,

SELECT INDICATOR 
FROM TEMP_TABLE 
WHERE INDICATOR IS NOT NULL -- ADDED! 
ORDER BY INDICATOR 

인덱스를 (그것을 시도!) 사용

또는

ALTER TABLE TEMP_TABLE MODIFY (INDICATOR NOT NULL); 

, 할 수있다; 하지만 열이 NOT NULL이 아닌 경우에는 제약 조건을 명시 적으로 지정하지 않는 것이 좋습니다.

관련 문제