복붙노트

[SQL] 인덱스의 열 순서는 얼마나 중요합니까?

SQL

인덱스의 열 순서는 얼마나 중요합니까?

나는 당신이 인덱스 선언의 시작 부분에 가장 선택이 될 것입니다 열을 넣어해야한다고 들었습니다. 예:

CREATE NONCLUSTERED INDEX MyINDX on Table1
(
   MostSelective,
   SecondMost,
   Least
)

우선, 내가 올바른 말인지 무엇인가? 그렇다면, 나는 아마 내 인덱스의 열 순서를 재 배열하여 성능에서 큰 차이를 볼 수 있거나 연습을 "할 좋은"더입니다 무엇입니까?

DTA를 통해 쿼리를 가하고 후 난 그냥 다른 순서로, 기존 인덱스 거의 모든 IT의 같은 열이 있었다 인덱스를 작성하는 것이 좋습니다 때문에 부탁 해요 이유입니다. 난 그냥 기존 인덱스에 누락 된 열을 추가하고 좋은를 호출 고려하고 있었다. 생각?

해결법

  1. ==============================

    1.이 같은 인덱스 봐 :

    이 같은 인덱스 봐 :

    Cols
      1   2   3
    -------------
    |   | 1 |   |
    | A |---|   |
    |   | 2 |   |
    |---|---|   |
    |   |   |   |
    |   | 1 | 9 |
    | B |   |   |
    |   |---|   |
    |   | 2 |   |
    |   |---|   |
    |   | 3 |   |
    |---|---|   |
    

    첫 번째 열은 첫 번째 열을 제한하는 것보다 더 많은 결과를 제거로 먼저에 제한하는 방법을 참조하십시오 인덱스는 다음 1 열, 2 열, 등을 가로 질러 통과해야하는 방법을 사진 경우는 쉽게 ... 당신이 주먹 패스에 대부분의 결과를 전지하는 제 2 단계를 만드는 것을 볼 훨씬 더 빨리 그.

    당신이 열 3에 조회하는 경우는 결과 세트를 좁히는에 전혀 도움이되지 때문에 또 다른 경우, 옵티마이 저는 심지어 인덱스를 사용하지 않을 것입니다. 언제 다음 단계 수단 전에 더 나은 성능과 처리 결과의 수를 축소, 쿼리에있어.

    인덱스가이 방법으로 저장되어 있기 때문에, 당신이 그것에 쿼리 할 때 첫 번째 열을 찾기 위해 인덱스를 통해 더 되돌아가 없습니다.

    한마디로 : 아니, 그것은 쇼 아니라 실제 성능 이점이있다.

  2. ==============================

    2.열 순서는 중요합니다. 이제 올바른 어떤 순서 당신이 그것을 조회하려는 방법에 따라 달라집니다. 인덱스는 정확한 받거나 범위 스캔을 수행하는 데 사용할 수 있습니다. 인덱스의 모든 컬럼에 대한 값을 지정하면 정확한 추구이고 쿼리는 행에 관심이 정확히에 토지.의 경우는 컬럼의 순서는 무관하다하고자한다. 일부 열 지정할 때 스캔 범위이며,이 경우의 순서는 중요지면. SQL Server는 왼쪽 열에는 그 다음 왼쪽 열이 지정된 경우에만, 등등에 지정하고 경우에만 범위 스캔에 대한 인덱스를 사용할 수 있습니다. 하면 (A, B, C)의 인덱스를 가지고있는 경우는 스캔 A = @ A, 용 A = @ A 및 B = @ B 아니라 대 B = @ B에 대해 C = C @ norB를 범위로 사용될 수있다 = @ B 및 C = C @. 케이스 혼합 부분 인덱스를 사용 @는 A에서와 같은 하나 =하지만 C가 = @는 AND C가 = @ C = C @없는 (A = @ A에 대한 모든 B 값을 스캔 쿼리 윌 생략) C = C @의 '이동'. 다른 데이터베이스 시스템은 외부 열이 지정되지 않은 경우 인덱스에 내부 열 중 일부를 활용할 수있는 소위 '건너 스캔'연산자가 있습니다.

    열 순서는 중요합니다. 이제 올바른 어떤 순서 당신이 그것을 조회하려는 방법에 따라 달라집니다. 인덱스는 정확한 받거나 범위 스캔을 수행하는 데 사용할 수 있습니다. 인덱스의 모든 컬럼에 대한 값을 지정하면 정확한 추구이고 쿼리는 행에 관심이 정확히에 토지.의 경우는 컬럼의 순서는 무관하다하고자한다. 일부 열 지정할 때 스캔 범위이며,이 경우의 순서는 중요지면. SQL Server는 왼쪽 열에는 그 다음 왼쪽 열이 지정된 경우에만, 등등에 지정하고 경우에만 범위 스캔에 대한 인덱스를 사용할 수 있습니다. 하면 (A, B, C)의 인덱스를 가지고있는 경우는 스캔 A = @ A, 용 A = @ A 및 B = @ B 아니라 대 B = @ B에 대해 C = C @ norB를 범위로 사용될 수있다 = @ B 및 C = C @. 케이스 혼합 부분 인덱스를 사용 @는 A에서와 같은 하나 =하지만 C가 = @는 AND C가 = @ C = C @없는 (A = @ A에 대한 모든 B 값을 스캔 쿼리 윌 생략) C = C @의 '이동'. 다른 데이터베이스 시스템은 외부 열이 지정되지 않은 경우 인덱스에 내부 열 중 일부를 활용할 수있는 소위 '건너 스캔'연산자가 있습니다.

    손에 그 지식을 다시 인덱스 정의를 볼 수 있습니다. (MostSelective, SecondMost 적어도)에 대한 인덱스는 MostSelective 열이 지정된 경우에만 유효하다. 그러나 가장 선택되는 것으로, 내부 기둥의 관련성 신속하게 저하됩니다. 매우 자주 포함 더 나은 인덱스 (MostSelective)에 있는지 확인할 수 있습니다 (SecondMost, 최소) 또는 (MostSelective, SecondMost)에 포함 (최소). 내부 열이 덜 관련이 있기 때문에, 인덱스에 그러한 권리 위치에 낮은 선택도 열을 배치하는 것은 그들에게 아무것도하지 않습니다하지만가, 중간 페이지로 그들을 밖으로 이동 만 리프 페이지에 그들을 유지하는 의미가 있으므로 소음 A에 대한 추구 쿼리 coverability 목적. 즉, 포함하는 이동합니다. 이는 최소 열 증가의 크기보다 중요합니다. 아이디어는이 인덱스는 MostSelective을 지정 쿼리를 혜택을 누릴 수 있다는 것입니다 중 하나 정확한 값이나 범위, 그리고 이미 크게 후보 행을 제한하는 가장 선택적 인 그 열로.

    반면에 인덱스 (최소, SecondMost, MostSelective는) 그것을 실제로는 매우 강력한 인덱스 실수를 보일 수 있지만. 그것의 바깥 쪽 쿼리로 최소 열이 있기 때문에, 낮은 선택도 열에 집계 결과가 쿼리에 사용할 수 있습니다. 이러한 쿼리는 OLAP에서 널리 및 분석 데이터웨어 하우스, 그리고 이러한 인덱스가 아주 좋은 경우에 그들을 위해가는이 곳은 정확히이다. 이러한 인덱스는 실제로는 (일반적으로 범주 또는 유형의 어떤 종류를 나타냅니다 같은 최소 값)하고 분석 쿼리를 촉진 관련 행의 큰 덩어리의 물리적 레이아웃을 구성 정확히 때문에, 우수한 클러스터 된 인덱스를 확인합니다.

    그래서, 불행하게도, 어떤 '올바른'순서가 없다. 당신은 어떤 쿠키 커터 조리법에 따라 대신 당신이 그 테이블에 대해 사용 권리 인 인덱스 컬럼 순서를 결정하려고하는 쿼리 패턴을 분석하지 않아야합니다.

  3. ==============================

    3.로 레무스는 작업 부하에 따라 달라 말한다.

    로 레무스는 작업 부하에 따라 달라 말한다.

    그래도 난 허용 대답의 잘못된 측면을 해결하고자합니다.

    인덱스의 모든 컬럼에 대한 평등 검색을 수행하는 쿼리의 경우 큰 차이가 없다.

    아래는 두 테이블을 생성하고 동일한 데이터로 채워. 유일한 차이점은 하나의 키는 상기 선택적 및 다른 역방향으로 정렬 된 가장한다는 것이다.

    CREATE TABLE Table1(MostSelective char(800), SecondMost TINYINT, Least  CHAR(1), Filler CHAR(4000) null);
    CREATE TABLE Table2(MostSelective char(800), SecondMost TINYINT, Least  CHAR(1), Filler CHAR(4000) null);
    
    CREATE NONCLUSTERED INDEX MyINDX on Table1(MostSelective,SecondMost,Least);
    CREATE NONCLUSTERED INDEX MyINDX2 on Table2(Least,SecondMost,MostSelective);
    
    INSERT INTO Table1 (MostSelective, SecondMost, Least)
    output inserted.* into Table2
    SELECT TOP 26 REPLICATE(CHAR(number + 65),800), number/5, '~'
    FROM master..spt_values
    WHERE type = 'P' AND number >= 0
    ORDER BY number;
    

    이제 테이블 모두에 대해 쿼리를하고 ...

    SELECT *
    FROM   Table1
    WHERE  MostSelective = REPLICATE('P', 800)
           AND SecondMost = 3
           AND Least = '~';
    
    SELECT *
    FROM   Table2
    WHERE  MostSelective = REPLICATE('P', 800)
           AND SecondMost = 3
           AND Least = '~'; 
    

    ... 둘 다 인덱스 벌금을 사용하고 모두 동일한 비용을 제공하고 있습니다.

    허용 대답에 ASCII 아트는 인덱스를 구성하는 방법 사실이 아니다. 표 1의 인덱스 페이지는 (전체 크기에서 열 이미지를 클릭) 아래에 표시됩니다.

    인덱스 페이지 (실제로 인덱스가 고유로 선언되지하지만 그것에 대해 무시 될 수있는 상기 정보는 여기에서 확인할 수있는 바와 같이 행 식별자 첨부 추가 키 열이이 경우에) 모든 키를 포함하는 행을 포함한다.

    SQL 서버 위의 쿼리의 컬럼의 선택에 대해 상관하지 않는다. 그것은> = (JJJ ..., 1, ~)와 키 (PPP ..., 3, ~) 인 것을 진 루트 페이지의 검색 및 발견하여 작업을 수행 <(SSS ..., 3, ~) 그래서 118는 페이지 1을 판독한다. 그런 다음 해당 페이지의 키 입력의 이진 검색을 수행하고 아래로 여행 할 수있는 리프 페이지를 찾습니다.

    이진 검색 키 비교의 예상 번호 또는 필요 인덱스가 추구해야 할 탐색 할 수있는 것을 페이지의 수 중 하나에 영향을주지 않습니다 선택의 순서로 인덱스를 변경하면. 기껏는 소폭 키 비교 자체를 속도를 수 있습니다.

    때로는하지만 워크로드에서 다른 쿼리에 대한 이해가됩니다 먼저 가장 선택적 인덱스를 주문.

    예컨대 워크로드는 모두 다음과 같은 형태의 쿼리를 포함하는 경우.

    SELECT * ... WHERE  MostSelective = 'P'
    
    SELECT * ...WHERE Least = '~'
    

    위의 인덱스는 그 중 하나에 대한 커버되지 않습니다. MostSelective은 추구와 함께 계획을 만들기 위해 선택적 충분하고 보람 조회 만 최소에 대한 쿼리가 없습니다.

    인덱스가 도움이 될 수있는 쿼리의 하나의 가능한 클래스는 그러나이 시나리오 (비 포함 인덱스 선도 열 복합 인덱스 (들)의 부분 집합에 추구)입니다. 당신이 실제로 그 자체 MostSelective으로 검색하거나 MostSelective, SecondMost의 조합과 항상 모든 세 개의 열을 조합하여 검색 않을 경우,이 이론적 인 장점은 당신에게 쓸모가 없다.

    반대로 같은 쿼리

    SELECT MostSelective,
           SecondMost,
           Least
    FROM   Table2
    WHERE  Least = '~'
    ORDER  BY SecondMost,
              MostSelective 
    

    일반적으로 규정 한 순서의 역순을함으로써 도움이 될 것입니다 - 그것은 쿼리를 커버 등의 부팅에 원하는 순서 추구하고 반환 행을 지원할 수 있습니다.

    이 조언의 자주 반복되는 부분이다 그러나 대부분에서 그것은 다른 쿼리에 대한 잠재적 혜택에 대한 경험적 그래서 - 그리고 실제로 작업 부하보고를 대신 할 수 없습니다.

  4. ==============================

    4.옳은. 여러 열로 구성된 - - 인덱스는 복합 될 수 있으며, 순서 때문에 왼쪽 원리 중요하다. 이유는 데이터베이스 검사 목록 것은 왼쪽으로부터,이며, 정의 된 순서와 일치하는 대응 열 기준을 찾아야한다. 예를 들어, 열 주소 테이블에 인덱스를 갖는

    옳은. 여러 열로 구성된 - - 인덱스는 복합 될 수 있으며, 순서 때문에 왼쪽 원리 중요하다. 이유는 데이터베이스 검사 목록 것은 왼쪽으로부터,이며, 정의 된 순서와 일치하는 대응 열 기준을 찾아야한다. 예를 들어, 열 주소 테이블에 인덱스를 갖는

    주소 열을 사용하는 모든 쿼리는 인덱스를 활용할 수 있지만, 쿼리가 어느 도시 및 / 또는 상태 참조가있는 경우 - 인덱스를 사용할 수 없습니다. 가장 왼쪽 열이 참조되지 않기 때문입니다. 개별 인덱스, 또는 다른 순서로 여러 복합 - 쿼리 성능이 최적 인 당신에게 말할 것이다. 좋은 읽기 : 킴벌리 트립에 의해 티핑 포인트,

  5. ==============================

    5.다른 모든 답변은 잘못이다.

    다른 모든 답변은 잘못이다.

    순서를 따기 때 지수의 개별 컬럼의 선택도 중요하지 않습니다.

    여기에 간단한 생각 프로세스는 다음과 같습니다 효과적으로, 인덱스가 포함 된 컬럼의 연결입니다.

    그 이론적 근거를 제공하는 유일한 차이는 이전 나중에 문자열에 비해 다른 두 개의 '문자열을'비교하는 것입니다. 이 총 비용의 작은 부분이다. 하나 대답에 언급에는 "첫 번째 패스 / 두 번째 패스"는 없습니다.

    그래서, 어떤 순서로 사용해야한다?

    예를 들어, 매우 낮은 선택도 열이 먼저 와야합니다 :

    WHERE deleted = 0  AND  the_datetime > NOW() - INTERVAL 7 DAY
    INDEX(deleted, the_datetime)
    

    인덱스 순서를 바꾸면가 완전히 삭제을 무시 것이다.

    (열을 주문에 대한 더 많은 규칙이 있습니다.)

  6. from https://stackoverflow.com/questions/2292662/how-important-is-the-order-of-columns-in-indexes by cc-by-sa and MIT license