我有一个性能查询最近的商店:SQL服务器:地理搜索性能 - 查询最近的商店
我们有一个包含一个全国各地的50,000条记录(商店/销售位置点)的表。
每条记录都使用此语法
CREATE SPATIAL INDEX [LOCATION_geoIndex]
ON [dbo].[StoreLocations] ([LOCATION_geo])
USING GEOGRAPHY_GRID
WITH (
GRIDS =(LEVEL_1 = MEDIUM,LEVEL_2 = MEDIUM,LEVEL_3 = MEDIUM,LEVEL_4 = MEDIUM),
CELLS_PER_OBJECT = 16, PAD_INDEX = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
我有一个存储过程返回
[LOCATION_geo] [geography]
性能也是我创建空间索引在该位置列类型“地理”的location
列用户当前位置最近的1000家商店。
USE [CompanyDB]
GO
SET STATISTICS TIME ON;
GO
declare @point geography;
set @point = geography::Point(49.2471855, -123.1078987, 4326);
SELECT top (1000) [id]
,[Location_Name]
,[LOCATION_geo]from [MYDB].[dbo].[StoreLocations]
where [LOCATION_geo].STDistance(@point) <= 10000
ORDER BY [LOCATION_geo].STDistance(@point)
问题是查询总是需要656毫秒到800毫秒。这对我们的网站来说是不可接受的,因为我们期望太多的同步调用。
(1000行(S)的影响)
SQL Server的执行时间:CPU时间= 923毫秒,经过的时间= 1511毫秒。
注:大部分商店位于一些城市(约10个城市)。
另外我注意到聚集索引查找成本大于总查询成本的45%。
所以我的问题是有没有更好的方法来提高该查询的性能?
是否使用了空间索引?你能否确认它是通过执行计划使用的? – gotqn
是的,它使用,成本8%,估计行大小17 B,订购:真,预计执行次数109.8。 –
此外,该指数在执行计划中总是给出警告“列没有统计数据:.... SRID,....pk0“,实际上我不知道它是什么意思 –