2015-11-11 9 views
4

Мы сохранили данные географии в таблице «Местоположение» и на основе этого столбца мы находим ближайшее местоположение для данного ввода. Ниже запрос используется для получения ближайших местоположений в пределах 25 миль, и этот запрос занимает более 4 секунд для извлечения 4000 записей. Мы даже создали пространственный индекс в поле местоположения.Как оптимизировать таблицу sql, содержащую столбец географии

DECLARE @Distance INT 

SET @Distance =25 

DECLARE @h sys.GEOGRAPHY 

SET @h =CONVERT(sys.GEOGRAPHY, 0xE6100000010C92B06F27119D4140111AC1C6F53554C0) 

SELECT CenterLocationId, 
     [Location].Stdistance(@h) * Cast(0.000621371 AS FLOAT(53)) AS Distance 
FROM [dbo].[CenterLocation] 
WHERE [Location].Stdistance(@h) * Cast(0.000621371 AS FLOAT(53)) <= @Distance 
     AND IsDeleted = 0 
ORDER BY [Location].Stdistance(@h) * Cast(0.000621371 AS FLOAT(53)) 

Может ли кто-нибудь предложить, как улучшить производительность этого запроса в SQL Server 2014?

+0

Попробуйте перевернуть стол? посмотрите, помогает ли это? – User2012384

+0

Я не очень уместен с географическими данными, но это может помочь сделать предварительный выбор (например, CTE) во всех местах в ** квадратной области ** (простые математические данные ...) вашего расстояния и выполнить только тяжелый расчет для пунктов в этой области? – Shnugo

+0

Избегайте использования запросов UDF в запросах. Конечно, вы должны делать это иногда, но они увеличивают время выполнения ненормально. Итак, у вас есть пространственный индекс в этом столбце, это нормально. Вам нужно избавиться от таких функций, как «бросок» и этот множитель. Мой совет - создать столбец, в котором будет храниться этот FLOAT. Кроме того, если вы всегда используете Stdistance * 0.000621371, вы можете рассмотреть возможность создания столбца PERSISTED. – Amel

ответ

2

Две вещи, не гарантированные для исправления проблемы, но, безусловно, могут помочь. Они оба связаны:

SELECT CenterLocationId, 
     [Location].Stdistance(@h) * Cast(0.000621371 AS FLOAT(53)) AS Distance 
FROM [dbo].[CenterLocation] 
WHERE [Location].Stdistance(@h) <= @Distance/Cast(0.000621371 AS FLOAT(53)) 
     AND IsDeleted = 0 
ORDER BY [Location].Stdistance(@h) 

То есть, предпочитает не выполнять математику в предложении о выражениях, которые зависят от значений столбца WHERE - вы заставляете сервер для выполнения, что математика для каждой строки и уничтожая любые возможности для использования индекса.

Точно так же бессмысленно выполнять умножение в предложении ORDER BY, поскольку умножение (на положительное число) не изменяет порядок.

Смежные вопросы