【问题标题】:Query on spatial index not responding查询空间索引无响应
【发布时间】:2012-10-07 19:19:56
【问题描述】:

我有一个位于 SQL Server 2008 上的数据库,其中包含约 120 亿行,所有行都包含纬度、经度和相应的地理字段。我最近需要添加对地理字段的查询功能。我添加了空间索引,处理超过 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.

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

【问题讨论】:

  • 我将开始寻找 5TB RAID-0 的 SSD :)
  • 请发布“一般错误”消息。可能会有所帮助。
  • 查询计划是什么样的?具体来说,它们与您的小型数据集和大型数据集有何不同?
  • @usr - 错误是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.
  • @BenThul - 似乎因为大数据的错误,执行计划永远不会完成。

标签: sql-server tsql spatial-index


【解决方案1】:

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

可能的解决方案

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

【讨论】:

  • 好建议。我喜欢分片的想法。考虑到 SQL 似乎可以很好地处理 1 亿,我也许可以将索引分解为许多较小的数据库。我会做一个测试,看看有什么效果。
【解决方案2】:

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

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

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

【讨论】:

  • 你能把 .sqlplan XML 上传到某个地方吗?问题似乎是在@region上过滤得到的中间结果集太大了。试试这个:msdn.microsoft.com/en-us/library/ff929109.aspx(尝试添加一个具有一定最大距离的 where 条件)。
猜你喜欢
  • 1970-01-01
  • 2016-04-21
  • 2014-11-12
  • 1970-01-01
  • 2014-05-30
  • 2011-09-23
  • 2018-11-23
  • 2011-08-26
  • 1970-01-01
相关资源
最近更新 更多