私が持っているのは(私が思うに)単純なSQLServer空間クエリです:
いくつかの4辺のポリゴン(つまり、Webページのグーグル/ビングマップのビューポート/バウンディングボックス)内に存在するすべての米国の州を取得します。
SELECT CAST(2 AS TINYINT) AS LocationType, a.Name AS FullName,
StateId, a.Name, Boundary.STAsText() AS Boundary,
CentrePoint.STAsText() AS CentrePoint
FROM [dbo].[States] a
WHERE @BoundingBox.STIntersects(a.Boundary) = 1
実行には6秒かかります:(
これが実行計画です。
削除
そして、フィルター操作の統計...
削除
さて、これをデバッグする方法がわかりません..微調整する必要があるものを理解するためなど。空間インデックスはありますか?そう信じる ...
/****** Object: Index [SPATIAL_States_Boundary]
Script Date: 07/28/2010 18:03:17 ******/
CREATE SPATIAL INDEX [SPATIAL_States_Boundary] ON [dbo].[States]
(
[Boundary]
)USING GEOGRAPHY_GRID
WITH (
GRIDS =(LEVEL_1 = HIGH,LEVEL_2 = HIGH,LEVEL_3 = HIGH,LEVEL_4 = HIGH),
CELLS_PER_OBJECT = 1024, PAD_INDEX = OFF, SORT_IN_TEMPDB = OFF,
DROP_EXISTING = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
GEOGRAPHY
返されるデータについてさらに情報を提供する必要がありますか?例えば。ポイント数など?または、実行profiler
してそこからいくつかの統計を提供する必要がありますか?
または、Cells_per_object / Gridsが正しく設定されていません(これらの値をTBHに設定する必要があるかどうかは本当にわかりません)。
誰か助けてもらえますか?お願いします?
更新/編集:
以下の@Bobsからの最初の応答の後、主キー(クラスター化インデックス)が50の奇数行を持つテーブルの非クラスター化インデックスよりも高速であるため、空間インデックスが使用されていないことを確認しました...次に、強制的に空間インデックス(shits-n-giggles用):-
SELECT CAST(2 AS TINYINT) AS LocationType, a.Name AS FullName,
StateId, a.Name, Boundary.STAsText() AS Boundary,
CentrePoint.STAsText() AS CentrePoint
FROM [dbo].[States] a WITH (INDEX(SPATIAL_States_Boundary))
WHERE @BoundingBox.STIntersects(a.Boundary) = 1
...そして..クエリが即座に実行されるものを推測します。
WTF?他の誰かが理由を知っていますか?また、理由/内容を説明するために、そのクエリプランを投稿する必要がありますか?