Как я могу ускорить этот Sql Server Spatial запрос? [закрыто]
У меня есть (что я думаю) простой пространственный запрос Sql Server:
Возьмите все штаты США, которые существуют внутри какого-то четырехстороннего многоугольника (т. Е. Область просмотра / ограничивающую рамку карты 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).
Может кто-нибудь, пожалуйста, помогите? Пожалуйста?
UPDATE / EDIT:После первого ответа от @Bobs ниже, подтверждающего, что пространственный индекс не используется, потому что первичный ключ (кластеризованный индекс) будет быстрее, чем некластеризованный индекс в таблице с 50 нечетными строками ... Затем я попытался форсировать Пространственный индекс (для shits-n-giggles): -
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
... и угадайте, что .. запрос выполняется мгновенно.
WTF? Кто-нибудь еще знает почему? Нужно ли публиковать план запроса для этого, чтобы также объяснить, почему / что?