查询空间索引无响应

时间:2012-10-07 19:19:57

标签: sql-server tsql spatial-index

我有一个数据库坐在SQL Server 2008上,其中包含大约120亿行,包含lat,lon和相应的地理字段。我最近需要添加查询地理字段的功能。我添加了空间索引,花了6天时间处理超过4TB的数据。

CREATE SPATIAL INDEX IX_Location_Geo ON Location
(
    Geo
) USING  GEOGRAPHY_GRID 
WITH (
    GRIDS =(LEVEL_1 = MEDIUM,LEVEL_2 = MEDIUM,LEVEL_3 = MEDIUM,LEVEL_4 = MEDIUM), 
    CELLS_PER_OBJECT = 16, PAD_INDEX  = OFF, SORT_IN_TEMPDB = OFF, 
    DROP_EXISTING = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON PRIMARY
GO

使用查询添加意图......

SELECT TOP 100 
    ci.LocationID, ci.Geo.STDistance(@g)  
FROM Location ci WITH(INDEX(IX_Location_Geo))
WHERE ci.Geo.Filter(@region) = 1 
ORDER BY ci.Geo.STDistance(@g)

这是估算执行计划......

Execution Plan

我在100毫米行的样本集上测试了这个查询,并且它工作得非常好。但是在12个帐单行上,查询在大约4小时后没有响应,最后因磁盘写入错误而失败,这很奇怪,因为磁盘没有使用5TB。

Msg 1101, Level 17, State 10, Line 4 Could not allocate a new page 
for database 'TEMPDB' because of insufficient disk space in filegroup 
'DEFAULT'. Create the necessary space by dropping objects in the filegroup, 
adding additional files to the filegroup, or setting autogrowth on for 
existing files in the filegroup.

希望有人可能会看到我明显的疏忽。非常感谢!

2 个答案:

答案 0 :(得分:1)

不使用 vertical 可扩展性(增加更多内存,CPU,硬盘空间 - 制作一台强大的机器)而是考虑使用水平可扩展性(在许多商用服务器之间分配负载) )。任何操作都需要时间和空间。 Big-O表示法描述,对于任何花费时间超过O(N)的计算,您根本无法计算这样的卷。这就是为什么从高层次来看,您会收到错误并有足够的时间来完成查询。

可能的解决方案

更改数据访问模式。使用分片 - 将数据拆分为较小的块。广泛使用WHERE子句和Skip/Take分页模式(我不确定T-SQL中的正确语法)。还有Map-Reduce模式引起了轰动。简而言之,在 音量时垂直停止缩放。

答案 1 :(得分:0)

您发布的错误消息显示tempdb的磁盘空间已用尽,而不是主数据库。所以你可以为它提供空间,但SQL Server应该首先消耗这么多!所以这不是一个解决方案。

请发布估计的执行计划(因为您无法获得实际计划)。我将根据我对计划的看法更新这个答案。

作为一般性评论:调试查询性能问题通常从计划开始,因为它告诉您SQL Server在执行时执行的操作。