私の些細なクエリは戻るのに3秒かかり、SQLプロファイラーによると大量の読み取りが必要です。なんで?
すべてジオコーディングされたポイントである5,000,000のアカウントで満たされたテーブルがあります。すべてのアカウントは、都市から半径20マイル以内に集まっています。私のインデックスはそのように見えます。
CREATE SPATIAL INDEX [IX_CI_Geocode] ON [dbo].[CustomerInformation]
(
[Geocode]
)USING GEOGRAPHY_GRID
WITH (
GRIDS =(LEVEL_1 = HIGH,LEVEL_2 = HIGH,LEVEL_3 = HIGH,LEVEL_4 = LOW),
CELLS_PER_OBJECT = 128, PAD_INDEX = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
次のような単純なクエリを実行すると、次のようになります。
DECLARE @g geography = geography::Point(41.848039, -87.96361, 4326);
DECLARE @region geography = @g.STBuffer(5000);
select count(0) from CustomerInformation ci WITH(INDEX(IX_CI_Geocode))
where ci.Geocode.STIntersects(@region) = 1
戻るには3秒かかり、SQL Server Profilerによると、CPUは12,203、読み取りは1,218,873でした。これらは、インデックスを使用するための膨大な数のようです。
なぜこれがとても遅いのですか?なぜこれはハードドライブからの読み取りをそれほど必要とするのですか?これのパフォーマンスを向上させるために何ができますか?
クエリプランを見ると、下のスクリーンショットのFilter演算子は、クエリのコストの34%です。
「ClusteredIndexSeek」演算子は、クエリの63%です。