itsource

SQL Server에서 적용되는 인덱스 및 적용되는 쿼리란 무엇입니까?

mycopycode 2023. 7. 16. 13:19
반응형

SQL Server에서 적용되는 인덱스 및 적용되는 쿼리란 무엇입니까?

Microsoft SQL Server의 Covering Index와 Covered Query의 개념 및 관계를 설명할 수 있습니까?

커버링 인덱스는 클러스터된 인덱스를 추가로 조회하지 않고 쿼리에서 요청된 모든 열을 충족할 수 있는 인덱스입니다.

커버링 쿼리 같은 것은 없습니다.

이 간단한 대화 기사를 확인해 보십시오.피복 색인을 사용하여 쿼리 성능을 개선합니다.

에서 요청된 모든 열의 경우select쿼리 목록을 인덱스에서 사용할 수 있으면 쿼리 엔진이 테이블을 다시 검색할 필요가 없으므로 쿼리 성능이 크게 향상됩니다.요청된 모든 열을 인덱스 내에서 사용할 수 있으므로 인덱스는 쿼리를 포함합니다.따라서 쿼리를 커버링 쿼리라고 하며 인덱스는 커버링 인덱스입니다.

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

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

는 피복지는수▁a입니다.Non-Clustered클러스터된 인덱스와 비클러스터된 인덱스 모두 B-Tree 데이터 구조를 사용하여 데이터 검색을 개선합니다. 차이점은 클러스터된 인덱스의 리프에서 전체 레코드(즉, 행)가 물리적으로 바로 저장된다는 것입니다!. 하지만 비클러스터된 인덱스의 경우는 그렇지 않습니다.는 그것을합니다: 다은이보는예입니다주여를음.

예:ID, Fname, Lname 세 개의 열이 있는 테이블이 있습니다.

enter image description here

그러나 비클러스터형 인덱스의 경우 테이블에 클러스터형 인덱스가 이미 있거나 없는 두 가지 방법이 있습니다.

enter image description here

두 다이어그램에서 볼 수 있듯이, 이러한 비클러스터형 인덱스는 B-Tree에서만 즐겨찾기 값(예: Lname)을 찾을 수 없기 때문에 좋은 성능을 제공하지 못합니다.대신 Lname 값을 찾기 위해 추가 Look Up 단계(Key 또는 RID 조회)를 수행해야 합니다.여기서 커버된 인덱스가 화면에 표시됩니다.여기서 ID의 비클러스터형 인덱스는 B-Tree 잎에서 바로 옆에 있는 Lname 값을 포함하므로 더 이상 조회 유형이 필요하지 않습니다.

enter image description here

적용된 쿼리는 쿼리의 결과 집합에 있는 모든 열이 비클러스터된 인덱스에서 가져온 쿼리입니다.

쿼리는 인덱스의 신중한 배열에 의해 포함된 쿼리로 만들어집니다.

클러스터되지 않은 인덱스는 클러스터된 인덱스나 힙 인덱스보다 페이지당 행 수가 더 많기 때문에 쿼리를 충족하기 위해 메모리에 가져올 필요가 있는 페이지 수가 적기 때문에 포함된 쿼리가 포함되지 않은 쿼리보다 성능이 더 우수한 경우가 많습니다.테이블 행의 일부만 인덱스 행의 일부이므로 페이지당 행 수가 더 많습니다.

커버링 인덱스는 커버링된 쿼리에 사용되는 인덱스입니다.그 자체로 커버링 인덱스인 인덱스는 없습니다.인덱스는 쿼리 A에 대한 커버링 인덱스일 수 있지만 쿼리 B에 대한 커버링 인덱스는 아닐 수 있습니다.

다음은 devx.com 의 기사입니다.

SQL 조회에 사용되는 모든 열을 포함하는 비클러스터형 인덱스 만들기(인덱스 커버링 기법)

포함된 쿼리는 반환된 레코드 집합의 모든 열을 포함하는 인덱스를 가진 쿼리라고 가정할 수 있습니다.한 가지 주의할 점은 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 서버에서 클러스터된 인덱스로 홉백하여 열을 찾을 수 없습니다.이 작업은 비클러스터형 인덱스를 사용하고 열을 포함하는 INCLUDE 옵션을 사용하여 수행됩니다.키가 아닌 열은 비클러스터된 인덱스에만 포함될 수 있습니다.열은 키 열과 포함 목록 모두에서 정의할 수 없습니다.열 이름은 포함 목록에서 반복할 수 없습니다.키가 아닌 열은 키가 아닌 인덱스가 먼저 삭제된 후에만 테이블에서 삭제할 수 있습니다.자세한 내용은 여기를 참조하십시오.

클러스터된 인덱스가 정의된 테이블에 있는 모든 열의 키 순서 비저장 목록으로 구성되어 있다는 것을 기억하면 불이 켜집니다.따라서 "클러스터"라는 단어는 "핫 스팟"에 물고기 군집처럼 모든 기둥의 "클러스터"가 있다는 사실을 나타냅니다.검색된 값을 포함하는 열을 포함하는 인덱스가 없는 경우(식의 오른쪽), 실행 계획은 다른 "포함" 인덱스에서 요청된 열을 찾지 못하므로 요청된 열을 클러스터된 인덱스로 표현하는 클러스터된 인덱스 검색을 사용합니다.누락되면 제안된 실행 계획에서 클러스터된 인덱스 검색 연산자가 발생하며, 여기서 검색된 값은 클러스터된 인덱스로 표시되는 순서 목록 내 열 내에 있습니다.

따라서 한 가지 해결책은 인덱스 내부에 요청된 값이 들어 있는 열이 있는 비클러스터형 인덱스를 만드는 것입니다.이렇게 하면 클러스터된 인덱스를 참조할 필요가 없으며 Optimizer는 실행 계획에서 힌트 없이 해당 인덱스를 후크할 수 있습니다.그러나 단일 열 클러스터링 키에 이름을 지정하는 술어와 클러스터링 키의 스칼라 값에 대한 인수가 있는 경우 인덱스가 없는 테이블의 두 번째 열에 이미 포함된 인덱스가 있더라도 클러스터된 인덱스 검색 연산자가 계속 사용됩니다.

178페이지, 고성능 MySQL, 3판

쿼리를 충족하는 데 필요한 모든 데이터를 포함(또는 "포함")하는 인덱스를 커버링 인덱스라고 합니다.

인덱스로 처리되는 쿼리(인덱스로 처리되는 쿼리)를 실행하면 설명의 추가 열에 "인덱스 사용"이 표시됩니다.

언급URL : https://stackoverflow.com/questions/609343/what-are-covering-indexes-and-covered-queries-in-sql-server

반응형