我正在尝试在给定坐标的某个距离内找到位置。在一个大约32k记录的表上,查询大约需要2秒 - 这太慢了,imo。
它正在进行聚簇索引扫描,这是逻辑的 - 它必须计算每个位置的距离。但是,我仍然认为这应该比这个小的数据集更快。我确实已经定义了空间索引,但它没有被使用,如果我强制它,查询就会失败。
大部分时间(约86%)用于计算距离的过滤器 - 所以我正在寻找一种优化方法,我需要一些帮助..
我正在使用的查询是:
SELECT Name
FROM Venue
WHERE (Coordinates.STDistance(geography::STPointFromText('POINT(-113.512245 51.498212)', 4326)) / 1000) <= 100
答案 0 :(得分:0)
一种古老的方法是使用BOX firxt。
从你的观点来看,在盒子的两端做两个点。 + R / + R和-R / -R来自中心。
然后你可以过滤 - 一个点必须在这个框中并且在你描述的圆圈中。
框检查可以在索引上运行并杀死大多数元素。
简单的学校几何学。您在所描述的圆圈周围绘制一个矩形框。
您当前的方法无法使用索引,因为索引不包含字段。
替代:绘制圆形 - 不要使用距离计算。画一个圆圈。有点。
或者阅读https://stackoverflow.com/questions/11311363/my-application-is-about-asp-net-using-linq-and-remote-mssql-my-connection-is-be,这是您提出的问题。