복붙노트

[SQL] SQL Server의 커버 인덱스 및 대상 쿼리는 무엇입니까?

SQL

SQL Server의 커버 인덱스 및 대상 쿼리는 무엇입니까?

당신은 마이크로 소프트의 SQL 서버에서 인덱스 및 대상 쿼리 취재의 개념과의 관계를 설명 할 수 있습니까?

해결법

  1. ==============================

    1.피복 률은 클러스터 된 인덱스에 추가의 검색을 행하지 않고, 모든 질의 요청을 만족 열 수이다.

    피복 률은 클러스터 된 인덱스에 추가의 검색을 행하지 않고, 모든 질의 요청을 만족 열 수이다.

    취재 쿼리 같은 건 없다.

    이 간단한 대화를 기사에서보세요 : 쿼리 성능 향상을위한 커버 인덱스를 사용.

  2. ==============================

    2.쿼리의 선택 목록에서 요청 된 모든 열이 인덱스에 사용할 수있는 경우, 다음 쿼리 엔진은 크게 쿼리의 성능을 향상시킬 수있는 테이블을 다시 조회 할 필요가 없습니다. 요청 된 모든 열이 인덱스에 사용할 수 있기 때문에, 인덱스는 쿼리를 커버한다. 따라서, 쿼리는 포함하는 쿼리라고하며 인덱스가 커버링 인덱스입니다.

    쿼리의 선택 목록에서 요청 된 모든 열이 인덱스에 사용할 수있는 경우, 다음 쿼리 엔진은 크게 쿼리의 성능을 향상시킬 수있는 테이블을 다시 조회 할 필요가 없습니다. 요청 된 모든 열이 인덱스에 사용할 수 있기 때문에, 인덱스는 쿼리를 커버한다. 따라서, 쿼리는 포함하는 쿼리라고하며 인덱스가 커버링 인덱스입니다.

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

    당신이 인덱스 개념을 처음 사용하는 경우, 다음 링크는 도움이 될 수 있습니다 :

  3. ==============================

    3.커버링 인덱스는 클러스터되지 않은 인덱스입니다. 클러스터 및 클러스터되지 않은 인덱스 모두 데이터에 대한 검색을 개선하기 위해 B-트리 데이터 구조를 사용, 차이는 클러스터 된 인덱스 전체 레코드 (즉, 행)의 잎에서 바로 거기에 물리적으로 저장되어 있다는 것입니다! 그러나 이것은 아니다 클러스터되지 않은 인덱스의 경우. 다음의 예를 보여줍니다

    커버링 인덱스는 클러스터되지 않은 인덱스입니다. 클러스터 및 클러스터되지 않은 인덱스 모두 데이터에 대한 검색을 개선하기 위해 B-트리 데이터 구조를 사용, 차이는 클러스터 된 인덱스 전체 레코드 (즉, 행)의 잎에서 바로 거기에 물리적으로 저장되어 있다는 것입니다! 그러나 이것은 아니다 클러스터되지 않은 인덱스의 경우. 다음의 예를 보여줍니다

    예 : ID,을 Fname 및 LNAME : 나는 3 열이있는 테이블이 있습니다.

    어느 테이블이 이미 클러스터 된 인덱스가 있거나 그렇지 않습니다 그러나, 클러스터되지 않은 인덱스를 들어,이 두 가지 가능성이 있습니다 :

    두 개의 도표가 보여으로 그들이 좋아하는 값을 찾을 수 없기 때문에, 이러한 클러스터되지 않은 인덱스는 전적으로 B-트리에서 (즉 LNAME), 좋은 성능을 제공하지 않습니다. 대신 그들은 (중 키 또는 RID 표정 업) LNAME의 가치를 찾기 위해 추가로 최대보세요 단계를 수행해야합니다. 커버 인덱스가 화면에 제공되는 곳이있다. 여기서, ID에 클러스터되지 않은 인덱스는 바로 옆에있는 B-나무의 잎에서 LNAME의 값을 coveres과 모양까지 모든 유형의 필요가 더 이상 없다.

  4. ==============================

    4.덮여 쿼리는 쿼리의 결과 집합에있는 모든 열이 클러스터되지 않은 인덱스에서 가져온되는 쿼리입니다.

    덮여 쿼리는 쿼리의 결과 집합에있는 모든 열이 클러스터되지 않은 인덱스에서 가져온되는 쿼리입니다.

    쿼리는 인덱스의 현명한 배열에 의해 덮여 쿼리로 이루어진다.

    클러스터되지 않은 인덱스, 클러스터 된 인덱스 또는 힙 인덱스에 비해 페이지 당 더 많은 행이 너무 적은 페이지 쿼리를 충족시키기 위해 메모리로 가져 될 필요가 있기 때문에 커버 쿼리는 종종 더 성능이 좋은 부분이 아닌 덮여 쿼리보다. 테이블 행의 일부분 만 인덱스 행의 일부이기 때문에 그들은 페이지 당 행이.

    커버링 인덱스는 해당 쿼리에 사용되는 인덱스이다. , 그 자체, 커버링 인덱스 인덱스 같은 건 없다. 동시에 질의 B.에 대한 인덱스 피복되지 않는 동안 인덱스는 쿼리 (A)에 대해 피복 될 수있다 인덱스

  5. ==============================

    5.여기 말한다 devx.com의 기사는 다음과 같습니다

    여기 말한다 devx.com의 기사는 다음과 같습니다

    난 단지 덮여 쿼리가 인덱스가 쿼리 것을 가정 할 수있는 커버 모든 반환 된 레코드의 열. 한 가지주의해야 할 점은 - 실제로 인덱스가 유용하다는 쿼리에서 추론 할 수있는 SQL 서버를 허용하기로 인덱스 및 쿼리가 구축되어야 할 것이다.

    예를 들어,은 (SQL 쿼리 실행 계획의 정보에 따라) 같은 인덱스의 혜택을하지 않을 수 있습니다 자신의 테이블을 조인 :

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

    의는 PersonID, ParentID, 이름에 인덱스가있다 가정 해 봅시다 -이 같은 쿼리의 커버 인덱스 될 것이다 :

    SELECT PersonID, ParentID, Name FROM MyTable
    

    그러나이 같은 쿼리 :

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

    아마 모든 열이 인덱스에있는 경우에도, 너무 많은 benifit하지 않을 것입니다. 왜? 당신이 정말로 그것을 이야기하지 않을 때문에 당신은 PersonID, ParentID, 이름의 트리플 인덱스를 사용하려는.

    열을 PersonID와 함께, 이름을 PersonID 및 ParentID 다음 모든 레코드를 요청하고 (이름 밖으로 잎)와 - 대신 두 개의 열을 기반으로 조건을 구축하고 있습니다. 사실, 구현에 따라, 지수는 후자의 부분 도움이 될 수 있습니다. 그러나 첫 번째 부분에 대해, 다른 인덱스를 가지는 것이 더 낫다.

  6. ==============================

    6.피복 쿼리 술어가 모두 기본 테이블에 인덱스를 사용하여 매칭 될 수있는 위치에있다.

    피복 쿼리 술어가 모두 기본 테이블에 인덱스를 사용하여 매칭 될 수있는 위치에있다.

    이것은 고려중인 SQL의 성능을 개선하기위한 첫 단계이다.

  7. ==============================

    7.코팅이 지수는 모든 필요한 열을 제공하는 하나입니다있는 SQL 서버는 모든 열을 찾기 위해 클러스터 된 인덱스에 홉 다시이 없습니다. 이 클러스터되지 않은 인덱스를 사용하여 커버를 열 include 옵션을 사용하여 달성된다. 비 키 열은 비 클러스터형 인덱스에 포함 할 수 있습니다. 열은 키 열 모두에서 정의 할 수 없으며 목록을 포함합니다. (가) 목록을 포함에 열 이름을 반복 할 수 없습니다. 비 키 열은 키가 아닌 인덱스를 먼저 삭제 한 후에 만 ​​테이블에서 삭제할 수 있습니다. 여기에서 자세한 내용을 참조하시기 바랍니다

    코팅이 지수는 모든 필요한 열을 제공하는 하나입니다있는 SQL 서버는 모든 열을 찾기 위해 클러스터 된 인덱스에 홉 다시이 없습니다. 이 클러스터되지 않은 인덱스를 사용하여 커버를 열 include 옵션을 사용하여 달성된다. 비 키 열은 비 클러스터형 인덱스에 포함 할 수 있습니다. 열은 키 열 모두에서 정의 할 수 없으며 목록을 포함합니다. (가) 목록을 포함에 열 이름을 반복 할 수 없습니다. 비 키 열은 키가 아닌 인덱스를 먼저 삭제 한 후에 만 ​​테이블에서 삭제할 수 있습니다. 여기에서 자세한 내용을 참조하시기 바랍니다

  8. ==============================

    8.나는 단순히 클러스터 된 인덱스가 정의 된 테이블의 모든 컬럼의 키 순서가 아닌 힙 목록으로 구성 것을 상기 할 때, 빛은 나를 위해 갔다. 단어 "클러스터"를 선택한 후, 모든 컬럼의 "클러스터"가 "핫 스팟"물고기의 클러스터와 같이 있다는 사실을 의미한다. 시도 된 값 (식의 우측)을 함유하는 칼럼을 커버 인덱스가없는 경우, 실행 플랜은 다른에서 요청 열을 찾지 않기 때문에 클러스터 된 인덱스가 요청 열의 클러스터 된 인덱스의 표현으로 구한다 사용 "피복"인덱스. 다음은 클러스터 된 인덱스가 추구 값이 클러스터 된 인덱스로 표현되는 정렬 된 목록 내부의 열 내에 제안 된 실행 계획에 연산자를 탐색하게됩니다 누락되었습니다.

    나는 단순히 클러스터 된 인덱스가 정의 된 테이블의 모든 컬럼의 키 순서가 아닌 힙 목록으로 구성 것을 상기 할 때, 빛은 나를 위해 갔다. 단어 "클러스터"를 선택한 후, 모든 컬럼의 "클러스터"가 "핫 스팟"물고기의 클러스터와 같이 있다는 사실을 의미한다. 시도 된 값 (식의 우측)을 함유하는 칼럼을 커버 인덱스가없는 경우, 실행 플랜은 다른에서 요청 열을 찾지 않기 때문에 클러스터 된 인덱스가 요청 열의 클러스터 된 인덱스의 표현으로 구한다 사용 "피복"인덱스. 다음은 클러스터 된 인덱스가 추구 값이 클러스터 된 인덱스로 표현되는 정렬 된 목록 내부의 열 내에 제안 된 실행 계획에 연산자를 탐색하게됩니다 누락되었습니다.

    그래서 한가지 해결책은 인덱스 내부 요청 된 값을 포함하는 열이 비 - 클러스터 된 인덱스를 생성하는 것이다. 이러한 방법으로,이 클러스터 된 인덱스를 참조 할 필요가없고, 최적화없이 힌트와 실행 계획에 해당 인덱스를 훅 할 수 있어야한다. 그러나, 술어는 하나의 열 클러스터링 키와 클러스터링 키에 스칼라 값에 인수를 이름이있는 경우, 클러스터 인덱스는의 두 번째 열에서 커버 인덱스가 이미있는 경우에도 운영자는 여전히 사용됩니다 탐색 인덱스가없는 테이블.

  9. ==============================

    9.178 페이지, 고성능 MySQL은, 제 3 판

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

  10. from https://stackoverflow.com/questions/609343/what-are-covering-indexes-and-covered-queries-in-sql-server by cc-by-sa and MIT license