2016-12-21 10 views
1

StContains 함수를 사용하여 두 개의 지형 열을 비교하고 싶지만 쿼리 속도가 느려지고 30-40 초 후에 성능이 크게 향상됩니다.STContains를 사용하여 지리 열을 비교하면 SQL Server에서 쿼리 속도가 느려집니다.

나는 쿼리 아래 사용하고 있습니다 : 여기

SELECT DISTINCT 
      T.[LocationID], G.[Boundary].STContains(ESP.GeographyValue) 
    FROM [#TempTable] T 
    CROSS JOIN [dbo].[GeographyTable] G 
    INNER JOIN [dbo].LocationTable ESP ON T.LocationID = ESP.LocationID 
    WHERE G.[ID] = 1 

모두 경계GeographyValue 지리 데이터 유형입니다.

G. [경계] .ST가 포함되어 있습니다. (ESP.GeographyValue) 다음 쿼리는 0 초에 실행되므로 주 성능 문제는 StContains 때문입니다.

결과 집합에 7000 레코드이 포함되어있을 수 있습니다.

업데이트 :

나는 두 열에 공간 인덱스를 추가 한 여전히 실행 속도가 느립니다. 나는 또한 STContains을 시도

select ES.* from LocationTable ES INNER JOIN GeographyTable G ON ES.GeographyValue.STEquals(G.Boundary) = 1 Where G.Id = 1 

하지만 여전히 행운 : 간단한 쿼리를 실행하여 10 쿼리 아래 사용 secs.I 걸립니다.

+1

는 7000 개 서로 다른 위치를 비교해야이 쿼리의 목적은 무엇인가를 검토? 공간 비교는 복잡하고 리소스 집약적이므로 잠시 시간을 할애 할 수 있으며 7000 개를 수행하고 있습니다! Geography 열에 공간 색인이 있습니까? – iamdave

+0

사용자가 UI를 선택할 수있는 지리 목록이 있는데 지리 테이블과 일치하는 위치를 비교하려고합니다. LocationTable이 다른 데이터베이스에 있으므로 GeographyTable ID 열을 추가 할 수 없습니다. 공간 인덱스가 두 테이블 모두에 없습니다. 추가 할 테이블과 방법을 안내 할 수 있습니까? –

+0

공간적 색인이 공간적 열로 이동합니다 ... 사용자가 UI를 통해 * 하나 * 지리를 선택하는 경우 왜 모두 7000을 비교합니까? 그들이 선택한 것을 비교하십시오. – iamdave

답변

2

강제 코드는 모양을

SELECT DISTINCT 
      T.[LocationID], G.[Boundary].STContains(ESP.GeographyValue) 
    FROM [#TempTable] T 
    CROSS JOIN [dbo].[GeographyTable] G WITH (INDEX(SI_Geofence_Boundary)) 
    INNER JOIN [dbo].LocationTable ESP ON T.LocationID = ESP.LocationID 
    WHERE G.[ID] = 1 

그것은 2~3초 30 ~ 40 초에서 실행 시간을 줄일 수 코드 아래 [dbo].[GeographyTable] G WITH (INDEX(SI_Geofence_Boundary))

수정 된 쿼리를 사용하여 공간 인덱스를 사용합니다. 자세한 내용은

link