Ошибка пространственного индекса Azure SQL Server Не удается создать, потому что вычисляется столбец

[ОБНОВЛЕНИЕ] Я попробовал определение индекса ниже и получил следующее сообщение об ошибке:

  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, поэтому я не хочу изнашивать свои повторные попытки ограничение :-).

Спасибо!


person Will Lopez    schedule 06.04.2015    source источник


Ответы (1)


К пространственным индексам нужно немного привыкнуть, но как только вы это сделаете, они станут довольно простыми.

Во-первых, пространственные индексы можно создавать ТОЛЬКО для пространственных столбцов, т. е. столбцов типа GEOMETRY или GEOGRAPHY. В вашем случае у вас есть один столбец «[Point]», поэтому это единственный столбец, который вы должны и можете индексировать.

При выполнении запросов, включающих пространственные данные, сгенерированный план запроса обычно очень эффективен, поскольку он использует пространственный индекс для этой части предложения WHERE и другие непространственные индексы для других частей предложения WHERE.

Что касается уровней сетки, это может быть методом проб и ошибок, к сожалению, поскольку в конечном итоге это зависит от ваших данных. Однако, когда вы начинаете играть с настройками, я часто обнаруживаю, что вы экономите только миллисекунды - в большинстве случаев. Начните как у вас в HHHH с 16 ячейками на объект. Если вы недовольны результатами, проверьте план запроса, чтобы убедиться, что он используется, и, если это так, настройте его.

Если вы действительно хотите понять пространственные индексы, я рекомендую вам ознакомиться с «Pro Spatial with SQL Server 2012» Алистара Эйтчисона. Это настоящая библия по использованию пространственных данных в SQL, и Алистер проделал с ней фантастическую работу.

person Jon Bellamy    schedule 06.04.2015
comment
@WillLopez Хорошо, но на данный момент ваш выбор довольно очевиден. Либо смиритесь с низкой производительностью и сохраните вычисляемый столбец, либо сделайте его невычисляемым и пользуйтесь преимуществами пространственного индекса. Как вы вводите данные в таблицу? Лучшее решение — отредактировать вставку так, чтобы она обрабатывала вычисление столбца Point, а не использовать его как вычисляемый столбец. - person Jon Bellamy; 07.04.2015
comment
@Jon_Bellamy Я тебя слышу. Я попробую это. - person Will Lopez; 09.04.2015