根据 SQL Profiler,我的繁琐查询需要 3 秒才能返回,并且需要大量读取。为什么?
我有一张表,里面有 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,它需要 12,203 的 CPU 和 1,218,873 的读取。这些似乎是使用索引的巨大数字。
为什么这么慢?为什么这需要从硬盘驱动器读取这么多?我能做些什么来提高这个性能?
查看查询计划,下面屏幕截图中的过滤器运算符是查询成本的 34%。
“Clustered Index Seek”运算符占查询的 63%。