0

したがって、私のデータベースには、タイプ BigInt の Id とタイプ Geometry の 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

エラーメッセージが表示されます:

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

私に関する限り、これら 2 つのクエリは基本的に同等です。なぜこれが起こっているのか、2番目のクエリでインデックスを動作させる方法 (または場合) を説明できる人はいますか?

ありがとう

編集: 2 番目が = 0 であり、where 句の =1 ではないことに気付きました。インデックスを = 0 で使用できない理由を知っている人はいますか? (2 番目のクエリは = 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:左結合と null チェックに関する問題の回避策を見つけましたが、誰かが私を啓発できる場合、偽の交差でインデックスを使用できない理由についてまだ興味があります

4

1 に答える 1

1

空間インデックスがこのクエリをサポートできなかったという技術的な理由はありませんが、生成されたクエリ プランは、左アンチ セミ ジョインを使用して自分で実行した場合と本質的に同じです。これをサポートすることも検討されましたが、これを行うには、この述語を照合して正しいクエリ プランを生成するために、クエリ オプティマイザーに追加の変更が必要になります。

したがって、これは一般的なクエリ形式ではなく、自分でインデックスを使用するクエリを作成するのはまだ比較的簡単であるため、このパターンは、空間インデックス でサポートされている述語のリストに含まれていませんでした。

于 2011-02-25T16:39:17.717 に答える