문제

a, a, b, c, d의 인덱스가 있습니다.

where 절에서 a, b, c로 t에서 가져 오는 쿼리가 있습니다.

인덱스를 사용하거나 A, B, C 만 포함하는 별도의 인덱스가 필요합니까?

도움이 되었습니까?

해결책

David B는 실행 계획을 확인하여 색인이 사용되고 있는지 확인해야합니다.

인덱스를 사용하거나 A, B, C 만 포함하는 별도의 인덱스가 필요합니까?

이 질문의 마지막 부분에 답하기 위해 (즉각적인 해결책과는 반대로) 핵심 기본 주제라고 생각하는 것은 다음과 같습니다. 거의 인덱스 된 열의 하위 집합을 색인 해야하는 이유는 없습니다. 인덱스가 (a, b, c, d) 인 경우 A (A, B, C)에 대한 A는 인덱스가 발생할 가능성이 높습니다. 찾다. 목표물 탐색, 이는 이상적인 상황입니다. 인덱스에는 엔진이 결과 세트로 직접 이동하는 데 필요한 모든 정보가 포함되어 있습니다. 나는 이것이 '%'와 같은 숫자 유형과 문자열 유형의 평등 테스트에 적합하다고 생각합니다. 반면에, 당신이 참조 된 D 만있는 경우, 당신은 아마도 인덱스로 끝날 것입니다. 주사, 이는 SQL 엔진이 A, B 및 C의 모든 조합을 통해 스캔해야한다는 것을 의미합니다. 그런 다음 결과 세트에 행을 추가할지 여부를 결정하기 전에 D가 기준을 충족하는지 확인해야합니다. 특히 큰 테이블에서 "D"열에 대해 많은 쿼리를해야한다는 것을 알았을 때 D에 대한 추가 색인을 추가하고 약 90%의 성능 향상을 보았습니다.

편집 : SQL Management Studio에서 데이터베이스 엔진 튜닝 어드바이저를 사용하는 것이 좋습니다. 실행하려는 쿼리에 대한 테이블이 이상적으로 인덱스되지 않은지 알려줍니다.

다른 팁

때에 따라 다르지!

WHERE A like '%x%'
  and B = 1
  and C = 1
//
WHERE A = 1
  OR B = 1
  OR C = 1
//
WHERE DateAdd(dd, 1, A) = '2008-01-01'
  AND B = 1
  AND C = 1

인덱스가 유용하지 않기 때문에 이들은 인덱스에 의존하지 않습니다.

잠재적 인덱스 사용을 확인하려면 "예상 실행 계획"을 클릭하십시오.

Oracle 데이터베이스에서이를 a라고합니다 복합 색인 (12G 문서이지만 이전 버전에는 유효합니다)

복합 인덱스는 WHERE 절이 복합 인덱스의 열의 모든 주요 부분을 참조하는 선택 문에 대한 데이터 검색 속도를 높일 수 있습니다. 따라서 정의에 사용 된 열의 순서가 중요합니다. 일반적으로 가장 일반적으로 액세스하는 열이 먼저됩니다.

그래서 당신의 경우, 그렇습니다. 색인이 사용될 수 있습니다. 설명 계획을 사용하여 확인할 수 있습니다.

MS SQLServer가 다릅니다.

편집하다:또한 언급해야합니다 고려하다 사용을위한 색인 .. 이것이 반드시 사용한다는 의미는 아닙니다.

edit2 :Oracle 11G와 나중에는 이제 색인에서 열을 건너 뛸 수있는 옵션이 있습니다. 따라서 A, B 및 D의 쿼리는 여전히 인덱스를 사용할 수 있습니다.

인덱스가 사용됩니다. 어떤 인덱스가보다 최적의 쿼리 계획을 생성 할지는 상당히 똑똑하며, 그에 아무런 문제가 없어야합니다.

이런 종류의 것과 마찬가지로, 내 말을 받아들이지 마십시오. 테이블을 만들고, 대표 데이터로 채우고, 쿼리하고, 색인하고, 다시 쿼리하십시오.

인덱스에 쿼리에 사용되지 않는 열이 포함되어 있다는 사실은 사용되지 않도록 방해하지 않습니다.

그것은 확실히 말하는 것이 아닙니다 ~ 할 것이다 사용되면 다른 이유로 무시 될 수 있습니다 (아마도 하나 이상의 다른 인덱스가 더 유용하기 때문에).

항상 그렇듯이 예상 실행 계획에서 Squizz를 타고 어떤 일이 일어날 지 확인하십시오.

단순한 평등 조회 (A = 1 및 B = '빨간색'및 C = 287)로 시작하십시오. 예 색인이 사용될 것입니다. 이 색인은 먼저 선택과 일치하는 행의 수를 "추측"하는 데 도움이 된 다음 두 번째로 해당 행에 액세스하는 데 도움이됩니다.

"Like"술어에 대한 David B의 의견에 따라 SQLServer는 여전히 색인을 사용할 수 있으며 선택한 내용에 따라 다릅니다. 예를 들어, 카운트 (*)를 선택하는 경우 SQLServer는 인덱스를 스캔하고 인덱스가 작기 때문에 WHERE 절과 일치하는 히트를 계산할 수 있으며 스캔하는 데 IOS가 적을 수 있습니다. 선택적 SQLServer가 인덱스를 어떻게 느끼는지에 따라 기본 테이블에서 일부 열을 선택하더라도 그렇게하기로 결정할 수 있습니다.

다음은 또 다른 "It Delects"답변입니다 ... 또한 테이블이 얼마나 큰지에 따라 다릅니다 ...

실행 계획을 확인한 다른 모든 사람들에게 동의하여 귀하의 지수가 사용되고 있는지 확인하지 않습니다.

다음은 유용한 실행 계획을 읽는 데 관한 몇 가지 기사입니다.

http://www.sqlservercentral.com/articles/administering/executionplans/1345/ http://www.codeproject.com/kb/database/sql-tuning-tutorial-1.aspx

추천하는 Skans vs. 스캔에 대한 좋은 기사도 있습니다.http://blogs.msdn.com/craigfr/archive/2006/06/26/647852.aspx

Craig Freedman의 블로그에는 좋은 기사가 있습니다. 여기에 유용한 또 다른 기사가 있습니다. 이 기사는 SQL Server가 사용할 인덱스를 결정하는 데 사용하는 몇 가지 요소에 관한 것입니다 ...

http://blogs.msdn.com/craigfr/archive/2006/07/13/664902.aspx

잘 지내세요! 제프

일반적으로 그렇습니다. 모든 최신 데이터베이스는이 작업을 수행하기에 충분히 영리합니다. 예를 들어, 표의 통계에 따라 데이터의 양이 충분히 작다는 것이 전체 테이블 읽기가 더 효율적일 정도로 인덱스가 할인되지만 규칙적으로는 이에 의존 할 수 있습니다. 적절한 경우.

결과적으로 인덱스를 설계 할 때이를 활용할 수 있습니다. 예를 들어, a, b, c가 핵심 값으로 a, b, c를 포함하는 테이블이 있다고 말하면, 내가 알고있는 데이터가 포함 된 z 및 z는 자주 진술에 의해 검색됩니다.

SELECT Y FROM table WHERE A = alpha and B = beta and C = gamma 

SELECT Z FROM table WHERE A = alpha and B = beta and C = gamma 

i는 일반적으로 x와 z가 합리적으로 작은 필드라고 가정하면 a, b, c, x, z에서 색인을 생성합니다. 그 이유는 위의 진술의 액세스 경로가 인덱스를 사용할 것이라는 것을 알고 있기 때문입니다. 검색하고 싶은 데이터가 이미 인덱스에 있습니다. 그런 다음 테이블 데이터 자체를 검색하는 데 필요한 데이터 블록에 대해 별도의 읽기가 필요하지 않습니다. 이 전략은 일부 상황에서 데이터 검색 속도를 크게 높일 수 있습니다. 물론, 업데이트 비용과 디스크 공간으로 비용을 지불하므로 적용하기 전에 데이터베이스가 수행하는 작업을 이해해야하지만 대부분의 데이터베이스에서 읽을 때와 같이 크게 숫자가 쓴 것처럼 일반적으로 고려해야 할 가치가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top