2011-02-10 49 views
0

所以,我的數據庫有一個類型爲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只是一個更新:我已經找到了工作,圍繞我的問題與左連接和空檢查,但我仍然好奇,爲什麼你不能使用虛假相交索引,如果任何人都可以啓發我

回答

1

沒有技術上的原因空間索引不能支持這個查詢,但是生成的查詢計劃基本上與做yoursel一樣f用左反半連接。考慮支持這一點,但這樣做需要對查詢優化器進行其他更改才能匹配此謂詞並生成正確的查詢計劃。

因此,鑑於這不是一個常見的查詢形狀,並且編寫查詢以自己使用索引仍然相對容易,因此該模式未包含在空間索引的list of supported predicates中。

+0

雖然我不明白,是不是相交查詢基本上一樣,只是查詢結果不同而異,爲什麼這個效果是否可以使用提示 – Manatherin 2011-02-28 12:36:09