가장 인접한 항목의 공간 데이터 쿼리
적용 대상: SQL Server Azure SQL 데이터베이스 SQL Managed Instance
공간 데이터와 함께 사용되는 일반적인 쿼리는 가장 인접한 항목 쿼리입니다. 가장 인접한 항목 쿼리는 특정 공간 개체에 가장 가까운 공간 개체를 찾는 데 사용됩니다. 예를 들어 웹 사이트의 매장 위치는 고객 위치에서 가장 가까운 저장소 위치를 찾아야 하는 경우가 많습니다.
가장 인접한 항목 쿼리는 다양한 유효한 쿼리 형식으로 작성할 수 있지만 가장 인접한 항목 쿼리에서 공간 인덱스를 사용하려면 다음 구문을 사용해야 합니다.
구문
SELECT TOP ( number )
[ WITH TIES ]
[ * | expression ]
[, ...]
FROM spatial_table_reference, ...
[ WITH
(
[ INDEX ( index_ref ) ]
[ , SPATIAL_WINDOW_MAX_CELLS = <value>]
[ ,... ]
)
]
WHERE
column_ref.STDistance ( @spatial_ object )
{
[ IS NOT NULL ] | [ < const ] | [ > const ]
| [ <= const ] | [ >= const ] | [ <> const ] ]
}
[ AND { other_predicate } ]
}
ORDER BY column_ref.STDistance ( @spatial_ object ) [ ,...n ]
[ ; ]
가장 인접한 항목 쿼리 및 공간 인덱스
SQL Server에서 TOP 및 ORDER BY 절은 공간 데이터 열에서 가장 인접한 항목 쿼리를 수행하는 데 사용됩니다. ORDER BY 절은 공간 열 데이터 형식의 STDistance()
메서드에 대한 호출을 포함합니다. TOP 절은 쿼리에 대해 반환할 개체의 수를 나타냅니다.
가장 인접한 항목 쿼리에서 공간 인덱스를 사용하려면 다음 요구 사항을 충족해야 합니다.
공간 인덱스는 공간 열 중 하나에 있어야 하며
STDistance()
메서드는 WHERE 및 ORDER BY 절에서 해당 열을 사용해야 합니다.TOP절에 PERCENT 문이 포함되지 않아야 합니다.
WHERE절에는
STDistance()
메서드가 포함되어야 합니다.WHERE 절에 조건자가 여러 개 있는 경우
STDistance()
메서드를 포함하는 조건자는 다른 조건자와 AND 결합으로 연결되어야 합니다.STDistance()
메서드가 WHERE 절의 선택적 파트에 있을 수는 없습니다.ORDER BY 절의 첫 번째 식은
STDistance()
메서드를 사용해야 합니다.ORDER BY 절의 첫 번째
STDistance()
식에 대한 정렬 순서는 ASC여야 합니다.STDistance
이(가) NULL을 반환하는 모든 행을 필터링해야 합니다.
Warning
geography 또는 geometry 데이터 형식을 인수로 사용하는 메서드는 이 두 데이터 형식의 SRID가 서로 동일하지 않은 경우 NULL을 반환합니다.
가장 인접한 항목 쿼리에서 사용되는 인덱스에 새 공간 인덱스 공간 분할을 사용하는 것이 좋습니다. 공간 인덱스 공간 분할에 대한 자세한 내용은 공간 데이터(SQL Server)를 참조하세요.
예 1
다음 코드 예제에서는 공간 인덱스를 사용할 수 있는 가장 인접한 항목 쿼리를 보여주고 있습니다. 다음 예에서는 AdventureWorks2022
예제 데이터베이스의 Person.Address
테이블을 사용합니다.
USE AdventureWorks2022
GO
DECLARE @g geography = 'POINT(-121.626 47.8315)';
SELECT TOP(7) SpatialLocation.ToString(), City FROM Person.Address
WHERE SpatialLocation.STDistance(@g) IS NOT NULL
ORDER BY SpatialLocation.STDistance(@g);
SpatialLocation 열에 공간 인덱스를 만들어 가장 인접한 항목 쿼리에서 공간 인덱스를 사용하는 방법을 확인합니다. 공간 인덱스를 만드는 방법은 공간 인덱스 만들기, 수정 및 드롭을 참조하십시오.
예제 2
다음 코드 예제에서는 공간 인덱스를 사용할 수 없는 가장 인접한 항목 쿼리를 보여주고 있습니다.
USE AdventureWorks2022
GO
DECLARE @g geography = 'POINT(-121.626 47.8315)';
SELECT TOP(7) SpatialLocation.ToString(), City FROM Person.Address
ORDER BY SpatialLocation.STDistance(@g);
이 쿼리에는 구문 섹션에서 지정한 형식의 STDistance()
을(를) 사용하는 WHERE절이 부족하므로 쿼리에서 공간 인덱스를 사용할 수 없습니다.