【发布时间】: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