Eu gostaria de encontrar a distância entre 2 conjuntos de coordenadas. Primeiro eu uso a função embutida:
declare @lat1 real = 33.1, @lon1 real =-117.1, @lat1 real = 39.6, @lon1 real =-98.7
declare @source geography = geography::Point(@lat1, @long1, 4326);
declare @target geography = geography::Point(@lat2, @long2, 4326);
select @source.STDistance(@target)
Agora eu uso o cálculo manual para fazer a mesma coisa:
-- Kilometers to Miles: 0.621371, Earth Radius: 6378.137
select 0.621371 * 6378.137 * ACOS(ROUND(
(SIN(PI() * @lat2 /180) * SIN(PI() * @lat1/180))
+ (COS(PI() * @lat2 /180) * COS(PI() * @lat1/180) * COS(PI() * @lon1/180 - PI() * @lon2 /180)), 12))
Em meus testes no SQL Server 2014, a função manual é cerca de 4x mais rápida que a interna. Isso é normal ou estou perdendo algo fundamental?
O SQL Server 2016 melhorou um pouco o desempenho, mas o motivo básico é que STDistance é preciso, mas fórmulas mais simples podem ser mais rápidas, se você entender os erros que elas produzem.
Veja por exemplo a distância geográfica pode ser simples e rápida , e uma descrição do algoritmo usado em STDistance:
Algoritmos geométricos em um modelo de terra elipsóide
por exemplo
saídas