我有(我认为)是一个简单的 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 奇数行的表上的非聚集索引更快......然后我试图强制空间索引(对于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
...猜猜是什么..查询立即运行。
怎么回事?其他人知道为什么吗?我是否需要为此发布一个查询计划,以帮助解释为什么/什么?