В моей базе данных есть каталог из примерно 2000 местоположений, разбросанных по всей территории Соединенных Штатов с информацией о zipcode (которую я привязал к координатам lon/lat).SQL Cross Apply Performance Issues
У меня также есть табличную функцию, которая принимает два параметра (ZipCode & Miles) возвращает список соседних почтовых индексов (за исключением такой же почтовый индекс искали)
Для каждого места я пытаюсь получить соседнее расположение идентификаторы. Так что, если место # 4 имеет три места рядом, выход должен выглядеть следующим образом:
То есть, мест 5, 24 и 137 находится в пределах X миль от места 4.
первоначально я пытался использовать перекрестный применять с моей функцией следующим образом:
SELECT A.SL_STORENUM,A.Sl_Zip,Q.SL_STORENUM FROM tbl_store_locations AS A
CROSS APPLY (SELECT SL_StoreNum FROM tbl_store_locations WHERE SL_Zip in (select zipnum from udf_GetLongLatDist(A.Sl_Zip,7))) AS Q
WHERE A.SL_StoreNum='04'
Однако это продолжалось более 20 минут без каких-либо результатов, поэтому я отменил его. Я действительно пытался жестко прописывать в почтовом индексе и он сразу же вернулся список
SELECT A.SL_STORENUM,A.Sl_Zip,Q.SL_STORENUM FROM tbl_store_locations AS A
CROSS APPLY (SELECT SL_StoreNum FROM tbl_store_locations WHERE SL_Zip in (select zipnum from udf_GetLongLatDist('12345',7))) AS Q
WHERE A.SL_StoreNum='04'
Что является наиболее эффективным способом достижения этого списка близлежащих мест? Помня, что в качестве примера здесь я использовал «04», я хочу запустить анализ для 2000 местоположений.
«udf_GetLongLatDist» - это функция, которая использует некоторую математику для вычисления расстояния между двумя географическими координатами и возвращает список zipcodes с расстоянием> 0. Ничто не кажется в нем.
Компонентный комментарий, не связанный напрямую с вашим вопросом, но мы обнаружили, что centroid lat/long для почтовых индексов часто были довольно далеки от места в почтовом индексе, где большинство людей проживает, когда это был сельский почтовый индекс. Таким образом, мы использовали две позиции: zipcode centroid lat/long и lat/long основного города/города, связанные с zipcode. Почтовый индекс считался близким, если любое из этих двух местоположений находилось в пределах x миль от целевого местоположения. – hatchet