我有一个关于最近门店的性能查询:
我们有一张包含50,000个记录(商店/销售点位置)的表,位于一个国家。
每个记录都有一个类型为“地理”的location
列。
[LOCATION_geo] [geography]
为了提高性能,我使用以下语法在位置列上创建了一个SPATIAL INDEX:
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
我有一个存储过程,可以返回用户当前位置附近的最近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毫秒的时间。对于我们的网站来说,这样的性能是无法接受的,因为我们需要太多同步调用。
请注意:大多数商店位于某些城市(约有10个城市)。(已影响1000行)
SQL Server 执行时间:CPU时间=923毫秒,经过时间=1511毫秒。
此外,我还注意到聚集索引搜索成本>= 45%的总查询成本。
所以我的问题是,是否有更好的方法来提高该查询的性能?
GRIDS =(LEVEL_1 = MEDIUM,LEVEL_2 = MEDIUM,LEVEL_3 = MEDIUM,LEVEL_4 = MEDIUM)
部分。文档比我能做的更好。https://technet.microsoft.com/zh-cn/library/bb964712(v=sql.105).aspx - Ben Thulwhere @g.STIntersects([LOCATION_geo]) = 1
并将 @g 定义为declare @g geography = @point.STBuffer(10000);
,我已经取得了一些成功。 - Ben Thul