2011-02-10 11 views
0

그래서 내 데이터베이스에는 BigInt 유형의 ID와 Geometry 유형의 Geometry가있는 테이블이 있습니다. 내가 쿼리를 시도 할 때공간 데이터베이스, 이상한 인덱스 동작

DECLARE @Geometry geometry 
SET @Geometry = geometry::Parse('Polygon((300000 300000, 300000 325000, 325000 325000, 325000 300000, 300000 300000))') 
SELECT Id FROM [Database].[dbo].[Table] WITH(index(idx_Geometry)) WHERE Geometry.STIntersects(@Geometry) = 1 

DECLARE @Geometry geometry 
SET @Geometry = geometry::Parse('Polygon((300000 300000, 300000 325000, 325000 325000, 325000 300000, 300000 300000))') 
SELECT a.Id FROM [Database].[dbo].[Table] a with(Index(idx_Geometry)) WHERE a.Geometry.STIntersects(@Geometry) = 0 

내가 오류 메시지가 : 기하학 필드는 인덱스를 사용하여 예상대로 다음 쿼리는 작품 idx_Geometry

라는 공간 인덱스가

쿼리 프로세서가 쿼리에 대한 쿼리 계획을 생성하지 못했습니다. a 공간 인덱스 힌트. 이유 : Spatial 인덱스는 술어에 제공된 comparand 을 지원하지 않습니다. 색인 힌트를 제거하거나 SET FORCEPLAN을 제거해보십시오.

이 두 쿼리는 기본적으로 동일합니다. 아무도 왜 이런 일이 일어 났는지 설명 할 수 있고 두 번째 쿼리와 함께 작동하도록 인덱스를 얻는 방법 (또는)을 설명 할 수 있습니까? 편집

감사

: 인덱스 = 0을 사용할 수없는 이유 절, 사람이 알고 어디에서 = 0이 아니라 = 1
그냥 두 번째를 발견했다?

편집 2 (2 쿼리 = 1 일) : 편집 3

DECLARE @Geometry geometry 
SET @Geometry = geometry::Parse('Polygon((300000 300000, 300000 325000, 325000 325000, 325000 300000, 300000 300000))') 

--Works 
SELECT Id FROM [RoadRoutingDatabase].[dbo].[Node] WITH(index(idx_Geometry)) WHERE Geometry.STIntersects(@Geometry) = 1 
SELECT a.Id FROM [RoadRoutingDatabase].[dbo].[Node] a with(Index(idx_Geometry)) WHERE a.Geometry.STIntersects(@Geometry) = 1 

--Gives Error Message 
SELECT Id FROM [RoadRoutingDatabase].[dbo].[Node] WITH(index(idx_Geometry)) WHERE Geometry.STIntersects(@Geometry) = 0 
SELECT a.Id FROM [RoadRoutingDatabase].[dbo].[Node] a with(Index(idx_Geometry)) WHERE a.Geometry.STIntersects(@Geometry) = 0 

--Works but doesn't use Index 
SELECT Id FROM [RoadRoutingDatabase].[dbo].[Node] WHERE Geometry.STIntersects(@Geometry) = 0 
SELECT a.Id FROM [RoadRoutingDatabase].[dbo].[Node] a WHERE a.Geometry.STIntersects(@Geometry) = 0 

하지 않습니다 어떤 작품과 어떤 그냥 갱신 : 나는 내 문제에 대한 주위에 작품을 발견 왼쪽 조인과 null 체크를 사용하지만 누군가가 나를 계몽 할 수 있다면 잘못된 교차점에 대한 인덱스를 사용할 수없는 이유에 대해 여전히 궁금합니다.

답변

1

공간적 인덱스가이 쿼리를 지원할 수없는 기술적 인 이유는 없지만 생성 된 쿼리 계획은 본질적으로 그것을 수행하는 것과 동일합니다. 왼쪽 안티 세미 조인 f. 이를 지원하는 것은 고려되었지만이 조건자를 일치시키고 올바른 쿼리 계획을 생성하기 위해 쿼리 최적화 프로그램을 추가로 변경해야합니다.

이것은 일반적인 쿼리 모양이 아니며 인덱스를 직접 사용하도록 쿼리를 작성하는 것이 상대적으로 쉽기 때문에이 패턴은 공간 인덱스의 경우 list of supported predicates에 포함되지 않았습니다.

+0

Intersect 쿼리는 기본적으로 쿼리 결과가 서로 다르다는 것을 이해하지 못합니다. 힌트를 사용할 수 있는지 여부는 왜 영향을 미치나요? – Manatherin