위성 데이터에서 시간 필드 (평균 julian 날짜의 경우 mjd)와 지리 위치 (GeoPoint, spacial)가있는 두 개의 지구 측정 세트가 있으며 두 세트 간의 시간이 임계 값과 일치하도록 두 세트 사이의 일치를 찾고 있습니다 3 시간 (또는 .125 일) 및 거리 200km 이내
테이블과 공간 테이블 모두에서 mjd 필드에 대한 인덱스를 만들었습니다.
시간 제약 조건에 합류하면 데이터베이스는 8 초 동안 100,000 개의 일치 항목을 계산하고 해당 시간의 100,000 개의 일치 항목에 대한 거리를 계산합니다. 쿼리는 다음과 같습니다.
select top 100000 h.Time, m.Time, h.GeoPoint.STDistance(m.GeoPoint)/1000.0
from L2V5.dbo.header h join L2.dbo.MLS_Header m
on h.mjd between m.mjd-.125 and m.mjd+.125
option( table hint ( h, index(ix_MJD) ), table hint( m, index(ix_MJD) ) )
실행 계획은 다음과 같습니다.
정렬하면 거리 중 9 거리가 200km 미만이므로 일치합니다. 문제는 거리 제한을 추가하고 대신 실행하면
select top 10 h.Time, m.Time, h.GeoPoint.STDistance(m.GeoPoint)/1000.0
from L2V5.dbo.header h join L2.dbo.MLS_Header m
on h.mjd between m.mjd-.125 and m.mjd+.125
and h.GeoPoint.STDistance(m.GeoPoint)<200000
option( table hint ( h, index(ix_MJD) ), table hint( m, index(ix_MJD) ) )
오랫동안 사라집니다. 분명히 8 초 안에 10 만 시간 일치를 발견 할 수 있었으며 그 중 9 개는 200km 미만 이었으므로 최적화 프로그램은 차선책을 시도해야합니다. 계획은 거리에 대한 필터를 사용하여 위와 비슷하게 보입니다 (추측입니다).
다음과 같이 공간 인덱스를 강제로 사용할 수 있습니다.
select top 5 h.Time, m.Time, h.GeoPoint.STDistance(m.GeoPoint)/1000.0
from L2V5.dbo.header h join L2.dbo.MLS_Header m
on h.GeoPoint.STDistance(m.GeoPoint)<200000
and h.mjd between m.mjd-.125 and m.mjd+.125
option( table hint ( h, index(ix_MJD), index(ix_GeoPoint) ), table hint( m, index(ix_MJD) ) )
그런 다음 5 개의 일치 항목을 찾는 데 3 분이 걸립니다.
쿼리 최적화 프로그램에 먼저 MJD 인덱스 검색을 사용하고 나서 공간 인덱스에 두 번째 (또는 이미 수행중인 작업)를 사용하도록 지시하고 예상 할 일치 항목 수를 알려주는 방법이 있습니까? 200km 미만에서 거리가 9 초인 거리에서 8 초 동안 100,000 개의 일치 항목을 계산할 수 있다면 공간 인덱스를 추가해도 속도가 느려지지 않아야합니까?
다른 팁이나 아이디어를 주셔서 감사합니다.
편집 : 힌트없이 계획이 어떻게 보이는지 질문에 대답하려면 다음과 같이하십시오 (영원히 걸립니다).
한 테이블에는 거의 1M의 레코드가 있고 다른 테이블에는 8M의 레코드가 있다고 언급 할 가치가 있습니다.