[SQL] SQL 서버 계획 : 인덱스 스캔 / 인덱스 힘쓰라의 차이
SQLSQL 서버 계획 : 인덱스 스캔 / 인덱스 힘쓰라의 차이
기본적으로 SQL Server 실행 계획에서 인덱스 스캔 및 인덱스의 차이점은 무엇입니까 탐색
나는 SQL 서버 2005입니다.
해결법
-
==============================
1.SQL 서버가 일치 찾고 인덱스 전체를 읽는 경우 인덱스 스캔 - 이것은 걸리는 시간은 인덱스의 크기에 비례한다.
SQL 서버가 일치 찾고 인덱스 전체를 읽는 경우 인덱스 스캔 - 이것은 걸리는 시간은 인덱스의 크기에 비례한다.
SQL 서버가 일치하는 레코드를 직접 추구하는 인덱스의 B- 트리 구조를 사용하는 경우 인덱스 추구는 (어떻게이 작품에 대한 아이디어에 대한 http://mattfleming.com/node/192 참조) - 촬영 시간에만 비례 일치하는 레코드 수.
-
==============================
2.따라야 할 기본적인 규칙은 좋은 찾는다, 스캔이 나쁜 것입니다.
따라야 할 기본적인 규칙은 좋은 찾는다, 스캔이 나쁜 것입니다.
인덱스 스캔
SQL Server가 검색을 수행 할 때 그것은 다음, 디스크에서 메모리로 읽어 원이 필요로하는 기록을 찾고 위에서 아래로 그 객체를 읽어 객체를로드합니다.
인덱스 탐색
SQL 서버가 수행 할 때는 데이터가 디스크에서 색인을로드하므로, 될 것입니다 것을 인덱스에, 그것을 필요로하는 지수의 부분으로 직접 이동 위치를 알고 및 데이터는 끝을 필요로하는 곳으로 읽어 추구 . 이 찾고있는 데이터의 위치 SQL이 이미 알고있는 이것은 분명 스캔보다 훨씬 더 효율적으로 작업입니다.
어떻게이 검사 대신 탐색 사용할 수있는 실행 계획을 수정할 수 있습니다?
열 중 일부는 당신이 그것을 사용하고자하는 인덱스에 포함되지 않습니다를 찾을 때 SQL Server가 데이터에 대한에서 SQL 서버 스위치를 만들 것입니다 가장 큰 것의 아마 하나를보고하면 스캔 추구이다. 대부분의 경우이 클러스터 된 인덱스가 테이블의 모든 열을 포함하고 있기 때문에 SQL Server를 다시 클러스터 된 인덱스 스캔을 수행에 떨어질 것입니다. 이것은 우리가 지금 인덱스의 인덱스 컬럼에 그 컬럼을 추가하지 않고, 인덱스의 열을 포함 할 수있는 능력을 가지고 (적어도 내 생각에) 가장 큰 이유 중 하나입니다. 인덱스에 추가 열을 포함하여 우리는 인덱스의 크기를 증가하지만, 우리는 토고 다시 클러스터 된 인덱스를하지 않고, SQL Server가 인덱스를 읽을 수 있도록, 또는 테이블에 자기가이 값을 얻을 수 있습니다.
참조
SQL 서버 실행 계획을 참조 내에서 이러한 연산자 각각의 세부 사항에 대한 자세한 내용은 ....
-
==============================
3.주사 접촉하기 때문에 테이블의 각 행은, 그 자격이 있는지 여부, 비용은 테이블의 행의 수에 비례한다. 테이블이 작거나 행의 대부분이 조건에 해당하는지 경우에 따라서, 스캔 효율적인 전략이다.
주사 접촉하기 때문에 테이블의 각 행은, 그 자격이 있는지 여부, 비용은 테이블의 행의 수에 비례한다. 테이블이 작거나 행의 대부분이 조건에 해당하는지 경우에 따라서, 스캔 효율적인 전략이다.
A는 단지 자격 행과 이러한 규정 행을 포함하는 페이지를 접촉 추구하기 때문에, 비용은 오히려 테이블에있는 행의 총 수보다 행과 페이지를 자격의 수에 비례합니다.
인덱스 스캔은 마지막 페이지로 첫 페이지에서 데이터 페이지에 아무것도하지만 스캔 없다. 이 테이블에 대한 인덱스이고, 쿼리가 더 많은 양의 데이터를 접촉하면 어떤 쿼리가 50 % 이상 또는 데이터의 90 %를 검색하고, 다음 최적화 그냥 모든 데이터 페이지를 스캔 할 것을 의미하는 경우 데이터 행을 검색 할 수 있습니다. 인덱스가없는 경우에, 당신은 실행 계획에 테이블 스캔 (인덱스 스캔)을 볼 수 있습니다.
지수는 일반적으로 매우 선택 쿼리를 선호 추구한다. 무슨 의미하는 것은 쿼리가 단지 행의 적은 수를 요청하거나 다른 (10) 검색하는 것입니다 테이블의 행 (일부 문서는 15 %를 말한다).
일반 쿼리 최적화 프로그램에서 최적화 레코드 집합을 검색 할 수있는 유용한 인덱스를 발견했다고 인덱스가있는 방법을 탐색 사용하려고합니다. 인덱스 또는 테이블에 더 유용한 인덱스가 없기 때문에이 중 하나 그렇게 할 수없는 경우에, 다음 SQL Server는 쿼리 조건을 만족하는 모든 레코드를 검색 할 수 있습니다.
스캔은 전체 테이블 또는 인덱스를 반환합니다. A는 효율적 조건에 따라 인덱스의 하나 또는 그 이상의 범위에서 행을 반환 추구합니다. 예를 들어, 다음 쿼리를 고려하십시오
select OrderDate from Orders where OrderKey = 2
주사
스캔, 우리는 "ORDERKEY = 2"와, 술어에 해당하는 경우 (즉, 행 자격이 있는지), 행을 반환 술어를 평가, 주문 테이블의 각 행을 읽습니다. 이 경우, 우리는 "잔류"술어로서 술어를 참조하십시오. 우리는 검사의 잔류 조건을 평가 가능한, 성능을 최대화합니다. 술어가 너무 비싼 경우, 우리는 별도의 필터 반복자에 평가를 할 수 있습니다. 잔류 조건과 함께 텍스트 실행 계획에 나타나는 WHERE 키워드 또는 태그와 XML 실행 계획한다.
다음은 스캔을 사용하여이 쿼리에 대한 텍스트 실행 계획 (약간 간결하게 편집)입니다 :
| - 테이블 검사 (OBJECT : ([ORDERS), WHERE ([ORDERKEY] = (2)))
다음 그림은 스캔을 보여줍니다
주사가 자격이 있는지의 여부를 테이블의 모든 행에 접촉하기 때문에, 비용이 테이블의 행의 수에 비례한다. 테이블이 작거나 행의 대부분이 조건에 해당하는지 경우에 따라서, 스캔 효율적인 전략이다. 테이블이 크고 행의 대부분이 필요하지 않은 경우, 우리는 더 많은 I 더 많은 페이지 및 행을 터치하여 수행하는 경우, / O를보다가 필요합니다.
찾다. 목표물 탐색
우리가 ORDERKEY에 색인이있는 경우가 추구, 예제로 되돌아가는 것은 더 좋은 계획이 될 수있다. A가 추구, 우리는 조건을 만족하는 행으로 바로 이동하기 위해 인덱스를 사용합니다. 이 경우, 우리는 "추구"술어로서 술어를 참조하십시오. 대부분의 경우, 우리가 필요로하지 않는이 잔류 조건으로 술어 추구 재 평가; 인덱스 보장하지만은 자격 만 반환 행을 추구. (가) 태그와 키워드 또는 XML 실행 계획을 SEEK와 텍스트 실행 계획에서 술어가 나타납니다을 추구합니다.
여기가 추구 사용하여 동일한 쿼리에 대한 텍스트 실행 계획은 다음과 같습니다
| 탐색 -index (OBJECT :. ([ORDERS는 [OKEY_IDX])을 시크 ([ORDERKEY] = (2))를 ORDERED FORWARD)
다음 그림은이 찾는 보여
A는 단지 자격 행과 이러한 규정 행을 포함하는 페이지를 접촉 추구하기 때문에, 비용은 오히려 테이블에있는 행의 총 수보다 행과 페이지를 자격의 수에 비례합니다. 우리는 매우 선택적 술어를 찾고있는 경우에 따라서는 추구 일반적으로보다 효율적인 전략이다; 우리가있는 경우 즉, A는 술어 추구을 제거해 그 테이블의 많은 부분.
실행 계획에 대한주의 사항
실행 계획에서, 우리는 스캔을 구분뿐만 아니라 스캔과 같은 힙에 (AN없는 인덱스 오브젝트), 클러스터 된 인덱스 및 클러스터되지 않은 인덱스를 추구한다. 다음 표에서는 유효한 조합의 모든 :
https://blogs.msdn.microsoft.com/craigfr/tag/scans-and-seeks/
https://blog.sqlauthority.com/2007/03/30/sql-server-index-seek-vs-index-scan-table-scan/
-
==============================
4.짧은 답변:
짧은 답변:
-
==============================
5.인덱스 스캔으로 인덱스의 모든 행이 일치하는 행을 찾기 위해 스캔되고있다. 이 작은 테이블 효율적이 될 수 있습니다. 색인 탐색, 그것은 실제로 기준을 충족하는 행을 터치 할 필요가 그래서 일반적으로 더으로 확대됨에
인덱스 스캔으로 인덱스의 모든 행이 일치하는 행을 찾기 위해 스캔되고있다. 이 작은 테이블 효율적이 될 수 있습니다. 색인 탐색, 그것은 실제로 기준을 충족하는 행을 터치 할 필요가 그래서 일반적으로 더으로 확대됨에
-
==============================
6.인덱스 정의 검색 조건을 만족하는 하나의 행을 찾을 수 없을 때 인덱스 스캔이 발생합니다. 이 경우 SQL Server는 검색 조건을 충족시키는 행의 범위를 찾기 위해 여러 페이지를 스캔 할 수 있습니다.
인덱스 정의 검색 조건을 만족하는 하나의 행을 찾을 수 없을 때 인덱스 스캔이 발생합니다. 이 경우 SQL Server는 검색 조건을 충족시키는 행의 범위를 찾기 위해 여러 페이지를 스캔 할 수 있습니다.
인덱스 탐색 a의 경우, SQL Server는 인덱스 정의를 사용하여 단일 행 일치하는 검색 조건을 찾습니다.
지수는 더 더욱 효과적인 검색합니다.
-
==============================
7.스캔은 후 여부를 무엇인가의 경우에도 테이블의 모든 행을 접촉
스캔은 후 여부를 무엇인가의 경우에도 테이블의 모든 행을 접촉
A는 단지 당신이 찾고있는 무엇을 행에 모습을 추구합니다.
노력은이 데이터를 조회하는 방식에서 더 효율적으로 스캔보다가 항상 더 낫다.
좋은 설명은 여기에서 찾을 수 있습니다
from https://stackoverflow.com/questions/1136524/sql-server-plans-difference-between-index-scan-index-seek by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 스크립트 DELETE CASCADE ON 추가하는 모든 외부 키를 변경하려면 (0) | 2020.06.21 |
---|---|
[SQL] 날짜, 시간, DATETIME, 및 TIMESTAMP 유형 사이에 어떤 차이 (0) | 2020.06.21 |
[SQL] ROW_NUMBER를 사용하여 쿼리에서 @@ 행 개수를 얻기의 효율적인 방법 (0) | 2020.06.21 |
[SQL] 왜 대다 관계? (0) | 2020.06.21 |
[SQL] id 필드에 다시 씨앗으로 길을 레일 (0) | 2020.06.21 |