I have the nearest performance request store:
We have a table containing about 50,000 records (stores / points of sale) in one country.
Each record has location columns like "geography"
[LOCATION_geo] [geography]
Also for performance, I created a SPACE INDEX on this location column using this syntax
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
I have a stored procedure to return the nearest repository of 1000 for the user's current location.
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)
The problem is that the request always takes from 656 ms to 800 ms. And this is unacceptable performance for our website because we expect too many synchronous calls.
(1000 lines affected)
SQL Server Runtime: CPU time = 923 ms, elapsed time = 1511 ms.
Note: most stores are located in some cities (about 10 cities).
I also noticed that the Clustered Index Seek costs> = 45% of the total cost of the request.
So my question is: is there a better way to improve the performance of this request?