所以,我的數據庫有一個類型爲BigInt的Id和幾何類型爲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
我得到的錯誤信息:
查詢處理器無法爲查詢生成 查詢計劃一個 空間索引提示。原因:空間 索引不支持謂詞中提供的比較數 。嘗試刪除索引提示 或刪除 SET FORCEPLAN。
就我而言,這兩個查詢基本上是等價的。任何人都可以解釋爲什麼會發生這種情況,以及如何(或如果)我可以使索引與第二個查詢一起工作?
感謝
編輯:只注意到第二次是= 0,沒有1 =在where子句中,任何人都知道爲什麼索引不能= 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只是一個更新:我已經找到了工作,圍繞我的問題與左連接和空檢查,但我仍然好奇,爲什麼你不能使用虛假相交索引,如果任何人都可以啓發我
雖然我不明白,是不是相交查詢基本上一樣,只是查詢結果不同而異,爲什麼這個效果是否可以使用提示 – Manatherin 2011-02-28 12:36:09