私のデータベースには、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:は、私は私の問題の回避策を発見しました左結合とヌルチェックを使用していますが、誰かが私を啓蒙できれば、誤った交差でインデックスを使用できない理由についてはまだ不思議です
私は理解できませんが、Intersectクエリは基本的に同じクエリ結果のチェックとは違うのですが、なぜヒントを使用できるかどうかに影響します – Manatherin