【问题标题】:Spatial database, strange index behavior空间数据库,奇怪的索引行为
【发布时间】:2011-02-10 13:59:49
【问题描述】:

所以,我的数据库有一个 Id 类型为 BigInt 和 Geometry 类型为 Geometry 的 Table。 Geometry 字段有一个名为 idx_Geometry 的空间索引

以下查询使用索引按预期工作:

DECLARE @Geometry geometry
SET @Geometry = geometry::Parse('Polygon((300000 300000, 300000 325000, 325000 325000, 325000 300000, 300000 300000))')
SELECT Id FROM [Database].[dbo].[Table] WITH(index(idx_Geometry)) WHERE Geometry.STIntersects(@Geometry) = 1

但是当我尝试查询时

DECLARE @Geometry geometry
SET @Geometry = geometry::Parse('Polygon((300000 300000, 300000 325000, 325000 325000, 325000 300000, 300000 300000))')
SELECT a.Id FROM [Database].[dbo].[Table] a with(Index(idx_Geometry)) WHERE a.Geometry.STIntersects(@Geometry) = 0

我收到错误消息:

查询处理器无法生成 查询的查询计划 空间索引提示。原因:空间 索引不支持比较 在谓词中提供。尝试 删除索引提示或删除 设置强制计划。

就我而言,这两个查询基本上是等价的。谁能解释为什么会发生这种情况以及我如何(或是否)可以使索引与第二个查询一起使用?

谢谢

编辑:刚刚注意到第二个是= 0,而不是where子句中的= 1,有人知道为什么索引不能与= 0一起使用吗? (第二个查询使用 = 1)

编辑 2: 只是更新哪些有效,哪些无效

DECLARE @Geometry geometry
SET @Geometry = geometry::Parse('Polygon((300000 300000, 300000 325000, 325000 325000, 325000 300000, 300000 300000))')

--Works
SELECT Id FROM [RoadRoutingDatabase].[dbo].[Node] WITH(index(idx_Geometry)) WHERE Geometry.STIntersects(@Geometry) = 1
SELECT a.Id FROM [RoadRoutingDatabase].[dbo].[Node] a with(Index(idx_Geometry)) WHERE a.Geometry.STIntersects(@Geometry) = 1 

--Gives Error Message
SELECT Id FROM [RoadRoutingDatabase].[dbo].[Node] WITH(index(idx_Geometry)) WHERE Geometry.STIntersects(@Geometry) = 0
SELECT a.Id FROM [RoadRoutingDatabase].[dbo].[Node] a with(Index(idx_Geometry)) WHERE a.Geometry.STIntersects(@Geometry) = 0

--Works but doesn't use Index
SELECT Id FROM [RoadRoutingDatabase].[dbo].[Node] WHERE Geometry.STIntersects(@Geometry) = 0
SELECT a.Id FROM [RoadRoutingDatabase].[dbo].[Node] a WHERE a.Geometry.STIntersects(@Geometry) = 0 

编辑 3: 我找到了解决左连接和空值检查问题的方法,但我仍然很好奇为什么你不能在假相交上使用索引,如果有人可以的话赐教

【问题讨论】:

    标签: tsql sql-server-2008 spatial spatial-index


    【解决方案1】:

    空间索引不支持此查询没有技术原因,但是生成的查询计划与使用左反半联接自己执行基本相同。考虑支持这一点,但这样做涉及对查询优化器的额外更改,以匹配此谓词并生成正确的查询计划。

    因此,鉴于这不是一种常见的查询形式,并且自己编写查询以使用索引仍然相对容易,因此该模式未包含在空间索引的list of supported predicates 中。

    【讨论】:

    • 我还是不明白,Intersect 查询是不是基本一样,只是查询结果的检查不一样,为什么会影响到提示能不能用
    猜你喜欢
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    相关资源
    最近更新 更多