it-swarm-ko.com

해당 인덱스 란 무엇입니까?

일부 데이터베이스 토론에서 대상 인덱스라는 용어를 들었습니다. 무슨 의미입니까?

65
Martynnw

covering index 는 쿼리에 필요한 모든 열을 포함하는 인덱스입니다.

예를 들어,

SELECT *
FROM tablename
WHERE criteria

일반적으로 criteria 를 사용하여 검색 할 행의 해상도를 높이기 위해 인덱스를 사용하지만 행을 검색하기 위해 전체 테이블로 이동합니다.

그러나 인덱스에 열 column1, column2 column3 이 포함 된 경우, 그런 다음이 SQL :

SELECT column1, column2
FROM tablename
WHERE criteria

특정 색인을 사용하여 검색 할 행의 해상도를 빠르게 할 수 있다면 색인에 이미 관심있는 열의 값이 포함되어 있으므로 행을 검색하기 위해 테이블로 이동할 필요가 없습니다. 색인에서 직접 결과를 생성 할 수 있습니다.

일반적인 쿼리가 1-2 개의 열을 사용하여 어떤 행을 확인한 다음 일반적으로 다른 1-2 개의 열을 추가하는 경우 이러한 추가 열을 추가하는 것이 유리할 수 있습니다. )를 사용하여 쿼리 프로세서가 인덱스 자체에서 모든 것을 가져올 수 있습니다.

다음은 주제에 대한 문서 : 인덱스 적용으로 SQL Server 쿼리 성능 향상 입니다.

커버링 인덱스는 일반적인 인덱스 일뿐입니다. 데이터를 분석 할 필요없이 쿼리를 만족시킬 수 있으면 "커버링"이라고합니다.

예:

CREATE TABLE MyTable
(
  ID INT IDENTITY PRIMARY KEY, 
  Foo INT
) 

CREATE NONCLUSTERED INDEX index1 ON MyTable(ID, Foo)

SELECT ID, Foo FROM MyTable -- All requested data are covered by index

이것은 SQL Server에서 데이터를 검색하는 가장 빠른 방법 중 하나입니다.

13
aku

아래 열이있는 간단한 테이블이 있다고 가정하면 Id 만 색인화했습니다.

Id (Int), Telephone_Number (Int), Name (VARCHAR), Address (VARCHAR)

아래 쿼리를 실행하고 해당 인덱스를 사용하는지, I/O 호출없이 효율적으로 수행하는지 여부를 확인해야한다고 상상해보십시오. Id에서만 인덱스를 만들었습니다.

SELECT Id FROM mytable WHERE Telephone_Number = '55442233';

이 쿼리에서 성능을 확인하면 Telephone_Number가 인덱싱되지 않으므로 I/O 호출을 사용하여 테이블에서 행을 가져와야합니다. 따라서 인덱싱되지 않은 일부 열이 쿼리에 포함되어있어 I/O 호출이 자주 발생하므로 인덱싱 된 커버링이 아닙니다.

커버 인덱스로 만들려면 (Id, Telephone_Number)에 복합 인덱스를 만들어야합니다.

자세한 내용은 다음 블로그를 참조하십시오. https://www.percona.com/blog/2006/11/23/covering-index-and-prefix-indexes/

2
JumpMan

커버링 인덱스는 특정 테이블에서 필요한 모든 열을 "커버"하여 지정된 쿼리/작업에 대해 실제 테이블에 액세스 할 필요가없는 인덱스입니다.

인덱스에는 원하는 열 (또는 그 상위 집합)이 포함되므로 테이블 액세스를 인덱스 조회 나 스캔으로 대체 할 수 있습니다. 일반적으로 훨씬 빠릅니다.

덮을 열 :

  • 파라미터 화 된 또는 정적 조건; 매개 변수화 또는 상수 조건에 의해 제한되는 열.
  • 조인 열; 조인에 동적으로 사용되는 열
  • 선택된 열; 선택한 값에 응답합니다.

인덱스를 포함하면 검색에 좋은 이점을 제공 할 수 있지만 오버 헤드를 삽입/업데이트하는 데 다소 추가됩니다. 모든 업데이트에 추가 또는 더 큰 인덱스 행을 작성해야하기 때문입니다.

조인 된 쿼리에 대한 인덱스 다루기

커버링 인덱스는 결합 된 쿼리의 성능 기술로 가장 유용 할 것입니다. 결합 된 쿼리는 비용이 많이 들고 단일 테이블 검색보다 높은 비용의 성능 문제가 발생하기 때문입니다.

  • 조인 된 쿼리에서 인덱스를 다루는 것은 테이블마다 고려해야합니다.
  • 각 'covering index'는 계획에서 실제 테이블 액세스를 제거하고 인덱스 전용 액세스로 대체합니다.
  • 계획 비용을 조사하고 커버링 인덱스로 대체 할 가치가있는 테이블을 실험 해보십시오.
  • 이를 통해 대규모 가입 계획의 곱하기 비용을 크게 줄일 수 있습니다.

예를 들면 다음과 같습니다.

select oi.title, c.name, c.address
from porderitem poi
join porder po on po.id = poi.fk_order
join customer c on c.id = po.fk_customer
where po.orderdate > ? and po.status = 'SHIPPING';

create index porder_custitem on porder (orderdate, id, status, fk_customer);

보다:

2
Thomas W