Sql server 对空间索引的查询没有响应

Sql server 对空间索引的查询没有响应,sql-server,tsql,spatial-index,Sql Server,Tsql,Spatial Index,我在SQLServer2008上有一个数据库,大约有120亿行,都包含lat、lon和相应的地理字段。我最近需要添加查询地理字段的功能。我添加了空间索引,处理超过4TB的数据需要6天 CREATE SPATIAL INDEX IX_Location_Geo ON Location ( Geo ) USING GEOGRAPHY_GRID WITH ( GRIDS =(LEVEL_1 = MEDIUM,LEVEL_2 = MEDIUM,LEVEL_3 = MEDIUM,LEVE

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

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)
这是估计执行计划

我在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.
希望有人能看到我明显的疏忽。非常感谢

>使用垂直可扩展性(添加更多内存、CPU、硬盘空间-制造单个Beffy机器),而不是考虑使用水平可伸缩性(许多商品服务器之间的拆分负载)。任何操作都需要时间和空间。Big-O表示法描述,对于任何花费时间超过
O(N)
的计算,您注定要计算出这样的体积。这就是为什么从较高的层次上看,您会遇到错误,并且需要花费大量时间来完成查询

可能的解决方案


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

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

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


作为一般性意见:调试查询性能问题通常从计划开始,因为它会告诉您SQL Server在执行时做了什么。

我将在获得5TB RAID-0 SSD后开始查找:)请发布“一般错误”消息。可能会有帮助。查询计划是什么样子的?具体来说,它们与您的小数据集和大数据集有何不同?@usr-错误是
Msg 1101,级别17,状态10,第4行无法为数据库“TEMPDB”分配新页面,因为文件组“DEFAULT”中的磁盘空间不足。通过删除文件组中的对象、向文件组添加其他文件或为文件组中的现有文件设置“自动增长”来创建必要的空间。
@BenThul-似乎由于大数据上的错误,执行计划永远不会完成。好的提示。我喜欢切分的想法。考虑到SQL似乎可以处理1亿个数据库,我可能能够将索引分解为许多较小的数据库。我将做一个测试,看看什么是有效的。你能把.sqlplan XML上传到什么地方吗?问题似乎是在
@region
上过滤得到的中间结果集太大。尝试以下操作:(尝试添加具有特定最大距离的where条件)。