2014-09-01 2 views
0

빠른 범위 선택을 위해 테이블에서 적절한 인덱싱을 만드는 방법을 이해하는 데 도움이 필요합니다.SQL Server 범위 인덱싱 아이디어

나는 다음과 같은 열이있는 테이블이 있습니다

--- 유형


frameidx --- 지능

유 --- INT

v --- int

,

X ---은 플로트 (53)

Y --- 플로트 (53)

Z --- 유동이 열 (53)


없음 고유 없다.

이 테이블에는 약 3 천만 개의 레코드가 있어야합니다.

평균 쿼리는 다음과 같이 보일하지 않을 것이다 :

Select x, y, z from tablename 
    Where 
     frameidx = 4 AND 
     u between 34 AND 500 
     v between 0 AND 200 

예쁜 정직하고, 더 조인, 중첩 된 물건을. 그냥 좋은 하위 집합 선택.

MS SQL Server (2012)에서이 테이블에 대해 어떤 종류의 인덱싱을 수행해야합니까 (이 쿼리에서 수천이 될 수 있음)를 (이상적으로) 100ms 미만으로 가져올 수 있습니다. 예?

감사합니다.

+0

당신이 항상'frameidx','u'와'v'를 필터링한다고 가정 할 때,'x','y'와'z'를 비 키 컬럼으로 사용하는 3 개의 컬럼에 복합 인덱스가 가장 많을 것이라고 생각합니다 다용도 :'CREATE NONCLUSTERED INDEX IX_tablename__frameidx_u_v tablename INCLUDE (x, y, z);'- 그러나 모든 범위에 대해 쿼리를 최적화하여 100m 미만의 30m 행을 가진 테이블에서 수천 개의 행을 리턴 할 것으로 기대한다고 생각합니다. 낙관적 인. – GarethD

답변

2

인덱스가없는 경우 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 매우 흥미로운 코멘트.

+0

두꺼운 것에 대해 용서하세요. 나는 아직도 배우고 있습니다. 그래서 그 열이 쿼리의 일부가 아니더라도 자동으로 생성 된 기본 키 열을 추가해야합니까? 또한 공간 및 삽입 시간은 전혀 문제가되지 않는다는 점에 유의해야합니다. 데이터베이스가 '오프라인'으로 준비되고 '온라인'으로만 선택되기 때문입니다. 따라서 염두에두고, frameidx, u 및 v 열에 단일 복합 인덱스를 만들어야합니까? – BKaun

+1

* "먼저 테이블에 대한 기본 키를 광고하여 올바르게 색인화 할 수 있도록해야합니다 *"- 사실이 아닙니다! 먼저 기본 키가 아닌 클러스터 된 인덱스를 의미한다고 가정합니다. 둘째, [힙 테이블] (http://msdn.microsoft.com/en-us/library/hh213609.aspx)은 클러스터 된 테이블이없는 경우 효율적인 행 포인터를 사용합니다. 일반적으로 비 클러스터형 인덱스를 통해 데이터에 액세스 할 때 일반적으로 사용되므로 클러스터형 인덱스는 인덱스를 제대로 작성하는 데 필요하지 않습니다. – GarethD

+0

@GarethD 와우, 당신이 지적한 것은 대단합니다! 나는 RID에 대해 몰랐다. 그리고 나는 클러스터링 된 인덱스가 고유해야한다는 것을 의식하지 못하게 가정했습니다. (대답을 복잡하게 만들고 싶지 않았기 때문에 PK에 관해서는 sppke입니다.) 귀하의 의견을 주셔서 감사합니다 지금 나는 클러스터 된 인덱스가 아닌 고유 수 있으며 고유 PK에 대한 필요없이 색인 생성을위한 힙의 RID를 사용할 수 있습니다. – JotaBe

관련 문제