У меня есть (что я думаю) простой пространственный запрос Sql Server:
Захватите все штаты США, которые существуют внутри какого-либо 4-стороннего многоугольника (т. е. окна просмотра/ограничивающей рамки карты google/bing веб-страницы)
SELECT CAST(2 AS TINYINT) AS LocationType, a.Name AS FullName,
StateId, a.Name, Boundary.STAsText() AS Boundary,
CentrePoint.STAsText() AS CentrePoint
FROM [dbo].[States] a
WHERE @BoundingBox.STIntersects(a.Boundary) = 1
Запуск занимает 6 секунд :(
Вот план выполнения....
Удалено
А статистика работы фильтра...
Удалено
Теперь я просто не знаю, как это отладить ... чтобы выяснить, что мне нужно для точной настройки и т. Д. Есть ли у меня какие-либо пространственные индексы? Я так считаю ...
/****** Object: Index [SPATIAL_States_Boundary]
Script Date: 07/28/2010 18:03:17 ******/
CREATE SPATIAL INDEX [SPATIAL_States_Boundary] ON [dbo].[States]
(
[Boundary]
)USING GEOGRAPHY_GRID
WITH (
GRIDS =(LEVEL_1 = HIGH,LEVEL_2 = HIGH,LEVEL_3 = HIGH,LEVEL_4 = HIGH),
CELLS_PER_OBJECT = 1024, PAD_INDEX = OFF, SORT_IN_TEMPDB = OFF,
DROP_EXISTING = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Нужно ли мне предоставлять дополнительную информацию о возвращаемых данных GEOGRAPHY
? например. количество баллов и т.д.? Или мне нужно запустить profiler
и вывести оттуда статистику?
Или мои Cells_per_object / Grids установлены неправильно (я действительно понятия не имею, что мне следует устанавливать для этих значений, TBH).
Кто-нибудь может помочь? Пожалуйста?
ОБНОВЛЕНИЕ/РЕДАКТИРОВАТЬ:
После первого ответа @Bobs ниже, подтверждающего, что пространственный индекс не используется, потому что первичный ключ (кластеризованный индекс) будет быстрее, чем некластеризованный индекс в таблице с 50 нечетными строками... Затем я попытался принудительно Пространственный индекс (для дерьма и хихиканья): -
SELECT CAST(2 AS TINYINT) AS LocationType, a.Name AS FullName,
StateId, a.Name, Boundary.STAsText() AS Boundary,
CentrePoint.STAsText() AS CentrePoint
FROM [dbo].[States] a WITH (INDEX(SPATIAL_States_Boundary))
WHERE @BoundingBox.STIntersects(a.Boundary) = 1
... и угадайте, что... запрос выполняется мгновенно.
ВТФ? Кто-нибудь еще знает, почему? Нужно ли мне опубликовать план запроса для этого, чтобы помочь объяснить, почему/что?