programing

null 가능한 열에 대한 인덱스

stoneblock 2023. 6. 28. 21:18

null 가능한 열에 대한 인덱스

null 가능한 열에 인덱스가 있는데 다음과 같은 모든 값을 선택하려고 합니다.

SELECT e.ename 
FROM   emp e;

설명 계획에서 나는 봅니다.FULL TABLE SCAN(힌트조차도 도움이 되지 않았습니다)

SELECT e.ename 
FROM   emp e
WHERE  e.ename = 'gdoron';

인덱스를 사용합니까...

검색해보니 인덱스에 null 항목이 없어서 첫 번째 쿼리에서는 인덱스를 사용할 수 없습니다.

제 질문은 간단합니다. 인덱스에 null 항목이 없는 이유는 무엇입니까?

기본적으로 관계형 데이터베이스는 NULL 값을 무시합니다(관계형 모델에서는 NULL이 "존재하지 않음"을 의미하므로).따라서 인덱스에는 NULL 값이 저장되지 않으므로 SQL 문에 null 조건이 있으면 관련 인덱스가 무시됩니다(기본값).

하지만 당신은 이 문제를 극복할 수 있습니다, 이것 또는 이 기사를 확인하십시오.

테이블에서 모든 행을 가져오는 경우 색인을 사용해야 하는 이유는 무엇이라고 생각하십니까?전체 테이블 스캔은 모든 값을 반환하는 가장 효율적인 방법입니다.이는 인덱스에 null이 없는 것과 관련이 없으며 최적화 도구가 데이터를 검색하는 가장 효율적인 방법을 선택하는 것과 관련이 있습니다.


@A.B.Cade: 최적화 도구가 인덱스를 사용하도록 선택할 수 있지만 가능성은 낮습니다.인덱스 테이블에 100개의 행이 있지만 값은 10개뿐인 테이블이 있다고 가정해 보겠습니다.옵티마이저가 인덱스를 사용하는 경우 인덱스에서 10개의 행을 가져온 다음 100개의 행으로 확장해야 하지만 전체 테이블 검색에서는 처음부터 100개의 행을 모두 가져옵니다.다음은 예입니다.

create table test1 (blarg varchar2(10));

create index ak_test1 on test1 (blarg);

insert into test1
select floor(level/10) from dual connect by level<=100;

exec dbms_stats.gather_table_stats('testschema','test1');

exec dbms_stats.gather_index_stats('testschema','ak_test1');

EXPLAIN PLAN FOR
select * from test1;

제 요점은 이 질문이 주로 결함이 있는 전제에 기반한다는 것입니다. 인덱스 스캔이 전체 테이블 스캔보다 본질적으로 더 낫다는 것입니다.이 시나리오가 보여주듯이 그것이 항상 사실인 것은 아닙니다.

비트맵 인덱스에는 NULL 값을 가진 행이 포함됩니다.

그러나 인덱스에 NULL 값이 있다고 해서 비트맵 인덱스를 생성해서는 안 됩니다.비트맵 인덱스는 사용 사례를 대상으로 합니다(설명서 참조).

이를 잘못 사용하면 전체 성능이 크게 저하될 수 있습니다.

첫 번째 쿼리가 인덱스 사용과 관련이 있는지는 잘 모르겠습니다. 적어도 두 번째 쿼리는 관련이 있을 수 있습니다.

Null 값을 포함하는 열은 인덱싱할 수 없지만 다음과 같은 방법이 있습니다.

create index MY_INDEX on emp(ename, 1);

, 1)요령을 터득하는 마지막에.

언급URL : https://stackoverflow.com/questions/9175591/index-for-nullable-column