Настройка пространственных индексов SQL Server

В настоящее время у меня есть две таблицы, города и списки, в обеих есть поле «Позиция», и это пространственное поле. Мой вопрос: правильно ли я настроил свои индексы или мне нужно добавить/удалить некоторые из них? Для городов я не показываю их на карте, я использую только один запрос, который относится к городам, и это i возьмите широту / долготу, и я получу 50 ближайших городов, и для списков я также сделаю ближайшие и покажу их на карте, как я делаю здесь

http://tinyurl.com/on9454y

Для обеих таблиц у меня есть 2 индекса, каждый из которых установлен следующим образом.

256 ЧЧЧЧ

/****** Object:  Index [Position_Index]    Script Date: 1/25/2015 3:56:50 PM ******/
CREATE SPATIAL INDEX [Position_Index] ON [dbo].[Listings]
(
[Position]
)USING  GEOGRAPHY_GRID 
WITH (GRIDS =(LEVEL_1 = HIGH,LEVEL_2 = HIGH,LEVEL_3 = HIGH,LEVEL_4 = HIGH), 
CELLS_PER_OBJECT = 256, 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

16 ЧЧЧЧ

/****** Object:  Index [Spatial_Index]    Script Date: 1/25/2015 3:58:23 PM ******/
CREATE SPATIAL INDEX [Spatial_Index] ON [dbo].[Listings]
(
[Position]
)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-сервера 2012


person Zoinky    schedule 25.01.2015    source источник


Ответы (2)


Вам нужен только один из индексов для поля «Позиция» в каждой таблице. Наличие 2 является избыточным и снизит производительность с точки зрения того, что любая база данных, записывающая в эти поля, должна будет обновлять оба. Вам нужно иметь индекс в обеих таблицах, так как вы ищете ближайшие точки как в городах, так и в списках.

Что касается того, с чего начать, это зависит от того, используете ли вы точки или области.

Для областей (т.е. не только точек) вы должны начать с 16 ячеек на объект, поскольку согласно MSDN

По умолчанию ограничение на число ячеек на объект составляет 16 ячеек на объект, что обеспечивает удовлетворительный компромисс между пространством и точностью для большинства пространственных индексов.

Я бы применил это к городам и посмотрел, как работает ваш запрос. Если неудовлетворительно, увеличьте его (возможно, просто продолжайте удваивать), пока не увидите никакого прироста производительности. Я предполагаю, что 16 должно работать для вас нормально по причине, изложенной выше, но это будет очень специфично для данных. Опять же, это будет иметь значение только в том случае, если вы не используете баллы.

Если ваши данные содержат только баллы (что кажется вероятным в вашей ситуации, по крайней мере, для листингов), то значение CPO не имеет значения, и вы должны получить очень хорошую производительность, установив каждый уровень на ВЫСОКИЙ, как вы уже сделали. Из статьи здесь:

В случае точечных данных было обнаружено, что в большинстве, если не во всех случаях, пространственные индексы со всеми уровнями сетки, установленными на ВЫСОКИЙ, превосходят другие конфигурации. Поскольку мы имеем дело с точечными данными, параметр CELLS_PER_OBJECT не имеет значения и может быть установлен на любое допустимое значение (1-8192) без каких-либо последствий.

использованная литература

Я настоятельно рекомендую прочитать эти статьи, если вы еще этого не сделали:

person Madison    schedule 31.01.2015
comment
Что вам нужно знать о самих данных, я могу предоставить больше информации, чтобы получить более точный ответ - person Zoinky; 31.01.2015
comment
Некоторые данные, которые могут помочь: (1) Сколько примерно городов и как часто вы добавляете дополнительные? То же самое для списков. (2) Являются ли ваши географические столбцы просто точками или более сложными областями? (3) Как часто запрашиваются эти данные? (4) Насколько велика площадь, которую вы планируете охватить? Мир? Один округ? Где то посередине? - person Madison; 03.02.2015
comment
У меня есть 2 области (2 сайта), 1 охватывает мир примерно с 145 тысячами городов и 900 тысячами списков, и новые никогда не добавляются, этот список очень статичен и может обновляться раз в год. 2. Я освещаю Канаду и города, и новые списки добавляются ежедневно, иногда после добавления города с 1000 списков, иногда с несколькими городами. - person Zoinky; 03.02.2015
comment
@Madision ты получил награду? я забыл установить его, если нет, дайте мне знать, что сделать, чтобы убедиться, что вы его получите - person Zoinky; 18.02.2015
comment
Я не делал, так как срок его действия истек, но ничего страшного. Просто надеюсь, что это сработает для вас. - person Madison; 24.02.2015
comment
Как я могу поднять это с помощью модов, чтобы вы это поняли? - person Zoinky; 25.02.2015
comment
meta.stackexchange.com/questions/ 95039/ - person Madison; 25.02.2015

Я согласен с тем, что сказал Мэдисон. Хотя я бы добавил, что большинство запросов требуют подсказки для использования пространственного индекса, например:

SELECT *
FROM geoTable WITH (INDEX (spatial_index))
WHERE geoColumn.STDistance(@g) < 100

Однако помните, что если вы выполняете несколько объединений и/или предложений where, использующих пространственный индекс, на самом деле это может быть не быстрее, чем сканирование, поэтому протестируйте оба сценария для разных случаев.

Если ваши таблицы довольно большие (1 миллион строк и более), пространственные индексы будут работать медленнее. Подумайте о том, чтобы разделить их на отдельные таблицы по штатам или странам, поскольку вы не можете разделить эти индексы.

person simon_dmorias    schedule 05.02.2015