문제

설명할 수 있습니의 개념,그리고 사이의 관계를 덮고,인덱스 및 커버는 쿼리에서 Microsoft SQL Server?

도움이 되었습니까?

해결책

취재 인덱스가 중 하나 만족시킬 수 있는 요청한 모든 열에서 쿼리를 수행하지 않고 더 조회으로 클러스터 인덱스입니다.

같은 것은 없는 취재로 쿼리가 있습니다.

이 간단한 기사를 이야기: 를 사용하여 인덱스를 포함하는 쿼리 성능을 향상시.

다른 팁

만약에 모든 열 요청되었습니다 select 쿼리 목록입니다 색인에서 사용할 수 있습니다, 그런 다음 쿼리 엔진이 테이블을 다시 조회 할 필요가 없으므로 쿼리의 성능을 크게 높일 수 있습니다. 요청 된 모든 열은 인덱스에서 사용할 수 있으므로 인덱스는 쿼리를 다루고 있습니다. 따라서 쿼리를 커버링 쿼리라고하고 인덱스는 커버링 인덱스입니다.

선택 목록의 열이 동일한 테이블에서 나온 경우 클러스터 된 인덱스는 항상 쿼리를 커버 할 수 있습니다.

색인 개념을 처음 접하는 경우 다음 링크가 도움이 될 수 있습니다.

취재 인덱스 Non-Clustered 인덱스이다.모두 클러스터와 클러스터 인덱스를 사용하여 B-트리 데이터 구조에 대한 검색을 개선하기 위해 데이터의 차이는 나뭇잎의 클러스터 지수는 전체적 기록을(즉행)저장되어 육체적으로 오른다!, 하지만 이것은 경우 클러스터 인덱스입니다.다음 예에 그것을 설명:

예제:나는 테이블을 가진 세 개의 열이:ID,이름 성과.

enter image description here

그러나,비스,거기에는 두 가지 경우가 있습니다:하나 테이블이 이미 있는 인덱스 또는 하지 않습니다.:

enter image description here

으로 두 개의 다이어그램을 표시한 클러스터 인덱스를 제공하지 않은 좋은 성능,기 때문에 그들을 찾을 수 없습니다 좋아하는 값을(즉름 성)에서 전적으로 B-Tree.대신 그들이 할 일은 여분의 모습을 최대 단계(열쇠 중 하나 또는 제거까지보)의 가치를 찾아 낼름 성.고, 이것은 어디에 덮여 인덱스를 제공합니다. 여기서 비스에 대 ID coveres 의 가치름 성 바로 옆에서 그것의 잎 B-트리도 없고에 필요한 모든 유형의 보상.

enter image description here

덮은 쿼리 쿼리 결과 세트의 모든 열이 비 클러스터 인덱스에서 가져 오는 쿼리입니다.

인덱스의 신중한 배열에 의해 쿼리가 적용됩니다.

비 클러스터 인덱스가 클러스터 된 인덱스 나 힙 색인보다 페이지 당 더 많은 행이 있기 때문에 덮은 쿼리는 부분적으로 비 커버 쿼리보다 더 성능이 뛰어납니다. 따라서 쿼리를 만족시키기 위해 메모리에 가져와야합니다. 테이블 행의 일부만 인덱스 행의 일부이기 때문에 페이지 당 행이 더 많습니다.

커버링 인덱스 덮은 쿼리에서 사용되는 색인입니다. 그 자체가 커버링 인덱스 인 색인과 같은 것은 없습니다. 인덱스는 쿼리 A와 관련하여 커버링 인덱스 일 수 있지만 동시에 쿼리 B와 관련하여 덮개 인덱스가 아닙니다.

여기에 있습니다 devx.com의 기사 즉,

SQL 쿼리에 사용 된 모든 열이 포함 된 비 클러스터 인덱스 생성, 인덱스 커버링

나는 단지 a를 가정 할 수 있습니다 덮은 쿼리 반환 된 레코드 세트의 모든 열을 다루는 색인이있는 쿼리입니다. 한 가지주의 사항 - 인덱스와 쿼리는 SQL 서버가 실제로 인덱스가 유용하다는 쿼리에서 실제로 추론 할 수 있도록 구축되어야합니다.

예를 들어, 테이블 조인 자체는 그러한 색인의 이점을 얻지 못할 수 있습니다 (SQL 쿼리 실행 플래너의 지능에 따라) :

PersonID ParentID Name
1        NULL     Abe
2        NULL     Bob
3        1        Carl
4        2        Dave

색인이 있다고 가정 해 봅시다 PersonID,ParentID,Name - 이것은 다음과 같은 쿼리의 커버링 인덱스입니다.

SELECT PersonID, ParentID, Name FROM MyTable

그러나 다음과 같은 쿼리 :

SELECT PersonID, Name FROM MyTable LEFT JOIN MyTable T ON T.PersonID=MyTable.ParentID

모든 열이 인덱스에 있지만 아마도 그렇게 많이하지 않을 것입니다. 왜요? 당신은 실제로 당신이 트리플 지수를 사용하고 싶다고 말하지 않기 때문에 PersonID,ParentID,Name.

대신 두 열을 기반으로 조건을 구축합니다. PersonID 그리고 ParentID (나가는 Name) 그리고 당신은 열이있는 모든 레코드를 요구합니다. PersonID, Name. 실제로, 구현에 따라 인덱스는 후자의 부분에 도움이 될 수 있습니다. 그러나 첫 번째 부분의 경우 다른 인덱스를 갖는 것이 좋습니다.

기본 테이블의 인덱스를 사용하여 모든 사전 대상을 일치시킬 수있는 곳에 커버 쿼리가 있습니다.

이것은 고려중인 SQL의 성능을 향상시키기위한 첫 번째 단계입니다.

덮은 중 하나를 제공하는 모든 필요한 열에서는 SQL server 있지 않는 다시 생각합 클러스터 인덱스를 찾을 열입니다.이를 사용하여 클러스터 인덱스를 사용하여 포함 옵션을 커버하는 열이 있습니다.Non-키를 열 수 있을 포함에서 클러스터 인덱스입니다.열 수 없습니다 모두에 정의된 키를 열고 목록을 포함.열 이름을 반복할 수 없습에서 포함한 목록입니다.Non-키를 열 수 있습니다 테이블에서 삭제한 후에만 키가 아닌 인덱스가 떨어졌음. 자세한 내용은 여기를 참조하십시오

클러스터 된 인덱스가 정의 된 테이블의 모든 열의 키 주문되지 않은 히피 목록으로 구성되어 있음을 간단히 회상했을 때 조명이 켜졌다. 그러므로 "클러스터"라는 단어는 그 "핫 스팟"의 물고기 클러스터와 같이 모든 열에 "클러스터"가 있다는 사실을 나타냅니다. 추구 값 (방정식의 오른쪽)을 포함하는 열을 덮는 인덱스가없는 경우, 실행 계획은 요청 된 열의 요청 된 열을 찾을 수 없기 때문에 클러스터 된 인덱스의 클러스터 인덱스 검색을 사용합니다. "커버링"색인. 누락은 제안 된 실행 계획에서 클러스터 된 인덱스 검색 연산자를 유발합니다. 여기서 추구 값은 클러스터 된 인덱스로 표시된 순서 목록 내부의 열에 있습니다.

따라서 한 가지 솔루션은 인덱스 내부에 요청 된 값을 포함하는 열이없는 비 클러스터 된 인덱스를 만드는 것입니다. 이러한 방식으로 클러스터 된 인덱스를 참조 할 필요가 없으며 Optimizer는 실행 계획에서 해당 인덱스를 힌트없이 연결할 수 있어야합니다. 그러나 단일 열 클러스터링 키를 명명하는 술어가있는 경우 클러스터링 키의 스칼라 값에 대한 인수가있는 경우 클러스터 된 인덱스 탐색 연산자가 여전히 두 번째 열에 커버링 인덱스가 있더라도 여전히 사용됩니다. 색인이없는 테이블.

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