2011-02-10 8 views
0

私のデータベースには、BigInt型のIdとGeometry型の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 

をしようとすると、しかし、私はエラーメッセージを取得:

クエリプロセッサがクエリのクエリプランを で生成できませんでした。 a 空間インデックスヒント。理由:Spatial インデックスは述語で指定されたcomparand をサポートしていません。インデックスヒントを削除するか、 SET FORCEPLANを削除してみてください。

私の知る限り、これらの2つのクエリは基本的に同等です。誰もがこれが起こっている理由を説明することができますし、2番目のクエリでインデックスを取得する方法(またはその場合)を得ることができますか?

おかげで

編集:ただ、インデックス= 0で使用することはできません、なぜ誰もが知っている、WHERE句ではない= 1、秒1 = 0気づきましたか?

編集2(第二クエリは= 1で動作します):ただ、どのような作品の更新と何んではない

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

空間インデックスがこのクエリをサポートできないという技術的な理由はありません。生成されたクエリプランは本質的にそれをあなたと同じにするでしょう左アンチ・セミ・ジョイントでf。これをサポートしていましたが、これを行うには、この述部と一致して正しい照会プランを生成するためにQuery Optimizerに追加の変更が必要です。

これは一般的なクエリシェイプではなく、インデックスを自分で使用するためにクエリを書くのは比較的簡単ですが、このパターンは空間インデックスのlist of supported predicatesには含まれていません。

+0

私は理解できませんが、Intersectクエリは基本的に同じクエリ結果のチェックとは違うのですが、なぜヒントを使用できるかどうかに影響します – Manatherin