目前我正在使用SQL Server并遇到问题,我有一个带有12M地址的表Adress;当我寻找一个地址;它需要3或4分钟才能找到它。我必须在我的桌子上每天寻找超过40000个adressess。所以Sql server不帮我解决这个问题。 我认为使用其他SGBD可能是MongoDB,但我不知道它是否会起作用。我的目标是在不到2秒的时间内找到每个查询。
我的查询:
implementation 'de.hdodenhof:circleimageview:2.2.0'
我的表:
SELECT TOP 1 adresse
FROM (SELECT
geography::Point(p.latitude, p.longitude,4326).STDistance(geography::Point(Cast(Replace('28,5259799957275', ',', '.') AS FLOAT)
, Cast(Replace('28,5259799957275', ',', '.') AS FLOAT), 4326)) AS rn,
p.adresse
FROM [adressespositions] p) ph
WHERE ph.rn < 10
我服务器的RAM:128 GB。
如何快速完成此查询?或者我必须使用其他SGBD?
答案 0 :(得分:3)
使用GEOGRAPHY
类型的GPS点添加新列(而不是在每个SELECT
上重新创建)。然后在该列上创建SPATIAL INDEX
,性能应该高峰。
ALTER TABLE dbo.adressespositions ADD GPS GEOGRAPHY
UPDATE T SET
GPS = GEOGRAPHY::Point(T.latitude, T.longitude, 4326)
FROM
dbo.adressespositions AS T
CREATE SPATIAL INDEX SI_adressespositions_GPS ON dbo.adressespositions (GPS)
如果您有许多记录,创建空间索引可能需要一段时间。此外,空间索引需要该表上的主键(如果您还没有主键,则必须创建一个主键)。
然后你改变你的选择如下:
DECLARE @FilterGPS GEOGRAPHY = GEOGRAPHY::Point(
Cast(Replace('28,5259799957275', ',', '.') AS FLOAT),
Cast(Replace('28,5259799957275', ',', '.') AS FLOAT),
4326)
SELECT TOP 1
P.adresse,
Distance = P.GPS.STDistance(@FilterGPS)
FROM
[adressespositions] AS P
WHERE
P.GPS.STDistance(@FilterGPS) < 10
ORDER BY
2 ASC
答案 1 :(得分:2)
为什么不使用Geography或Geometry等空间数据类型更改表结构,而不是使用float作为纬度和经度。然后,您可以在新创建的表上使用空间索引。