空间数据和SQL Server:非常慢的查询

时间:2018-05-07 11:34:32

标签: sql-server bigdata spatial-query

目前我正在使用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?

2 个答案:

答案 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作为纬度和经度。然后,您可以在新创建的表上使用空间索引。

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-spatial-index-transact-sql?view=sql-server-2017