문제

최근에 데이터베이스에서 인덱스가 나타났습니다.

CREATE INDEX [IX_Foo] ON [Foo]
( Id ASC )
INCLUDE 
( SubId )

이 특별한 경우, 내가 겪고있는 성능 문제 (ID 및 SUBID 모두에서 느린 선택 필터링)는 포함 된 열이 아닌 SUBID 열을 인덱스로 이동하여 단순히 고정 될 수 있습니다.

그러나 이것은 내가 일반적으로 단순히 색인 자체의 일부가 될 수있을 때 칼럼을 포함한 추론을 전혀 이해하지 못한다고 생각하게 만들었습니다. 인덱스 자체에있는 항목에 대해 특별히 신경 쓰지 않더라도 단순히 포함되지 않고 인덱스에 열을 갖는 단점이 있습니다.

일부 연구 후, 인덱스 된 열로 들어갈 수있는 내용에 대한 여러 제한 사항이 있음을 알고 있습니다 (인덱스의 최대 너비 및 '이미지'와 같이 색인화 할 수없는 일부 열 유형). 이 경우 인덱스 페이지 데이터에 열을 포함시켜야한다는 것을 알 수 있습니다.

내가 생각할 수있는 유일한 것은 SubID에 업데이트가 있으면 열이 포함 된 경우 행을 재배치 할 필요가 없다는 것입니다 (색인의 값을 변경해야하지만). 내가 놓친 다른 것이 있습니까?

데이터베이스의 다른 색인을 살펴보고 가능한 경우 적절한 인덱스의 열을 이동하는 것을 고려하고 있습니다. 이것이 실수일까요?

주로 MS SQL Server에 관심이 있지만 다른 DB 엔진에 대한 정보도 환영합니다.

도움이 되었습니까?

해결책

지금까지의 대답은 모두 정확하고 모두 - 그러나 그들은 당신이 덮는 지수에서 얻는 것을 충분히 전달하지 않을 수도 있습니다.

귀하의 경우에는 테이블이 있습니다 Foo 및 An을 포함한 일부 분야 Id (내가 기본 키라고 생각하는 것은) SubId 어떤 종류의 추가 ID입니다.

당신은 또한 색인이 있습니다 IX_Foo 내가 생각했던 것만 Id 지금은.

이제 당신은 그것을 찾아야합니다 SubId ~을 위한 Id=4.

SELECT Id, SubId
FROM Foo
WHERE Id=4
  • SQL Server는 SELECT 문을보고 사용할 수 있습니다. IX_Foo
  • 그런 다음 가치를 검색합니다 Id=4 당신의 색인에서 IX_Foo
  • 그것을 찾으면 이제 가치가 필요합니다. SubId, 도
  • 비 클러스터 인덱스 IX_Foo 클러스터링 키 값이 포함됩니다
  • 해당 클러스터링 키 값을 사용하여 SQL Server는 전체 데이터 행이있는 실제 데이터 페이지를 찾기 위해 "북마마 조회"를 수행합니다.
  • 그것은 그 페이지를 가져와 값을 추출합니다. SubId 이것으로부터
  • 쿼리를 만족시키기 위해 해당 값을 반환합니다

여기서 요점은 다음과 같습니다. 일단 SQL Server가 귀하의 Id=4 에서 IX_Foo 인덱스, 그런 다음 다른 I/O 작업, 북마크 조회를 수행해야합니다. SubId 값.

덮개 색인이있는 경우, 예를 들어 IX_Foo 또한 포함됩니다 SubId, 북마크 조회를 수행하기위한 추가 I/O가 제거됩니다. 일단 값 Id=4 에서 발견됩니다 IX_Foo 인덱스, 비 클러스터 인덱스의 인덱스 페이지에는 다음의 값도 포함됩니다. SubId -SQL Server는 이제 선택한 쿼리에서 요청한 두 값을 반환 할 수 있습니다. 없이 다른 ID 열을 가져 오기 위해 여분의 (잠재적으로 비싸고 느리게) 북마크 조회를해야합니다.

이것이 커버링 지수의 주요 이점입니다. 하나 또는 두 개의 추가 열만 필요하다면, 인덱스 자체에 해당 값을 포함시켜 조회를 수행하는 인덱스 값 외에도 많은 책갈피 조회를 절약 할 수 있습니다. 속도를 크게 높이십시오. 그러나 소수의 정보 만 포함해야합니다. 작은 비트의 정보가 포함되어야합니다. 전체 데이터 행을 모든 비 클러스터 지수로 복제하지 마십시오! 요점은 그것이 아니다.

업데이트: 트레이드 오프는 다음과 같습니다. (id, subid)에 색인이있는 경우 인덱스의 모든 페이지에는 전체 색인 트리가 두 열이 있습니다.

당신이 (subid)를 포함 시키면, subid 필드는 잎 수준에만 존재합니다.

이것은 의미합니다

  • SQL Server는 SubID에서 검색 및 비교할 수 없습니다 (값은 인덱스 트리에 없습니다)
  • 값이 잎 수준에만 있으므로 공간이 적습니다.

다른 팁

인덱스에 추가 열이있는 이유는 인덱스에서 사용하는 열만 필요로하는 쿼리를 수행 할 때 인덱스 자체에서 쿼리를 수행 할 수 있기 때문입니다. 이렇게하면 테이블로 돌아가는 시간과 리소스를 절약합니다. 이런 일이 발생하면 인덱스가 피복 쿼리 색인.

"인덱스 적절한"의 추가 열 부분을 만들고 싶지 않은 이유는 해당 열에 삽입 또는 업데이트를 할 때 인덱스의 일부를 다시 선택해야 할 가능성이 높기 때문입니다.

인덱스에 포함시켜 인덱스를 덮는 인덱스로 사용할 수 있습니다 (즉, 클러스터 된 인덱스에 책갈피 조회를 수행하지 않고도 해당 인덱스를 만족시킬 수 있습니다. 인덱스의 크기를 낮추는 색인. (포함 된 열은 인덱스의 잎 노드에만 추가됩니다).

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