2010-03-09 3 views
7

약간의 검색을했는데 비슷한 질문이 없었기 때문에 여기에 있습니다.인덱스를 사용하는시기와 유형을 아는 방법은 무엇입니까?

색인을 표에 넣을 때 어떻게 알 수 있습니까? 색인에 포함 할 열을 어떻게 결정합니까? 클러스터 된 인덱스는 언제 사용해야합니까?

인덱스가 select 문장의 성능을 저하시킬 수 있습니까? 얼마나 많은 인덱스가 너무 많고 얼마나 많은 테이블이 인덱스의 이점을 얻기 위해 필요합니까?

편집 :

무엇에 대한 열 데이터 형식? varchar 또는 datetime에 색인을 포함해도 괜찮습니까?

+0

"varchar 또는 datetime에 인덱스가 있어도됩니까?" 테이블의 모든 쿼리가 시작/끝 날짜 쌍으로 제한되고 데이터의 선택도가 충분히 높기 때문에 클러스터 된 인덱스가 datetime에있는 테이블을 가지고 있습니다 (우리는 날짜 부분 만 사용하고 있음에도 불구하고). 좋은 선택입니다. – Tony

답변

3

음, 첫 번째 질문은 간단합니다 :

언제 클러스터 된 인덱스가 사용되어야 하는가?

항상. 기간. 아주 드물게 드문 경우를 제외하고는. 클러스터 된 인덱스는 모든 작업에 대해 테이블을 더 빠르게 만듭니다. 예! 그렇습니다. 배경 정보는 Kim Tripp의 우수한 The Clustered Index Debate continues을 참조하십시오.이 완벽하게 충족 적

INT의 IDENTITY를 증가 : 수면 적

  • 독특한

    • 좁은
    • 정적 (변하지 않음) : 그녀는 또한 클러스터 된 인덱스에 대한 그녀의 주요 기준을 언급 - GUID는 그렇지 않아. 광범위한 배경 정보는 GUID's as Primary Key을 참조하십시오.

      왜 좁습니까? 클러스터링 키는 동일한 테이블의 모든 클러스터되지 않은 인덱스의 모든 인덱스 페이지에 추가되기 때문에 (필요하면 실제로 데이터 행을 조회 할 수 있도록). 클러스터링 키에 VARCHAR (200)을 사용하지 않으려면 ...

      왜 고유 한가 ?? 위 참조 - 클러스터링 키는 SQL Server가 데이터 행을 고유하게 찾기 위해 사용하는 항목과 메커니즘입니다. 그것은 유일해야합니다. 고유하지 않은 클러스터링 키를 선택하면 SQL Server 자체에서 키에 4 바이트 고유 식별자를 추가합니다. 그걸 조심해!

      다음 : 클러스터되지 않은 인덱스. 기본적으로 하나의 규칙이 있습니다 : 다른 테이블을 참조하는 자식 테이블의 외래 키는 인덱싱되어야하며, JOIN 및 다른 연산의 속도를 높여야합니다.

      또한 WHERE 절이있는 모든 쿼리가 좋은 후보입니다. 가장 먼저 실행되는 쿼리를 선택하십시오. ORDER BY 문에서 WHERE 절에 나타나는 열에 인덱스를 넣습니다.

      다음 : 시스템을 측정하고 사용되지 않거나 누락 된 색인에 대한 힌트를 DMV (동적 관리 뷰)에서 확인하고 시스템을 반복적으로 조정하십시오. 계속 진행되는 과정입니다. 끝내지 못할 것입니다! 두 DMV (누락 및 미사용 색인)에 대해서는 here for info을 참조하십시오.

      경고의 다른 단어 : 트럭 인덱스가 있으면 SELECT 쿼리를 정말 빠르게 만들 수 있습니다. 그러나 동시에 관련된 모든 인덱스를 업데이트해야하는 INSERT, UPDATE 및 DELETE가 영향을받을 수 있습니다. 너만 선택하면 너트! 그렇지 않으면 벌금과 섬세한 균형을 유지해야합니다. 신념을 뛰어 넘어서 하나의 쿼리를 조정할 수는 있지만 시스템의 나머지 부분은 신빙성이 떨어질 수 있습니다. 초과 색인 데이터베이스를 사용하지 마십시오! 몇 가지 좋은 지표를 제자리에두고 시스템의 작동 방식을 확인하고 관찰 한 다음 다른 시스템을 추가하거나 다시 시스템 성능이 어떻게 영향을 받는지 관찰하십시오. 엄지 손가락의

  • +1

    +1은 진행중인 프로세스이며 한 번 수행 한 작업이 아니라는 점에 유의하십시오. –

    +0

    사실, 우리의 DB는 SQL Server와 Postgres 둘다입니다. 그렇기 때문에 거기에 구현하기에는 너무 구체적입니다. 그러나 그렇지 않으면 좋은 설명입니다. – Earlz

    +0

    예, 오라클에는 클러스터링 인덱스가없는 것으로 간주됩니다 (인덱스 구성 테이블과 b 트리 클러스터가 있음). z/OS 용 DB2의 클러스터링 인덱스는 데이터를 클러스터링하기위한 지침으로 사용되지만 법률은 아닙니다. 옵티마이 저가 결과 집합의 카디널리티를 제대로 처리하지 못하면 인덱스의 검색 속도가 더 느려질 수 있습니다. 전체 검색은 인덱스 액세스보다 저렴할 수 있습니다. –

    0

    결과를 필터링 할 모든 열을 색인화하는 것이 좋은 출발점이긴하지만 실제로 이것은 매우 복잡한 질문입니다. 즉. 판매 가격별로 제품을 그룹으로 나누는 경우 종종 제품 테이블의 sale_price 열을 색인하여 해당 쿼리의 검색 시간을 향상 시키십시오.

    0

    열의 값을 기반으로 쿼리하는 경우, 그 열.

    당신은

    일반적으로 X의 인덱스를 원할 것

    SELECT a,b,c FROM MyTable WHERE x = 1 
    

    , 내가 자주 조회되는 열에 대한 인덱스를 추가, 내가 하나 이상에 쿼리있을 때 나는 복합 인덱스를 추가 즉, 기둥.

    인덱스는 SELECT 성능을 저하시키지 않지만 테이블 당 인덱스 열 수가 너무 많은 경우 INSERT (또는 UPDATES)가 느려질 수 있습니다.

    엄지 손가락으로 말하자면 WHERE a = 123 (이 경우 "a"색인)이라고 말할 때 색인을 추가하여 시작하십시오.

    0

    선택 및 순서화에 사용하는 열 (예 : WHERE 및 ORDER BY 절)에 인덱스를 사용해야합니다. 거기에 그들 중 많은 사람들이 당신이 WHERE 및 ORDER BY 인덱스되지 않은 컬럼에 사용하는 경우

    인덱스는 select 문을 늦출 수 있습니다.

    테이블 크기 - 수천 행 이상은 색인 사용에 실질적인 이점을 보여주기 시작합니다.

    이렇게 말하면 자동 설치 도구가 있으며 SQL 서버에는 Database Tuning Advisor이 있습니다.

    +0

    ITW는 이제 SQL Server 2005에서 "DTA (Database Tuning Advisor)"라고 불리며 –

    +0

    @ marc_s - 감사합니다. 답변이 업데이트되었습니다. – Oded

    1

    규칙은 기본 (묵시적 및 클러스터 기본값) 키와 각 외래 키 열입니다

    이 인덱스가 느려질 수 SQL 서버의 missing index DMV에

    을 사용하는 것보다 더 그러나 당신이 할 수있는 더 나쁘다 옵티 마이저가 나쁜 선택을하면 SELECT가, 너무 많이 가질 수는 있습니다. 너무 많으면 쓰기가 느려지지만 인덱스를 겹치게 할 수도 있습니다.

    1

    아무리 작은 테이블이라도 최소한 하나의 인덱스가 있어야하기 때문에 적어도 하나의 인덱스에서 이점을 얻을 수 있습니다. 여기서 당신은 데이터를 찾는 데 관심이 있습니다; 그렇지 않은 이유는 무엇입니까?

    인덱스를 추가하는 일반적인 규칙은 특정 필드 또는 필드 집합을 사용하여 테이블에서 데이터를 찾아야하는 경우입니다.이것은 얼마나 많은 인덱스가 너무 많은지에 이르게합니다. 일반적으로 삽입 및 업데이트 속도가 느린 인덱스는 인덱스를 수정해야 할 때가 많지만 데이터를 사용하는 방법에 따라 다릅니다. 빠른 삽입이 필요한 경우 너무 많이 사용하지 마십시오. "읽기 전용"유형의 데이터 저장소를보고 할 때 모든 조회를 더 빠르게 수행 할 수있는 여러 가지 유형의 데이터 저장소가 있습니다.

    불행히도 선택한 DB의 쿼리 최적화 프로그램이 실행중인 쿼리를 기반으로 힌트를 제공 할 수 있지만 인덱스의 수 또는 유형을 안내하는 규칙은 하나도 없습니다.

    클러스터 된 인덱스는 한 번만 사용할 수있는 Ace 카드이므로 신중하게 선택하십시오. 데이터의 선택성이 매우 낮기 때문에 부울 필드와 같은 무언가 (고안된 예)에 넣을 때 낭비 될 수 있으므로 입력하려는 필드의 선택도를 계산할 가치가 있습니다.

    +0

    @Tony "그렇지 않은 이유는 무엇입니까?"로그가 자주 삽입되는 시스템 로그 (분당 여러 번)는 무엇이지만 로그가 필요한 곳에서 일이 발생할 때만 데이터가 검색됩니다 (예 : 한 달 또는 두 달) – Earlz

    +0

    @ 에를루스 (Erlz : fair point).하지만 로그를 살펴보면 로그 테이블에 포함 된 수백만 행을 검색하는 데 도움이됩니다. 나는 그 진술로 맨 위에 조금 있었다고 볼 수있다 :) – Tony

    관련 문제