공간 인덱스 개요

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

SQL Server는 공간 데이터 및 공간 인덱스를 지원합니다. 공간 인덱스는 공간 열을 인덱싱할 수 있는 확장 인덱스의 형식입니다. 공간 열은 기하 도형 또는 지리와 같은 공간 데이터 형식의 데이터를 포함하는 테이블 열입니다.

SQL Server 공간 도구는 SQL Server의 공간 유형과 함께 사용할 수 있는 Microsoft에서 후원하는 오픈 소스 도구 컬렉션입니다. 이 프로젝트는 애플리케이션에서 사용할 수 있는 재사용 가능한 함수 집합을 제공합니다. 이러한 함수에는 데이터 변환 루틴, 새 변환, 집계 등이 포함될 수 있습니다. 자세한 내용은 GitHub의 Microsoft/SQLServerSpatialTools를 참조하세요.

공간 인덱스 정보

인덱싱된 공간을 그리드 계층 구조로 분해

SQL Server에서 공간 인덱스는 B-트리를 사용하여 빌드됩니다. 즉, 인덱스는 B-트리의 선형 순서로 2차원 공간 데이터를 나타내야 합니다. 따라서 데이터를 공간 인덱스로 읽기 전에 SQL Server는 공간의 계층적 균일한 분해를 구현합니다. 인덱스 생성 프로세스는 공간을 4단계 그리드 계층 구조로 분해합니다. 이러한 수준을 수준 1(최상위 수준), 수준 2, 수준 3수준 4라고 합니다.

각 연속 수준은 위의 수준을 더 분해하므로 각 상위 수준 셀은 다음 수준에서 전체 눈금이 포함됩니다. 지정된 수준에서 모든 눈금은 두 축(예: 4x4 또는 8x8)을 따라 동일한 수의 셀을 가지며 셀은 모두 하나의 크기입니다.

다음 그림에서는 그리드 계층 구조의 각 수준에서 오른쪽 위 셀의 분해를 4x4 그리드로 보여 줍니다. 실제로 모든 셀은 이러한 방식으로 분해됩니다. 따라서 예를 들어 공간을 4x4 그리드의 4개 수준으로 분해하면 실제로 총 65,536개의 수준-4개의 셀이 생성됩니다.

Four-levels of recursive tessellation

참고 항목

공간 인덱스의 공간 분해는 애플리케이션 데이터가 사용하는 측정 단위와 독립적입니다.

그리드 계층 구조 셀은 Hilbert 공간 채우기 곡선의 변형을 사용하여 선형 방식으로 번호가 매겨집니다. 그러나 설명을 위해 이 토론은 실제로 힐버트 곡선에 의해 생성되는 번호 매기기 대신 간단한 행 단위 번호 매기기를 사용합니다. 다음 그림에서는 건물을 나타내는 여러 다각형과 거리를 나타내는 선이 이미 4x4 수준-1 그리드에 배치되었습니다. 수준 1 셀은 왼쪽 위 셀부터 시작하여 1부터 16까지 번호가 매겨집니다.

Polygons and lines placed into a 4x4 level-1 grid

그리드 밀도

그리드의 축을 따라 있는 셀 수에 따라 해당 밀도가 결정됩니다 . 숫자가 클수록 눈금이 더 조밀합니다. 예를 들어 64개의 셀을 생성하는 8x8 그리드는 4x4 그리드(16개의 셀을 생성함)보다 조밀합니다. 그리드 밀도는 수준별로 정의됩니다.

CREATE SPATIAL INDEXTransact-SQL 문은 다양한 수준에서 서로 다른 그리드 밀도를 지정할 수 있는 GRIDS 절을 지원합니다. 지정된 수준의 그리드 밀도는 다음 키워드 중 하나를 사용하여 지정됩니다.

키워드 표 구성 셀 개수
LOW 4X4 16
MEDIUM 8X8 64
HIGH 16X16 256

SQL Server에서 데이터베이스 호환성 수준이 100 이하로 설정된 경우 기본값은 모든 수준에서 MEDIUM입니다. 데이터베이스 호환성 수준이 110 이상으로 설정된 경우에는 기본값이 자동 표 구성표입니다. (자동 표는 HLLLLLLL의 8개 수준 구성을 나타냅니다.) 인덱스 그리드 밀도를 다양하게 하는 대신 힌트를 통해 개체당 셀을 변경하고 개체당 창 셀을 쿼리할 수 있습니다.

기본이 아닌 그리드 밀도를 지정하여 분해 프로세스를 제어할 수 있습니다. 예를 들어 서로 다른 수준의 서로 다른 그리드 밀도는 인덱싱된 공간의 크기와 공간 열의 개체에 따라 인덱스를 미세 조정하는 데 유용할 수 있습니다.

참고 항목

공간 인덱스의 그리드 밀도는 데이터베이스 호환성 수준이 100 이하로 설정된 경우 sys.spatial_index_tessellations 카탈로그 뷰의 level_1_grid, level_2_grid, level_3_grid 및 level_4_grid 열에 표시됩니다. GEOMETRY_AUTO_GRID/GEOGRAPHY_AUTO_GRID 테셀레이션 구성표 옵션은 이러한 열을 채웁니다. sys.spatial_index_tessellations 카탈로그 뷰에는 자동 그리드 옵션이 사용되는 경우 이러한 열에 대한 NULL 값이 있습니다.

테셀레이션

인덱싱된 공간을 그리드 계층 구조로 분해한 후 공간 인덱스가 공간 열에서 행 단위로 데이터를 읽습니다. 공간 개체(또는 인스턴스)에 대한 데이터를 읽은 후 공간 인덱스는 해당 개체에 대한 공간 분할 프로세스를 수행합니다. 테셀레이션 프로세스는 개체를 터치한 그리드 셀 집합(터치된 셀)과 연결하여 개체를 그리드 계층 구조에 맞습니다. 그리드 계층 구조의 수준 1부터 테셀레이션 프로세스는 수준 전체에서 먼저 폭을 진행합니다. 잠재적으로 프로세스는 한 번에 한 수준씩 네 가지 수준을 모두 진행할 수 있습니다.

공간 분할 프로세스의 출력은 개체의 공간 인덱스에 기록되는 터치된 셀 집합입니다. 이러한 기록된 셀을 참조하여 공간 인덱스도 인덱스에 저장된 공간 열의 다른 개체를 기준으로 공간에서 개체를 찾을 수 있습니다.

테셀레이션 규칙

개체에 대해 기록되는 터치된 셀의 수를 제한하기 위해 테셀레이션 프로세스는 여러 테셀레이션 규칙을 적용합니다. 이러한 규칙은 테셀레이션 프로세스의 깊이와 인덱스에 기록되는 터치된 셀을 결정합니다.

이러한 규칙은 다음과 같습니다.

  • 커버링 규칙

    개체가 한 셀을 완전히 포함할 경우 해당 셀은 개체에 의해 포함 되어 있다고 합니다. 덮인 셀이 계산되고 테셀레이션되지 않습니다. 이 규칙은 그리드 계층 구조의 모든 수준에서 적용됩니다. 포함 규칙은 공간 분할 프로세스를 간소화하고 공간 인덱스가 기록하는 데이터의 양을 줄입니다.

  • 개체당 셀 수 규칙

    이 규칙은 수준 1을 제외하고 각 개체에 대해 계산할 수 있는 최대 셀 수를 결정하는 개체당 셀 제한을 적용합니다. 하위 수준에서 개체당 셀 수 규칙은 개체에 대해 기록될 수 있는 정보량을 제어합니다.

  • 가장 깊은 셀 규칙

    가장 깊은 셀 규칙은 개체에 대해 테셀레이션된 최하위 셀만 기록하여 개체의 최적 근사치를 생성합니다. 부모 셀은 개체당 셀 수에 기여하지 않으며 인덱스로 기록되지 않습니다.

이러한 테셀레이션 규칙은 각 그리드 수준에서 재귀적으로 적용됩니다. 이 섹션의 나머지 부분에서는 테셀레이션 규칙에 대해 자세히 설명합니다.

포함 규칙

개체가 셀을 완전히 덮는 경우 해당 셀은 개체로 덮여 있다고 합니다. 예를 들어 다음 그림에서 두 번째 수준 셀 중 하나인 15.11은 팔각형의 중간 부분으로 완전히 덮여 있습니다.

Covering optimization

포함된 셀은 개수가 계산되고 인덱스에 기록되지만 더 이상 공간 분할이 수행되지는 않습니다.

개체당 셀 수 규칙

각 개체의 공간 분할 범위는 주로 공간 인덱스의 개체당 셀 수 제한따라 달라집니다. 이 제한은 테셀레이션이 개체당 개수를 계산할 수 있는 최대 셀 수를 정의합니다. 그러나 개체별 셀 규칙은 수준 1에 적용되지 않으므로 이 제한을 초과할 수 있습니다. 수준 1 개수가 개체당 셀 수 한도에 도달하거나 초과하면 하위 수준에서 더 이상 테셀레이션이 발생하지 않습니다.

개수가 개체당 셀 수 제한보다 작을 경우 테셀레이션 프로세스가 계속됩니다. 이전 그림의 15.6 셀과 같이 가장 낮은 숫자의 터치 셀부터 시작하여 프로세스는 각 셀을 테스트하여 셀 수를 계산할지 아니면 셀을 전매할지 평가합니다. 셀을 테셀레이션하는 경우 개체당 셀 수 제한을 초과하면 셀이 계산되고 테셀레이션되지 않습니다. 그렇지 않은 경우 해당 셀은 공간 분할이 수행되고 개체와 연결된 하위 수준 셀의 개수가 계산됩니다. 공간 분할 프로세스는 전체 수준에서 이런 방식으로 계속 진행됩니다. 이 프로세스는 제한에 도달하거나 더 이상 셀 수를 계산할 수 없을 때까지 테셀레이션된 셀의 하위 수준 표에 대해 재귀적으로 반복됩니다.

예를 들어 수준 1 눈금의 셀 15에 완전히 맞는 팔각형을 보여 주는 앞의 그림을 생각해 보세요. 그림에서 셀 15는 팔각형을 9개의 수준-2 셀로 해부하여 테셀레이션되었습니다. 이 그림에서는 개체당 셀 수 제한을 9개 이상으로 가정합니다. 그러나 개체당 셀 수 제한이 8 이하인 경우 셀 15는 테셀레이션되지 않으며 해당 셀(15)만 개체에 대해 계산됩니다.

기본적으로 개체당 셀 제한은 개체당 16개의 셀로, 대부분의 공간 인덱스에 대해 공간과 정밀도 간에 만족스러운 절차를 제공합니다. 그러나 CREATE SPATIAL INDEXTransact-SQL 문은 1에서 8192 사이의 개체당 셀 제한을 지정할 수 있는 CELLS_PER_OBJECT =n 절을 지원합니다.

참고 항목

공간 인덱스의 cells_per_object 설정은 sys.spatial_index_tessellations 카탈로그 뷰에 표시됩니다.

가장 깊은 셀 규칙

최하위 셀 규칙은 모든 하위 셀이 상위 셀에 속한다는 사실을 활용합니다. 즉, 수준-4 셀은 수준-3 셀에 속하고, 수준-3 셀은 수준-2 셀에 속하며, 수준-2 셀은 수준-1 셀에 속합니다. 예를 들어 1.1.1.1 셀에 속하는 개체도 셀 1.1.1, 셀 1.1 및 셀 1에 속합니다. 이러한 셀 계층 관계에 대한 정보는 쿼리 프로세서에 포함됩니다. 따라서 가장 깊은 수준 셀만 인덱스로 기록하여 인덱스가 저장해야 하는 정보를 최소화해야 합니다.

다음 그림에서는 비교적 작은 다이아몬드형 다각형이 공간 분할되어 있습니다. 이 인덱스는 이 작은 개체에 대해 도달하지 않는 개체당 기본 셀 수 제한인 16을 사용합니다. 따라서 테셀레이션은 수준 4까지 계속됩니다. 다각형은 수준-1에서 수준-3 셀까지 4, 4.4, 4.4.10 및 4.4.14에 위치합니다. 그러나 가장 깊은 셀 규칙을 사용하여 테셀레이션은 4.4.10.13-15 및 4.4.14.1-3, 4.4.14.5-7 및 4.4.14.9-11의 12개 수준-4 셀만 계산합니다.

Deepest-cell optimization

테셀레이션 구성표

공간 인덱스의 동작은 부분적으로 공간 분할 구성표따라 달라집니다. 테셀레이션 구성표는 데이터 형식에 따라 다릅니다. SQL Server에서 공간 인덱스는 다음 두 가지 공간 분할 체계를 지원합니다.

  • 기하 도형 데이터 형식의 구성표인 기하 도형 그리드 테셀레이션입니다.

  • 지리 표 공간 분할geography 데이터 형식의 열에 적용합니다.

참고 항목

공간 인덱스의 tessellation_scheme 설정은 sys.spatial_index_tessellations 카탈로그 뷰에 표시됩니다.

Geometry Grid 테셀레이션 구성표

GEOMETRY_AUTO_GRID 테셀레이션은 SQL Server 2012(11.x) 이상의 기하 도형 데이터 형식에 대한 기본 테셀레이션 구성표입니다. GEOMETRY_GRID 테셀레이션은 SQL Server 2008(10.0.x)에서 기하 도형 데이터 형식에 사용할 수 있는 유일한 테셀레이션 구성표입니다. 이 섹션에서는 공간 인덱스(지원되는 메서드 및 경계 상자) 작업과 관련된 기하 도형 그리드 공간 분할의 측면에 대해 설명합니다.

참고 항목

CREATE SPATIAL INDEX Transact-SQL 문의 USING(GEOMETRY_AUTO_GRID/GEOMETRY_GRID) 절을 사용하여 이 공간 분할 체계를 명시적으로 지정할 수 있습니다.

경계 상자

기하학적 데이터는 무한할 수 있는 평면을 차지합니다. 그러나 SQL Server에서 공간 인덱스에는 한정된 공간이 필요합니다. 분해를 위한 유한 공간을 설정하려면 기하 도형 그리드 공간 분할 구성표에 사각형 경계 상자가 필요합니다. 경계 상자는 (x-min,y-min)(x-max,y-max)라는 4개의 좌표로 정의되며 공간 인덱스의 속성으로 저장됩니다. 이러한 좌표는 다음을 나타냅니다.

  • x-min 은 경계 상자의 왼쪽 아래 모서리의 x 좌표입니다.

  • y-min 은 왼쪽 아래 모서리의 y 좌표입니다.

  • x-max 는 오른쪽 위 모서리의 x 좌표입니다.

  • y-max 는 오른쪽 위 모퉁이의 Y 좌표입니다.

참고 항목

이러한 좌표는 CREATE SPATIAL INDEXTransact-SQL 문의 BOUNDING_BOX 절에 의해 지정됩니다.

(x-min,y-min)(x-max,y-max) 좌표는 경계 상자의 배치 및 크기를 결정합니다. 경계 상자 외부의 공간은 번호가 0인 단일 셀로 처리됩니다.

공간 인덱스는 경계 상자 내부의 공간을 분해합니다. 그리드 계층 구조의 수준 1 그리드가 경계 상자를 채웁니다. 표 계층 구조에 기하학적 개체를 배치하기 위해 공간 인덱스는 개체의 좌표를 경계 상자 좌표와 비교합니다.

다음 그림에서는 경계 상자의 (x-min,y-min)(x-max,y-max) 좌표로 정의되는 지점을 보여 줍니다. 표 계층 구조의 최상위 수준은 4x4 그리드로 표시됩니다. 그림의 목적을 위해 하위 수준은 생략됩니다. 경계 상자 외부의 공간은 0으로 표시됩니다. 개체 'A'는 상자 너머로 부분적으로 확장되며 개체 'B'는 셀 0의 상자 바깥쪽에 완전히 있습니다.

Bounding box showing coordinates and cell 0.

경계 상자는 애플리케이션의 공간 데이터의 일부에 해당합니다. 인덱스의 경계 상자에 공간 열에 저장된 데이터가 완전히 포함되는지 아니면 일부만 포함되는지 여부는 애플리케이션에 달려 있습니다. 경계 상자의 전체 내부에 있는 개체에서 계산된 작업만 공간 인덱스의 이점을 누릴 수 있습니다. 따라서 기하 도형 열의 공간 인덱스에서 가장 큰 이점을 얻으려면 개체의 전부 또는 대부분을 포함하는 경계 상자를 지정해야 합니다.

참고 항목

공간 인덱스의 그리드 밀도는 sys.spatial_index_tessellations 카탈로그 뷰의 bounding_box_xmin, bounding_box_ymin, bounding_box_xmax 및 bounding_box_ymax 열에 표시됩니다.

Geography Grid 테셀레이션 구성표

이 테셀레이션 구성표는 지리 열에만 적용됩니다. 이 섹션에서는 geography 그리드 공간 분할에서 지원하는 메서드를 요약하고 측지 공간이 평면에 프로젝션된 다음 그리드 계층 구조로 분해되는 방법을 설명합니다.

참고 항목

CREATE SPATIAL INDEXTransact-SQL 문의 USING(GEOGRAPHY_AUTO_GRID/GEOGRAPHY_GRID) 절을 사용하여 이 공간 분할 체계를 명시적으로 지정할 수 있습니다.

측지 공간을 평면에 표시

geography 인스턴스(개체)에서의 계산은 개체를 포함하는 공간을 측지 타원면으로 처리합니다. 이 공간을 분해하기 위해 지리 그리드 공간 분할 체계는 타원면의 표면을 상반구와 하반구로 나눈 다음 다음 단계를 수행합니다.

  1. 각 반구를 사분면 피라미드의 면에 투영합니다.

  2. 두 피라미드를 평평하게 합니다.

  3. 평면화된 피라미드를 조인하여 비유클리드 평면을 형성합니다.

다음 그림에서는 3단계 분해 프로세스의 개략적인 뷰를 보여 줍니다. 피라미드에서 점선은 각 피라미드에서 네 면의 경계를 나타냅니다. 1단계와 2단계는 적도 위도 선을 나타내기 위해 녹색 가로 선을 사용하고 여러 경도 선을 나타내는 일련의 녹색 세로선을 사용하여 측지 타원을 보여 줍니다. 1단계는 두 반구에 투영되는 피라미드를 보여줍니다. 2단계에서는 평평해지는 피라미드를 보여 줍니다. 3단계는 평면을 형성하기 위해 결합된 후 평면화된 피라미드를 보여 줍니다. 이러한 투영된 선은 피라미드에 떨어지는 위치에 따라 곧게 펴지고 길이가 달라집니다.

Projection of the ellipsoid onto a plane

공간이 평면에 프로젝션되면 평면은 4단계 그리드 계층 구조로 분해됩니다. 각 수준은 서로 다른 표 밀도를 사용할 수 있습니다. 다음 그림에서는 평면이 4x4 수준-1 그리드로 분해된 후의 평면을 보여 줍니다. 이해하기 쉽도록 하위 수준의 표 계층 구조는 생략됩니다. 실제로 평면은 4-수준 표 계층 구조로 완전히 분해됩니다. 분해 프로세스가 완료되면 지리적 데이터가 지리 열에서 행별로 읽혀지고 각 개체에 대해 테셀레이션 프로세스가 차례로 수행됩니다.

Level-1 geography grid

공간 인덱스에서 지원하는 메서드

공간 인덱스에서 지원하는 기하 도형 메서드

공간 인덱스는 STContains(), STDistance(), STEquals(), STIntersects(), STOverlaps(), STTouches() 및 STWithin()과 같은 특정 조건에서 설정된 기하 도형 메서드를 지원합니다. 공간 인덱스에서 지원하려면 이러한 메서드를 쿼리의 WHERE 또는 JOIN ON 절 내에서 사용해야 하며 다음 일반 형식의 조건자 내에서 발생해야 합니다.

geometry1.method_name(geometry2)comparison_operator**valid_number

null이 아닌 결과를 반환하려면 geometry1geometry2에 SRID(공간 참조 식별자)가 동일해야 합니다. 그렇지 않으면 메서드는 NULL을 반환합니다.

공간 인덱스는 다음 조건자 형식을 지원합니다.

공간 인덱스에서 지원되는 지리 메서드

특정 조건에서 공간 인덱스는 STIntersects(),STEquals() 및 STDistance()와 같은 집합 지향 지리 메서드를 지원합니다. 공간 인덱스에서 지원하려면 이러한 메서드를 쿼리의 WHERE 절 내에서 사용해야 하며 다음 일반 형식의 조건자 내에서 발생해야 합니다.

geography1.method_name(geography2)comparison_operator**valid_number

null이 아닌 결과를 반환하려면 geography1geography2에 SRID(공간 참조 식별자)가 동일해야 합니다. 그렇지 않으면 메서드는 NULL을 반환합니다.

공간 인덱스는 다음 조건자 형식을 지원합니다.

공간 인덱스를 사용하는 쿼리

공간 인덱스는 WHERE 절에 인덱싱된 공간 연산자를 포함하는 쿼리에서만 지원됩니다. 예를 들어 다음과 같은 구문이 있습니다.

[spatial object].SpatialMethod([reference spatial object]) [ = | < ] [const literal or variable]  

쿼리 최적화 프로그램은 공간 작업(해당 @a.STIntersects(@b) = @b.STInterestcs(@a) )의 통근성을 이해합니다. 그러나 비교의 시작 부분에 공간 연산자가 없는 경우 공간 인덱스가 사용되지 않습니다(예: WHERE 1 = spatial op 공간 인덱스를 사용하지 않음). 공간 인덱스를 사용하려면 비교를 다시 작성합니다(예 WHERE spatial op = 1: ).

다른 인덱스와 마찬가지로 공간 인덱스가 지원되는 경우 공간 인덱스의 사용은 비용에 따라 선택되므로 쿼리 최적화 프로그램은 공간 인덱스를 사용하기 위한 모든 요구 사항이 충족되더라도 공간 인덱스를 사용하도록 선택하지 않을 수 있습니다. showplan을 사용하여 공간 인덱스가 사용되었는지 확인하고 필요한 경우 원하는 쿼리 계획을 강제로 적용하기 위한 쿼리 힌트를 제공합니다.

가장 가까운 인접 쿼리 형식은 특정 쿼리 구문을 작성한 경우에만 공간 인덱스를 지원합니다. 적합한 구문은 다음과 같습니다.

SELECT TOP(K) [WITH TIES] *   
FROM <Table> AS T [WITH(INDEX(<SpatialIndex>))]  
WHERE <SpatialColumn>.STDistance(@reference_object) IS NOT NULL  
ORDER BY <SpatialColumn>.STDistance(@reference_object) [;]  

참고 항목

공간 데이터(SQL Server)