したがって、私のデータベースには、タイプ 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 チェックに関する問題の回避策を見つけましたが、誰かが私を啓発できる場合、偽の交差でインデックスを使用できない理由についてまだ興味があります