인덱스가없는 경우 SQL Server는 필요한 데이터를 찾기 위해 전체 테이블을 검색해야합니다. 큰 테이블 (30M 행)은 시간이 많이 걸립니다.
쿼리에 적합한 인덱스가있는 경우 SQL 서버는 인덱스 구조를 사용하여 인덱스에서 필요한 행을 빠르게 찾습니다. 색인은 주어진 색인 순서의 색인화 된 컬럼 값과 색인화 된 테이블의 행에 대한 포인터로 구성되므로 색인에서 데이터를 찾으면 해당 색인을 사용하여 색인화 된 테이블의 필요한 데이터를 복구합니다.
그래서 속도를 높이려면 범위를 필터링하는 데 사용할 열의 색인을 만들어야합니다.
색인을 추가하면 쿼리 응답 시간이 향상되지만 더 많은 공간을 차지하게되고 삽입 속도가 느려집니다. 그래서 많은 인덱스를 생성해서는 안됩니다.
사실, 모든 열을 항상 필터링에 사용하려는 경우 하나의 색인 만 만들어야합니다. 그리고 이상적으로는 인덱스가 더 선택적이어야합니다 (즉, 가장 다른 값 (반복되는 값의 수가 가장 적은)). 각 쿼리에는 하나의 인덱스 만 사용할 수 있습니다.
다른 범위 필터 집합을 사용하려면 더 많은 인덱스를 만들어야합니다.
복합 소재를 사용하면 좋을 수도 있고 좋지 않을 수도 있습니다. 복합 키에서 행은 색인의 모든 열에 의해 정렬됩니다. 따라서 A, B, C & D로 색인을 제공하면 A로 필터링하거나 정렬하면 색인의 연속 행이 표시되며 빠른 작업입니다. A, B, C & D로 필터링하면이 색인에 이상적입니다. 그러나 D를 통해서만 필터링하거나 순서를 매기는 것은 인덱스 전체에 퍼져있는 데이터를 복구해야하기 때문에이 인덱스의 최악의 경우입니다. 데이터가 A, B, C, D 순으로 기억되므로 D 정보는 색인 전체에 퍼져 있습니다. 몇 가지 요소 (테이블 통계, 인덱스 선택 등)에 따라 인덱스가 전혀 사용되지 않고 테이블이 스캔 될 수도 있습니다.
클러스터 된 인덱스의 최종 참고 : 클러스터 된 인덱스는 데이터가 테이블에 저장되는 실제 순서를 정의합니다. It doesn't need to be unique. 대부분의 시간을 필터링하기 위해 열 중 하나를 사용하는 경우에는 테이블의 클러스터 된 인덱스를 만드는 것이 좋습니다.이 경우 인덱스를 찾는 대신 포인터를 사용하여 인덱스 된 테이블에서 데이터를 찾는 것이기 때문에 , 테이블을 직접 탐색하고 성능을 향상시킬 수 있습니다.
간단한 대답은 없지만 쿼리 속도를 향상시키는 정보가 있다는 것을 알고 싶습니다.
편집
수정 정보, accordign 매우 흥미로운 코멘트.
당신이 항상'frameidx','u'와'v'를 필터링한다고 가정 할 때,'x','y'와'z'를 비 키 컬럼으로 사용하는 3 개의 컬럼에 복합 인덱스가 가장 많을 것이라고 생각합니다 다용도 :'CREATE NONCLUSTERED INDEX IX_tablename__frameidx_u_v tablename INCLUDE (x, y, z);'- 그러나 모든 범위에 대해 쿼리를 최적화하여 100m 미만의 30m 행을 가진 테이블에서 수천 개의 행을 리턴 할 것으로 기대한다고 생각합니다. 낙관적 인. – GarethD