【发布时间】:2011-03-22 00:38:49
【问题描述】:
我有(我认为)是一个简单的 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
...猜猜看..查询会立即运行。
WTF?其他人知道为什么吗?我是否还需要为此发布查询计划以帮助解释原因/内容?
【问题讨论】:
标签: sql-server-2008 performance spatial spatial-index