공간 인덱스 개요
적용 대상: Microsoft Fabric의 SQL ServerAzure SQL Database Azure SQL Managed Instance SQL 데이터베이스
SQL Server 에서는 공간 데이터 및 공간 인덱스를 지원합니다. 공간 인덱스는 공간 열을 인덱싱할 수 있는 확장 인덱스의 형식입니다. 공간 열은 geometry 또는 geography와 같은 공간 데이터 형식의 데이터를 포함하는 테이블 열입니다.
팁
SQL Server 공간 도구는 SQL Server의 공간 유형과 함께 사용할 수 있는 Microsoft에서 후원하는 오픈 소스 도구 컬렉션입니다. 이 프로젝트는 애플리케이션에서 사용할 수 있는 재사용 가능한 함수 집합을 제공합니다. 이러한 함수에는 데이터 변환 루틴, 새 변환, 집계 등이 포함될 수 있습니다. 자세한 내용은 GitHub의 Microsoft/SQLServerSpatialTools를 참조하세요.
공간 인덱스 정보
인덱싱된 공간을 표 계층 구조로 분해
SQL Server에서 공간 인덱스는 B-트리를 사용하여 구성됩니다. 즉, 인덱스가 2차원 공간 데이터를 B-트리의 선형 순서로 나타내야 한다는 뜻입니다. 따라서 데이터를 공간 인덱스로 읽기 전에 SQL Server는 공간의 계층적 균일 분해를 구현합니다. 인덱스 생성 프로세스는 공간을 4 수준 표 계층 구조로 분해합니다. 이러한 수준은 수준 1(최상위 수준), 수준 2, 수준 3 및 수준 4라고 합니다.
각 연속 수준은 그 위의 수준을 더 분해하므로 각 상위 수준 셀은 하위 수준의 전체 표를 포함합니다. 지정된 수준에서 모든 표는 두 축(예: 4x4 또는 8x8)을 따라 동일한 수의 셀을 가지며 셀은 모두 하나의 크기입니다.
다음 그림에서는 표 계층 구조의 각 수준에서 오른쪽 위 셀의 분해를 4x4 표로 보여 줍니다. 실제로 모든 셀은 이러한 방식으로 분해됩니다. 따라서 예를 들어 공간을 4x4 표의 4개 수준으로 분해하면 실제로 총 65,536개의 수준-4 셀이 생성됩니다.
참고 항목
공간 인덱스의 공간 분해는 애플리케이션 데이터가 사용하는 측정 단위와 독립적입니다.
표 계층 구조 셀은 Hilbert 공간 채우기 곡선의 변형을 사용하여 선형 방식으로 번호가 매겨집니다. 그러나 이 글에서는 설명을 위해 실제로 Hilbert 곡선에 의해 생성되는 번호 매기기 대신 간단한 행 단위 번호 매기기를 사용합니다. 다음 그림에서는 건물을 나타내는 여러 다각형과 거리를 나타내는 선이 이미 4x4 수준-1 표에 배치되었습니다. 수준-1 셀은 왼쪽 위 셀부터 시작하여 1부터 16까지 번호가 매겨집니다.
표 밀도
표의 축을 따라 있는 셀 수에 따라 해당 밀도가 결정됩니다 밀도 숫자가 클수록 표가 더 조밀합니다. 예를 들어 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 카탈로그 뷰의 evel_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은 팔각형의 중간 부분으로 완전히 포함되어 있습니다.
포함된 셀은 개수가 계산되고 인덱스에 기록되지만 더 이상 공간 분할이 수행되지는 않습니다.
개체당 셀 수 규칙
각 개체의 공간 분할 범위는 주로 공간 인덱스의 개체당 셀 수 제한에 따라 달라집니다. 이 제한은 공간 분할이 개체당 계산할 수 있는 최대 셀 수를 정의합니다. 그러나 개체당 셀 규칙은 수준 1에 적용되지 않으므로 수준 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 셀만 계산합니다.
공간 분할(Tessellation) 구성표
공간 인덱스의 동작은 부분적으로 공간 분할 구성표에 따라 달라집니다. 공간 분할 구성표는 데이터 형식에 따라 다릅니다. SQL Server에서 공간 인덱스는 다음 두 가지 공간 분할 체계를 지원합니다.
기하 표 공간 분할은 geometry 데이터 형식용 구성표 입니다.
지리 표 공간 분할은 geography 데이터 형식의 열에 적용합니다.
참고 항목
공간 인덱스의 tessellation_scheme 설정은 sys.spatial_index_tessellations 카탈로그 뷰에 표시됩니다.
기하 표 공간 분할 구성표
GEOMETRY_AUTO_GRID 공간 분할은 SQL Server 2012(11.x) 이상의 geometry 데이터 형식에 대한 기본 공간 분할 구성표입니다. GEOMETRY_AUTO_GRID 공간분할은 SQL Server 2008(10.0.x) 에서만 사용 가능한 geometry 데이터 형식에 대한 기본 공간 분할 구성표입니다. 이 섹션에서는 공간 인덱스(지원되는 메서드 및 경계 상자) 작업과 관련된 geometry 표 공간 분할의 측면에 대해 설명합니다.
참고 항목
CREATE SPATIAL INDEX 문의 USING (GEOMETRY_AUTO_GRID/GEOMETRY_GRID) 절을 사용하여 이 공간 분할 구성표를 명시적으로 지정할 수 있습니다.
경계 상자
기하학적 데이터는 무한할 수 있는 평면을 차지합니다. 그러나 SQL Server에서 공간 인덱스는 제한된 공간을 필요로 합니다. 분해를 위한 유한 공간을 설정하려면 geometry 그리드 공간 분할 구성표에 사각형 경계 상자가 필요합니다. 경계 상자는 (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의 상자 바깥쪽에 있습니다.
경계 상자는 애플리케이션의 공간 데이터의 일부에 해당합니다. 인덱스의 경계 상자에 공간 열에 저장된 데이터가 완전히 포함되는지 아니면 일부만 포함되는지 여부는 애플리케이션에 달려 있습니다. 완전히 경계 상자 내부에 있는 개체에서 컴퓨팅된 작업만 공간 인덱스를 활용할 수 있습니다. 따라서 geometry 열의 공간 인덱스에서 가장 큰 이점을 얻으려면 개체의 전부 또는 대부분을 포함하는 경계 상자를 지정해야 합니다.
참고 항목
공간 인덱스의 표 밀도는 sys.spatial_index_tessellations 카탈로그 뷰의 bounding_box_xmin, bounding_box_ymin, bounding_box_xmax 및 bounding_box_ymax 열에 표시됩니다.
지리 표 공간 분할 구성표
공간 분할 구성표는 geography 열에만 적용합니다. 이 섹션에서는 geography 표 공간 분할에서 지원하는 메서드를 요약하고 측지 공간이 평면에 프로젝션된 다음 표 계층 구조로 분해되는 방법을 설명합니다.
참고 항목
CREATE SPATIAL INDEX 문의 USING (GEOGRAPHY_AUTO_GRID/GEOGRAPHY_GRID) 절을 사용하여 이 공간 분할 구성표를 명시적으로 지정할 수 있습니다.
측지 공간을 평면에 표시
geography 인스턴스(개체)에서의 계산은 개체를 포함하는 공간을 측지 타원면으로 처리합니다. 이 공간을 분해하기 위해 geography 그리드 공간 분할 체계는 타원면의 표면을 상반구와 하반구로 나눈 후 다음 단계를 수행합니다.
각 반구를 사분면 피라미드의 면에 투영합니다.
두 피라미드를 평평하게 합니다.
평면화된 피라미드를 조인하여 비유클리드 평면을 형성합니다.
다음 그림에서는 3단계 분해 프로세스의 개략적인 뷰를 보여 줍니다. 피라미드에서 점선은 각 피라미드에서 네 면의 경계를 나타냅니다. 1단계와 2단계는 적도 위도 선을 나타내기 위해 녹색 가로 선을 사용하고 여러 경도 선을 나타내는 일련의 녹색 세로선을 사용하여 측지 타원을 보여 줍니다. 1단계는 두 반구에 투영되는 피라미드를 보여줍니다. 2단계에서는 평평해지는 피라미드를 보여 줍니다. 3단계에서는 평평해진 피라미드를 결합하여 평면을 형성한 것에 투영된 경도선의 수를 보여줍니다. 이러한 투영된 선은 피라미드에 떨어지는 위치에 따라 곧게 펴지고 길이가 달라집니다.
공간이 평면에 투영되면 평면은 4단계 그리드 계층 구조로 분해됩니다. 각 수준은 서로 다른 표 밀도를 사용할 수 있습니다. 다음 그림에서는 평면이 4x4 수준-1 그리드로 분해된 후의 평면을 보여 줍니다. 이해하기 쉽도록 하위 수준의 표 계층 구조는 생략됩니다. 실제로 평면은 4-수준 표 계층 구조로 완전히 분해됩니다. 분해 프로세스가 완료되면 지리적 데이터가 geography 열에서 행별로 읽혀지고 각 개체에 대해 공간 분할 프로세스가 차례로 수행됩니다.
공간 인덱스에서 지원하는 메서드
공간 인덱스에서 지원하는 기하학 메서드
공간 인덱스는 STContains(), STDistance(), STEquals(), STIntersects(), STOverlaps(), STTouches() 및 STWithin()과 같은 특정 조건에서 설정된 geography 메서드를 지원합니다. 공간 인덱스에서 지원하는 이러한 메서드를 쿼리의 WHERE 또는 JOIN ON 절 내에서 사용해야 하며 다음 일반 형식의 조건자 내에서 발생해야 합니다.
geometry1.method_name(geometry2)comparison_operator**valid_number
null이 아닌 결과를 반환하려면 geometry1 및 geometry2에 SRID(공간 참조 식별자)가 동일해야 합니다. 그렇지 않은 경우 메서드는 NULL을 반환합니다.
공간 인덱스는 다음 조건자 형식을 지원합니다.
geometry1.STContains(geometry2)= 1
geometry1.STDistance(geometry2) <number
geometry1.STDistance(geometry2) <= number
geometry1.STEquals(geometry2)= 1
geometry1.STIntersects(geometry2)= 1
geometry1. STOverlaps (geometry2) = 1
geometry1.STTouches(geometry2) = 1
geometry1.STWithin(geometry2)= 1
공간 인덱스에서 지원되는 지리 메서드
공간 인덱스는 특정 조건에서 다음과 같은 STIntersects(),STEquals(), and STDistance() 세트 지향 geometry 메서드를 지원합니다. 공간 인덱스에서 지원하는 이러한 메서드를 쿼리의 WHERE 절 내에서 사용해야 하며 다음 일반 형식의 조건자 내에서 발생해야 합니다.
geometry1.method_name(geometry2)comparison_operator**valid_number
null이 아닌 결과를 반환하려면 geography1 및 geography2에 SRID(공간 참조 식별자)가 동일해야 합니다. 그렇지 않은 경우 메서드는 NULL을 반환합니다.
공간 인덱스는 다음 조건자 형식을 지원합니다.
geography1.STIntersects(geography2)= 1
geography1.STEquals(geography2)= 1
geography1.STDistance(geography2) <number
geography1.STDistance(geography2) <= number
공간 인덱스를 사용하는 쿼리
공간 인덱스는 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
).
다른 인덱스와 마찬가지로 공간 인덱스가 지원되는 경우 공간 인덱스의 사용은 비용에 따라 선택되므로 쿼리 최적화 프로그램은 공간 인덱스 사용을 위한 모든 요구 사항이 충족되더라도 공간 인덱스 사용을 선택하지 않을 수 있습니다. 실행 계획을 사용하여 공간 인덱스가 사용되었는지 확인하고 필요한 경우 원하는 쿼리 계획을 강제로 적용하기 위한 쿼리 힌트를 제공합니다.
가장 인접한 항목의 쿼리 형식은 특정 쿼리 구문을 작성한 경우에만 공간 인덱스를 지원합니다. 적합한 구문은 다음과 같습니다.
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) [;]