어떤 시점에서 색인을 효율적으로 만드는가


9

테이블에 인덱스를 추가하면 검색 속도가 빨라지고 삽입 속도가 느리지 만 테이블이 큰 경우에만 많은 리소스를 발견했습니다. 이로 인해 설계 결정 인 절충이 이루어 지지만 인덱스를 사용하기 전에 대략적인 테이블 크기가 있어야합니다. (예를 들어, 10 행은 아마도 그 한계 이하일 것입니다)

아무도이 한계가 어디 있는지 또는 올바른 방향으로 나를 안내 할 수있는 자원을 알고 있습니까?


어플리케이션의 읽기 / 쓰기 비율은 무엇입니까? 실제로 쓰기 집약적 인 경우 쓰기 트레이드 오프를 고려해야 할 시점 일지 모르지만 일반적인 응용 프로그램 인 경우 99 %의 경우 필요한 인덱스를 추가합니다 (일반적으로 테이블이 커지면 거의 없습니다) 크기로 돌아갑니다).
Marian

답변:


12

정확한 한계는 실제로 미리 결정하기가 어렵습니다.

대부분의 사람들이 과소 평가하는 것은 인덱스가 쿼리에 사용될 후보가되기 전에 인덱스가 충족해야하는 높은 요구 사항입니다.

효율적인 (비 클러스터형) 인덱스

  • 이벤트 훌륭한 선택 전체 행, 예를 들어 반환 매우 작은 비율 (<1 %, <2 %). 선택성이 주어지지 않은 경우-SQL Server의 쿼리 최적화 프로그램은이 인덱스를 무시할 가능성이 높습니다

  • 이상적으로한다 다루 쿼리를, 즉 쿼리에 필요한 모든 TEH 열을 반환. 당신이 1 또는 2 인덱스 열이, 그리고 다른 소수 (2-4) 열을 포함하는 인덱스를 생성 할 수있는 경우 포함 열을 따라서 당신이 할 수 다루 쿼리를 - 다음 기회는 쿼리 최적화 프로그램이 인덱스를 사용하는 것입니다. 또한 코드가 항상 모든 열SELECT * ..... 을 가져 오기 위해 사용 하는 경우 인덱스 사용 가능성이 실제로 크게 줄어 듭니다.

다른 기준도 많이 있다고 확신하지만이 두 가지가 가장 중요한 기준이라고 생각합니다. 물론, 인덱스를 항상 적절하게 유지 관리 (개편, 재구성)하고 인덱스와 관련된 통계가 최신 상태인지 확인해야합니다.

추신 : 외래 키 열의 비 클러스터형 인덱스는 특별한 경우입니다. 기본적으로 항상 JOINFK 제약 조건 뿐만 아니라 참조 무결성 검사 속도를 높이는 데 도움이되므로 항상 추가하는 것이 좋습니다 . 그러나 여기서도 더 유용한 "include"열을 추가하여 FK 열 인덱스를 "확장"하는 것이 절대적으로 유효합니다.


2
이 답변은 질문에 직접 대답하지는 않지만 색인에 대한 중요한 디자인 원칙을 제공함으로써 훨씬 나아지고 처음에 물어야 할 질문에 대답합니다.
SeanVDH

6

10 개의 행만있는 인덱스에서 개선 된 것을 볼 수 있습니다.

내 컴퓨터의 다음 테스트에서 인덱스가없는 버전은 10.5초 단위로 완료되고 인덱스가 9.8초 단위 인 버전은 3 회 이상 일치합니다.

이 경우 인덱스는 1 개의 리프 페이지로만 구성되지만 슬롯 배열은 인덱스 키 순서로 정렬되므로 존재하므로 SQL Server는 10 개 모두에서 집계를 수행하지 않고 단일 관심 행만 반환 할 수 있습니다.

CREATE TABLE T
(
X INT,
Y CHAR(100) NULL
)

INSERT INTO T (X)
SELECT number 
FROM master..spt_values
WHERE type='P' AND number BETWEEN 1 AND 10

set nocount on;

DECLARE @I INT, @X INT

DECLARE @Time DATETIME2(7) = SYSUTCDATETIME()

SET @I = 1
    WHILE (@I < 1000000)
    BEGIN
    SELECT @X = MAX(X)
    FROM T
    SET @I += 1
    END

SELECT DATEDIFF(MICROSECOND, @Time, SYSUTCDATETIME())

CREATE CLUSTERED INDEX IX ON T(X)
SET @Time = SYSUTCDATETIME()
SET @I = 1
    WHILE (@I < 1000000)
    BEGIN
    SELECT @X = MAX(X)
    FROM T
    SET @I += 1
    END

SELECT DATEDIFF(MICROSECOND, @Time, SYSUTCDATETIME())

DROP TABLE T

인서트가 비슷하게 영향을 받습니까?
SeanVDH

@SeanVDH-내 대답의 예는 클러스터형 인덱스를 힙과 비교하는 것입니다. 행이 특정 위치로 이동해야하고 슬롯 배열이 페이지 분할 가능성을 재 작성함에 따라 기존 행 사이의 삽입 속도가 느려질 수 있습니다. 더 큰 인서트의 경우 데이터를 CI 키 순서로 정렬 할 수도 있으며 이는 힙에 삽입 할 때 필요하지 않습니다. Kimberley Tripp은 여기서 CI에 삽입하는 것이 힙에 삽입하는 것보다 낫다고 주장 합니다 .
Martin Smith

기사에 감사드립니다. 그녀는 흥미로운 점을 제시합니다. 작은 테이블의 선택만큼 인서트가 극적으로 영향을 받는지 궁금하지만, 맞습니다. 트레이드 오프는 처음과 비슷할 것입니다.
SeanVDH
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.