[ОБНОВЛЕНИЕ] Я попробовал определение индекса ниже и получил следующее сообщение об ошибке:
Cannot create primary xml, selective xml or spatial index 'SI_Property' on table 'BTSOne.dbo.Properties', column 'Point', because the column is computed.
Это имеет смысл, но теперь я вернулся к исходной точке.
Причина, по которой я пытаюсь это сделать? Потому что запросы истекают. У меня настроены индексы для всех моих других запросов, кроме пространственных, которые являются основным типом выполняемых запросов.
Я немного запутался в том, для каких столбцов создавать пространственный индекс. Я обеспокоен тем, что в некоторых записях отсутствуют значения долготы и широты (по умолчанию равны нулю), что влияет на столбец точек, столбец индекса. Сначала я думал, что смогу создать индекс для столбца точек, но чтение статей по этому вопросу подсказывает, что я должен использовать несколько столбцов. Чем больше читаю, тем больше запутываюсь. Также есть вопрос правильной настройки сетки. Эмпирическое правило, кажется, устанавливает их на высокий уровень.
Это соответствующие столбцы таблицы:
[Latitude] [float] NULL CONSTRAINT [DF_Properties_Latitude] DEFAULT ((0)),
[Longitude] [float] NULL CONSTRAINT [DF_Properties_Longitude] DEFAULT ((0)),
[Point] AS ([geography]::Point([Latitude],[Longitude],[SRID])),
[SRID] [int] NULL CONSTRAINT [DF_Properties_SRID] DEFAULT ((4326)),
Это соответствующая часть хранимой процедуры:
DECLARE @SearchPoint as geography,
@Region nvarchar(80)
SET @SearchPoint = geography::Point(@Latitude, @Longitude, 4326)
DECLARE @tempTable dbo.WorkingProperties
SELECT [PropertyId] AS "Id", ISNULL([InnCode],'NA') AS "InnCode", [UseName] AS "OfficeName", [Addr1] As "Address", [City]
, [Zip] AS "PostalCode", [CountryCode], [Brand], [BrandCode] ,[Latitude], [Longitude],
([Point].STDistance(@SearchPoint)/1000) AS "Distance",
NULL AS "ProjectType",'Properties' As "Source", [GlobalRMArea]
FROM [BTSOne].[dbo].[Properties]
WHERE [Point].STDistance(@SearchPoint) <= (@intRadiusKm * 1000)
AND OpenStatus = 'Open'
ORDER BY "Distance"
Вот как я бы создал индекс:
CREATE SPATIAL INDEX [SI_Property] ON [BTSOne].[dbo].[Properties]
(
[Point]
)USING GEOGRAPHY_GRID
WITH (GRIDS =(LEVEL_1 = HIGH,LEVEL_2 = HIGH,LEVEL_3 = HIGH,LEVEL_4 = HIGH),
CELLS_PER_OBJECT = 16, PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Я работаю в среде с очень ограниченным доступом, поэтому у меня нет роскоши для слишком большого количества проб и ошибок, и у меня нет прямого доступа к экземпляру сервера sql, поэтому я не хочу изнашивать свои повторные попытки ограничение :-).
Спасибо!