source

여러 열이 있는 인덱스 - 하나의 열에 대해서만 쿼리를 수행할 때 확인하시겠습니까?

manysource 2023. 7. 29. 08:37

여러 열이 있는 인덱스 - 하나의 열에 대해서만 쿼리를 수행할 때 확인하시겠습니까?

자리가 있으면요

create table sv ( id integer, data text )

인덱스:

create index myindex_idx on sv (id,text)

만약 내가 질문을 했다면 이것은 여전히 유용할까요?

select * from sv where id = 10

제가 질문하는 이유는 인덱스가 없는 테이블 집합을 살펴보고 선택한 쿼리의 다른 조합을 보고 있기 때문입니다.일부 열은 하나 이상의 열만 사용합니다.두 세트 모두 인덱스가 필요합니까? 아니면 모두 포함 인덱스가 괜찮습니까?전체 테이블 검색보다 빠른 검색을 위해 색인을 추가합니다.

예(Matt Hugins의 답변을 기반으로 함):

select * from table where col1 = 10
select * from table where col1 = 10 and col2=12
select * from table where col1 = 10 and col2=12 and col3 = 16

모든 것이 인덱스 테이블(co1l1,col2,col3)에 의해 커버될 수 있지만,

select * from table where col2=12

다른 색인이 필요합니까?

(id, text)의 인덱스는 먼저 id로 인덱스한 다음 텍스트로 인덱스하므로 유용합니다.

  • ID로 쿼리할 경우 이 인덱스가 사용됩니다.
  • ID 및 텍스트로 쿼리할 경우 이 인덱스가 사용됩니다.
  • 텍스트로 쿼리할 경우 이 인덱스는 사용되지 않습니다.

편집: 제가 "유용하다"고 말할 때, 쿼리 속도/최적화 측면에서 유용합니다.Sunne Rievers가 지적했듯이 ID만 제공되는 고유 레코드를 의미하지는 않습니다(테이블 정의에서 ID를 고유 레코드로 지정하지 않는 한).

Oracle은 인덱스를 사용하는 다양한 방법을 지원하므로 먼저 모든 인덱스를 이해해야 하므로 여기에서 간단히 읽어 보십시오. http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/optimops.htm#sthref973

의 질문은 다음과 .select * from table where col2=12선행 열의 카디널리티가 매우 낮은 경우 인덱스 건너뛰기 검색을 유용하게 활용할 수 있으며 그렇지 않은 경우 빠른 전체 인덱스 검색을 활용할 수 있습니다.이는 보고서를 실행하는 경우에는 문제가 없지만 OLTP 쿼리의 경우 col2를 선두 열로 하는 인덱스를 만드는 것이 좋습니다.

생각엔 마아id기본 키입니다.기본 키는 항상 고유하므로 인덱스에 추가할 필요가 없습니다.다른 것에 독특한 것을 추가하는 것도 독특할 것입니다.

text만약 당신이 정말 필요하다면, 그렇지 않다면 그냥 사용하세요.id테이블의 고유성입니다.

한다면id기본 키가 아닌 경우 쿼리에서 고유한 결과를 얻을 수 없습니다.

룩이실행마예대해에지막업에 대한 예에 합니다.col2다른 색인이 필요할 것 같습니다.인덱스가 성능 문제를 해결하는 유일한 솔루션은 아닙니다. 데이터베이스 설계나 쿼리를 저장 프로시저로 다시 작성하는 등 최적화해야 하는 경우도 있습니다(Oracle에 있는지는 잘 모르겠지만 Oracle과 동등한 솔루션이 있을 것으로 확신합니다).

여러 개의 열이 있는 테이블이 있고 이러한 열의 조합이 쿼리에 사용될 수 있다는 것이 질문의 원동력인 경우 비트맵 인덱스를 확인해야 합니다.

예를 들어 보겠습니다.

select * from mytable where col1 = 10 and col2=12 and col3 = 16

3개의 비트맵 인덱스를 만들 수 있습니다.

create bitmap index ix_mytable_col1 on mytable(col1);
create bitmap index ix_mytable_col2 on mytable(col2);
create bitmap index ix_mytable_col3 on mytable(col3);

이러한 비트맵 인덱스는 필요에 따라 결합할 수 있다는 큰 이점이 있습니다.

따라서 다음 각 쿼리는 하나 이상의 인덱스를 사용합니다.

select * from mytable where col1 = 10;

select * from mytable where col2 = 10 and col3 = 16;

select * from mytable where col3 = 16;

따라서 비트맵 인덱스가 옵션이 될 수 있습니다.그러나 David Aldridge가 지적했듯이 특정 데이터 세트에 따라 (col1,col2,col3) 단일 인덱스가 선호될 수 있습니다.언제나 그렇듯이, 그것은 달랐습니다.데이터를 살펴보고 해당 데이터에 대해 가능한 쿼리를 실행하여 통계가 최신인지 확인합니다.

이게 도움이 되길 바랍니다.

언급URL : https://stackoverflow.com/questions/1865423/index-with-multiple-columns-ok-when-doing-query-on-only-one-column