SQL Timeout Geography Query

Я получаю случайное / прерывистое время ожидания SQL для этого запроса, похоже, что оно генерирует много обработки из простого запроса. Это правильное поведение?

У меня есть простая хранимая процедура, как это:

CREATE PROCEDURE [dbo].[FindClosestXNearCoordinates]
      @latitude decimal,
      @longitude decimal
   AS
BEGIN

SET NOCOUNT ON;
declare @emptyGUID uniqueidentifier
set @emptyGUID = cast(cast(0 as binary) as uniqueidentifier)
declare @radiusInMeters float
set @radiusInMeters = 3500 * 1609.344   
declare @coordinatePoint as Geography   
SET @coordinatePoint = geography::STGeomFromText('POINT(' + CAST(@longitude AS VARCHAR(20)) + ' ' + CAST(@latitude AS VARCHAR(20)) + ')', 4326)
declare @coordinateRadius as Geography
set @coordinateRadius = @coordinatePoint.STBuffer(@radiusInMeters);


select  top 1   [b].[BaseId], [b].[Code], [b].[Name], [b].[Location], [b].[TerritoryId], [b].[Latitude], [b].[Longitude]
from        XTable b
where       ( b.GeoLocation.STIntersects(@coordinateRadius) = 1 )
order by b.GeoLocation.STDistance(@coordinatePoint) asc

END

Я записываю его в SQL Profiler, и он показывает запрос и более 188 операторов подряд, что действительно сбивает с толку, потому что когда я запускаю это в SSMS, он просто показывает 1 выполнение, но при выполнении в приложении генерируется 188 под-операторов.

1 ответ

Решение

Сначала SQL Profiler. Поскольку пространственные типы являются чем-то особенным для SQL-сервера, они требуют дополнительной обработки. Он регистрирует SP:Starting и SP: Завершенные записи много раз для одного и того же оператора TSQL, поскольку он может сообщать только об операции на уровне TSQL. Вам просто придется с этим жить. То же самое в SQL Server 2012.

Что касается времени ожидания вашего запроса, я бы предложил заменить STIntersect() более элементарным тестом, создав условие

where (b.longitude between @longitude-@xdelta and @longitude+@xdelta)
  and (b.latitude between @latitude-@ydelta and @latitude-@ydelta)
order by b.GeoLocation.STDistance(@coordinatePoint) asc

И ключом будет выяснить подходящую @xdelta путем преобразования метров в десятичное значение. Конверсия ускользает от меня в данный момент, но Google - ваш друг. Вы даже можете добавить STIntersect (буфер), если он вам действительно нужен.

Другие вопросы по тегам