source

SQL/Oracle: 여러 열의 인덱스를 사용할 수 있는 경우

manysource 2023. 7. 19. 21:26

SQL/Oracle: 여러 열의 인덱스를 사용할 수 있는 경우

만약 제가 (A, B, C) 열에 색인을 만든다면, 그 순서대로 (A, B) 또는 (A, B, C) 또는 (B, C) 열에만 색인을 작성해도 데이터베이스는 사용할 수 있을 것입니다.이거 맞는건가요?

실제로 Oracle은 인덱스의 비선행 열에 술어를 배치할 때 세 가지 인덱스 기반 액세스 방법을 사용할 수 있습니다.

색인 건너뛰기 검색: http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/optimops.htm#PFGRF10105

ii) 빠른 전체 인덱스 스캔: http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/optimops.htm#i52044

iii) 인덱스 전체 검색: http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/optimops.htm#i82107

저는 "야생에서" 빠른 전체 인덱스 검색을 가장 자주 보았지만, 모든 것이 가능합니다.

그것은 정확하지 않습니다.항상 데이터를 대표하는 테스트 사례를 작성하여 직접 확인하는 것이 좋습니다.Oracle SQL Optimizer Google Jonathan Lewis를 정말 이해하고 싶다면, 그의 책을 읽고, 그의 블로그를 읽고, 그의 웹사이트를 확인하세요. 그는 놀랍고, 항상 테스트 사례를 생성합니다.

create table mytab nologging as (
select mod(rownum, 3) x, rownum  y, mod(rownum, 3) z from all_objects, (select 'x' from user_tables where rownum < 4)
);

create index i on mytab (x, y, z);

exec dbms_stats.gather_table_stats(ownname=>'DBADMIN',tabname=>'MYTAB', cascade=>true);

set autot trace exp

select * from mytab where y=5000;

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=10)
   1    0   INDEX (SKIP SCAN) OF 'I' (INDEX) (Cost=1 Card=1 Bytes=10)

Oracle 8 버전까지는 SQL에 첫 번째 열이 포함되지 않는 한 인덱스가 사용되지 않습니다.

Oracle 9i에는 접두사 열을 사용할 수 없는 경우에도 Oracle CBO가 인덱스 사용을 시도할 수 있는 검색 인덱스 액세스 건너뛰기 기능이 도입되었습니다.

스킵 스캔 작동 방식에 대한 좋은 개요: http://www.quest-pipelines.com/newsletter-v5/1004_C.htm

언급URL : https://stackoverflow.com/questions/57878/sql-oracle-when-indexes-on-multiple-columns-can-be-used