0

空間データを使用する非常に単純なテーブル構造があります。

     CREATE TABLE Test
          (
           [ID] int not null,
           [GeoLocation] geometry not null,
     CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED 
     (
         [ID] ASC
     ))  on [PRIMARY]

これは、空間インデックスの DDL です。

CREATE SPATIAL INDEX [IX_GeoLocation_Geo] ON dbo.[Test]
    (
        GeoLocation
    )USING  GEOMETRY_GRID 
    WITH (BOUNDING_BOX =(-180, -90, 180, 90), GRIDS =(LEVEL_1 = MEDIUM,LEVEL_2 = MEDIUM,LEVEL_3 = MEDIUM,LEVEL_4 = MEDIUM), CELLS_PER_OBJECT = 1024, PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

列に主キーがあり、[ID]列に空間インデックスがありGeoLocationます。空間インデックスには、テッセレーション スキーマ " Geometry auto grid " を使用しています。

データベースに数千行しかない場合でも、最近隣を取得するクエリはかなり遅いです。

    SELECT top 15 T.ID
    FROM dbo.TestT --with(index(IX_SpatialData_Geo))
          WHERE T.Geo.Filter(@region) = 1

実際、(空間インデックスの使用を強制する) テーブル ヒントを追加することにより、パフォーマンスが向上する代わりに、クエリのパフォーマンスが低下します :)

ありがとう

4

1 に答える 1

0

BOLによると、述語は空間インデックスでサポートされているものではありません。代わりに試してください:

SELECT top 15 T.ID
FROM dbo.TestT --with(index(IX_SpatialData_Geo))
      WHERE T.Geo.STIntersects(@region) = 1
ORDER BY T.Geo.STDistance(@region)

最も近いものを探している場合はORDER BY、そこに句を入れる必要があることに注意してください。TOPなしは任意です。

于 2013-11-06T17:21:29.763 に答える