2012-05-29 5 views
1

나는 centroids를 내부에 들어 맞는 다각형과 일치 시키려고 시도하는 커다란 쿼리를 가지고 있습니다. 블록과 폴리곤의 Z 값에 의해 제약을받는 반면, 여전히 lot of point-in-poly 계산을 수행하며 실행 시간은 입니다. 몇 가지 배경에 대한이점을 제공하지 않는 공간 인덱스

:

  • 무게 중심을 포함하는 테이블은 테이블에 250 행
  • 공간 데이터의 모두가 세계의 아주 작은 영역의 경계 상자에 전체 일에만 7643 X 2,351m 해당 행의
  • , 660K 적합 일치 다각형을 포함하는 테이블이 10K 행
  • 테이블의 공간 데이터의 모두가
  • 는 EV에있는 Z의 critera입니다 세계 그 행의
  • 의 작은 영역 엉, 2366 일치하는 이름 기준에 어떤 인덱스없이 쿼리를 실행
  • 11 시간이 소요 및 91K는 쿼리가이 같은 것입니다

일치 반환

select blocks.Id, blocks.WGS84Centroid, polygons.Shape 
from 
blocks inner join polygons 
    on 
    blocks.ZCentre >= (polygons.ZCentre - (polygons.ZLength/2)) and blocks.ZCentre <= (polygons.ZCentre + (polygons.ZLength/2)) and 
    polygons.Shape.STIntersects(blocks.WGS84Centroid) = 1 
inner join name 
    on 
    polygons.nameId = name.ID 
where name.Name = 'blah' 

이 쿼리의 속도를 높이기 위해 blocks.WGS84Centroid에 공간 인덱스를 추가하고 polygons.Shape에 공간 인덱스를 추가했습니다.
쿼리 분석기는 blocks.Id 및 blocks.WGS84Centroid를 포함하여 블록 .ZCentre에 클러스터되지 않은 인덱스를 제안했습니다.
SSMS query plan

을 그리고 필터 비용 :

모든 그 후, 여기에 쿼리 계획이다
SSMS filter cost

그러나 이러한 3 인덱스를 추가 한 후 쿼리가 여전히 오래 실행하는 데 걸리는.
지금 무엇을 할 수 있습니까?

+0

통계를 업데이트 했습니까? –

+0

@DavidBrabant : 색인이 새로 작성되었습니다. 도움이 될지 의심 스럽네. – Coxy

+0

사실 WITH (INDEX (CentroidSpatialIndex))를 사용하여 쿼리 분석기를 힌트하려고하면 클러스터 된 인덱스 검색에 /! \ 아이콘이 표시됩니다. CREATE STATISTICS를 실행하려고했지만 'dbo.blocks'테이블의 'WGS84Centroid'열이 인덱스 또는 통계에서 키 열로 사용할 수없는 유형입니다. – Coxy

답변

0

공간 인덱스가별로 도움이되지 않는 이유는 아마도 지구의 작은 영역에서 데이터의 밀도와 관련이 있다고 생각합니다.
저는 이것을 약간 실험 해봤습니다. 가능한 한 인덱스의 밀도가 가장 높은 것으로 보입니다.

SQL Server 2008에서는 4 가지 수준의 공간 인덱스 그리드 모두에서 HIGH를 사용합니다. 이 인덱스를 사용하여 옵티 마이저에게 힌트를 표시하여 10 시가 아니라 ~ 1 시까 지 조인을 무효화했습니다! SQL 서버 2012 년

나는 다른 몇 가지 흥미로운 측면을 발견
첫 번째는 지리 객체 중 하나가 내 경우처럼, 점의 경우 STIntersects()가 더 나은 최적화되어 있다는 점이다. 내 컴퓨터에서 동일한 질의가 2008 년과 마찬가지로 두 번 빠른 2012 년에 실행되었습니다.

두 번째는 훨씬 더 인상적입니다! 2012 년 새로운 유형의 공간 인덱스는 최대 8 레벨의 테셀레이션을 사용합니다. 필자는 고밀도 데이터가 이전의 4 레벨 인덱스가 아닌 새로운 인덱스를 사용하라는 암시를 받았을 때 같은 쿼리가 45 배 빠르게 실행 되었기 때문에 인덱스의이 기하학적으로 높은 수준의 테셀레이션에 특히 적합하다고 생각합니다.

관련 문제