복붙노트

[SQL] SQL 서버 클러스터 인덱스 - 인덱스 질문의 순서

SQL

SQL 서버 클러스터 인덱스 - 인덱스 질문의 순서

그래서 같은 테이블이 있습니다 :

keyA keyB data

keyA 및 KEYB 함께, 고유 내 테이블의 기본 키이며, 클러스터 된 인덱스를 구성한다.

keyA의 가능한 값 무제한이 KEYB 5 개 사용할 수있는 값은 있지만 ,. KEYB는 일반적으로 증가합니다.

예를 들어, 다음의 데이터는 키 열이 먼저 정렬 된에 따라 2 가지 방법으로 순서화 될 수있다 :

keyA keyB data
A    1    X
B    1    X
A    3    X
B    3    X
A    5    X
B    5    X
A    7    X
B    7    X

또는

keyA keyB data
A    1    X
A    3    X
A    5    X
A    7    X
B    1    X
B    3    X
B    5    X
B    7    X

나는 키 컬럼의 처음 그 값으로 데이터를 주문 할 수 있도록 적은 수있는 값을 가지고있는 클러스터 된 인덱스를 얘기해야합니까? 아니면 먼저 주문한 성능면에서 문제가되지 않는다?

해결법

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

    1.먼저 대부분의 선택적 열을 사용하여 복합 클러스터 된 인덱스를 주문해야합니다. 이것은 총 행수에 비해 가장 고유 한 값과 열을 의미한다.

    먼저 대부분의 선택적 열을 사용하여 복합 클러스터 된 인덱스를 주문해야합니다. 이것은 총 행수에 비해 가장 고유 한 값과 열을 의미한다.

    "B * TREE 인덱스는 테이블에서 적은 비율의 행을 선택하는 쿼리의 성능을 향상시킬 수 있습니다." http://www.akadia.com/services/ora_index_selectivity.html?

    이 문서에서는 Oracle 용이지만, 여전히 관련.

    또한, 지속적으로 실행 및 반환 몇 가지 필드, 당신은 모든 필드를 포함하는 복합 인덱스를 만드는 것이 좋습니다 수있는 쿼리가있는 경우 - 그것은 기본 테이블에 액세스 할 필요가 없습니다, 대신 인덱스에서 데이터를 가져옵니다.

    복합 인덱스의 첫 번째 열을 언급해야하기에 ligget78의 의견 기억하는 것이 중요합니다.

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

    2.당신이 (keyA, KEYB)와 인덱스 (에 관계없이 클러스터 여부)를 만들 경우,이는 값이 정렬되는 방법, 예를 들어, 첫째 keyA, 다음 KEYB (이 질문에 두 번째 경우이다). 만약 당신이 다른 방법을 원한다면, 당신은 (KEYB, keyA)를 지정해야합니다.

    당신이 (keyA, KEYB)와 인덱스 (에 관계없이 클러스터 여부)를 만들 경우,이는 값이 정렬되는 방법, 예를 들어, 첫째 keyA, 다음 KEYB (이 질문에 두 번째 경우이다). 만약 당신이 다른 방법을 원한다면, 당신은 (KEYB, keyA)를 지정해야합니다.

    그것은 성능이 많다는 문제가 있었다, 물론 귀하의 요청에 따라 달라집니다. 예를 들어, 당신이있는 경우 (keyA, KEYB) 지수 (keyA을 언급하지 않고) WHERE KEYB = ... 같은 쿼리 외모는 인덱스가 활용 될 수 없습니다.

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

    3.다른 사람이 말했듯이, 순서는 인덱스 생성 스크립트 (또는 PK 제약)에이를 지정하는 방법을 기반으로합니다. 클러스터 된 인덱스에 대한 한가지하지만 명심해야 할 많이 있다는 것입니다.

    다른 사람이 말했듯이, 순서는 인덱스 생성 스크립트 (또는 PK 제약)에이를 지정하는 방법을 기반으로합니다. 클러스터 된 인덱스에 대한 한가지하지만 명심해야 할 많이 있다는 것입니다.

    당신은 PK가 아닌 다른 무언가에 클러스터 된 인덱스를 사용하여 전반적으로 더 나은 성능을 얻을 수 있습니다. 당신이 금융 시스템을 작성하는 보고서는 거의 항상 활동 (지난 1 년간 모든 활동 등)의 날짜와 시간을 기준으로하는 경우 예를 들어, 그 날짜 열에 클러스터 된 인덱스가 더 좋을 수 있습니다. HLGEM가 말했듯이, 또한 클러스터 된 인덱스의 선택에 의해 영향을받을 수 정렬.

    클러스터 된 인덱스도 이상의 다른 인덱스에 비해 삽입에 영향을 줄 수 있습니다. 당신은 삽입의 높은 부피가 클러스터 된 인덱스가 IDENTITY 열 같은에있는 경우 다음 새 모든 행 이후 디스크의 특정 부분에 대한 경합 문제가 같은 장소에 삽입되어있을 수 있습니다.

    작은 룩업 테이블의 난 항상 그냥 PK에 클러스터 된 인덱스를 넣어. 높은 충격 테이블의 경우는 최고의 하나를 선택하기 전에 (테스트) 가능한 여러 클러스터 된 인덱스에 대한 시간 생각을 보낼 수있는 좋은 아이디어 비록.

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

    4.나는 SQL 서버 주문 그것은 당신이 그것을 말해 정확히 방법을 생각합니다. 그것은 당신이 당신의 인덱스에 액세스하는 방법을 가장 잘 알고 있다고 가정합니다.

    나는 SQL 서버 주문 그것은 당신이 그것을 말해 정확히 방법을 생각합니다. 그것은 당신이 당신의 인덱스에 액세스하는 방법을 가장 잘 알고 있다고 가정합니다.

    어떤 경우에, 나는 당신이 정확히 오히려 알아낼 것입니다 데이터베이스를 희망보다는 원하는 것을 지정할 수있는 좋은 아이디어를 말할 것입니다.

    또한, 그에게 두 가지를 시도 대표 쿼리의 무리를 실행 한 다음에 가장 적합한 결정하기 위해 생성 된 실행 계획을 비교할 수 있습니다.

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

    5.클러스터 된 인덱스가 테이블을 디스크에 저장되는 실제 순서는 것을 기억하십시오.

    클러스터 된 인덱스가 테이블을 디스크에 저장되는 실제 순서는 것을 기억하십시오.

    클러스터 된 인덱스가 콜라로 정의 그래서 만약, COLB 쿼리가 빨라집니다 때 클러스터 된 인덱스와 같은 순서 순서. SQL은 주문 B에있는 경우, A는이 올바른 순서를 달성하기 위해 정렬 후 실행이 필요합니다.

    나의 제안은 B, A에서 두 번째 클러스터되지 않은 인덱스를 추가하는 것입니다. 또한 그것은 키 조회의 필요성을 방지하기 위해 (포함 열을 읽기)를 포함하는 데이터 컬럼의 크기에 따라. 그것은 당신이 항상 쿼리 속도 대 쓰기 속도의 균형을해야하기 때문에 물론,이 테이블이 많이 삽입되지 않는다는 것을 제공합니다.

    현실적으로, 클러스터 된 인덱스는 데이터가 가장 가능성이 삽입 \ 갱신 IO 비용의 미묘한 균형을 유지뿐만 아니라 액세스 할 수 있도록하는 순서를 표현한다. 클러스터 된 인덱스는 지속적으로 페이지의 중간에 삽입되도록이면, 당신은 거기 성능 손실이 저하 될 수 있습니다.

    다른 사람이 말한 것처럼, 등 테이블의 길이, 열 크기를 모르고에는 정답이 없습니다. 테스트의 무거운 복용량과 시행 착오는 당신의 최선의 방법이다.

  6. ==============================

    6.그냥 경우이 명확하지 않다 : 색인의 정렬 순서는 쿼리의 결과의 정렬 순서에 대해 많은 약속하지 않습니다.

    그냥 경우이 명확하지 않다 : 색인의 정렬 순서는 쿼리의 결과의 정렬 순서에 대해 많은 약속하지 않습니다.

    쿼리에, 당신은 여전히를 추가해야합니다

    ORDER BY KeyA, KeyB
    

    또는

    ORDER BY KeyB, KeyA
    

    옵티마이 저는 원하는 및 시간을 절약 이미 물리적으로 인덱스에 주문 데이터를 찾을 수 기쁘게 할 수 있지만 특정 순서로 데이터를 전달하도록되어 모든 쿼리는 그것의 끝에서 ORDER BY 절을해야합니다. 에 의한 주문하지 않고, SQL Server는 쿼리의 쿼리에 동일한 순서로 다시 올 것이다, 또는하는 레코드의 순서와 관련하여 어떠한 약속도하지 않습니다.

  7. ==============================

    7.당신이 할 수있는 가장 좋은 것은 두 솔루션을 시도하고 실행 시간을 측정하는 것입니다.

    당신이 할 수있는 가장 좋은 것은 두 솔루션을 시도하고 실행 시간을 측정하는 것입니다.

    내 경험에 의하면, 인덱스 튜닝 제외한 모든 정확한 과학입니다.

    어쩌면 더 좋을 것 인덱스 컬럼 위해 keyA 전에 KEYB을 가진

  8. ==============================

    8.당신은 당신이 일반적으로 그들을 보고서 및 쿼리 정렬 싶은 순서대로 열을 지정합니다.

    당신은 당신이 일반적으로 그들을 보고서 및 쿼리 정렬 싶은 순서대로 열을 지정합니다.

    그래도 난 여러 열로 클러스터 된 인덱스를 생성주의 할 것이다. 이 얼마나 넓은에 따라 모든 클러스터되지 않은 인덱스 그들에 클러스터 된 인덱스 값을 포함하기 때문에 사용자가 만든 다른 인덱스의 크기에 큰 영향을 미칠 수 있습니다. 또한 행은 값이 자주 변경하는 경우 다시 주문해야하고 그것은 비 대리 키를 더 자주 변경하는 경향이 나의 경험이다. 당신은 변화 가능성이 값이 따라서 클러스터 부사장 클러스터되지 않은 인덱스로이 작성 서버 자원의 소모 훨씬 더 많은 시간이 될 수 있습니다. 나는 당신의 열이 실제로 포함하는 데이터의 유형을 알고하지 않는 한이 작업을 수행해서는 안 말하고 있지 않다 (나는 그들이 더 복잡 의심하지만 그 A1, A2, 등); 나는 당신이 그 일의 파급 효과에 대해 생각할 필요가 말하는거야. 철저하게이 일에 투입하기 전에 클러스터 부사장 클러스터되지 않은 인덱스에 대해 BOL 읽기에 아마 좋은 아이디어가 될 것입니다.

  9. ==============================

    9.예를하지만 언젠가는 특정 인덱스를 사용하는 쿼리 엔진을 강제하는 것이 좋습니다 활용하는 최선의 실행 계획 및 인덱스를 알아 내기 위하여, 일반적으로 쿼리 엔진 시도를 제안한다. 뿐만 아니라 쿼리에 인덱스를 사용하는 경우와 같이 인덱스 계획시 다른 고려 사항이있다. 예를 들어, 열이 WHERE 절에 인덱스 컬럼 순서에 주문. 당신에 대해 알고 링크를 참조 할 수 있습니다 :

    예를하지만 언젠가는 특정 인덱스를 사용하는 쿼리 엔진을 강제하는 것이 좋습니다 활용하는 최선의 실행 계획 및 인덱스를 알아 내기 위하여, 일반적으로 쿼리 엔진 시도를 제안한다. 뿐만 아니라 쿼리에 인덱스를 사용하는 경우와 같이 인덱스 계획시 다른 고려 사항이있다. 예를 들어, 열이 WHERE 절에 인덱스 컬럼 순서에 주문. 당신에 대해 알고 링크를 참조 할 수 있습니다 :

    http://ashishkhandelwal.arkutil.com/sql-server/quick-and-short-database-indexes/

    나는 인덱스를 계획 할 때 확인이 당신을 도울 것입니다.

  10. from https://stackoverflow.com/questions/344068/sql-server-clustered-index-order-of-index-question by cc-by-sa and MIT license