gpt4 book ai didi

sql-server-2008 - sql server 2008 中的地理数据类型有多好?

转载 作者:行者123 更新时间:2023-12-04 11:43:22 27 4
gpt4 key购买 nike

我有一个装满客户的大型数据库,在 sql server 2005 中实现。每个客户都有一个经纬度,表示为 Decimal(18,15) .数据库中最重要的搜索查询试图找到靠近某个位置的所有客户,如下所示:

(Addresses.Latitude - @SearchInLat)  BETWEEN -1 * @LatitudeBound AND @LatitudeBound)
AND ( (Addresses.Longitude - @SearchInLng) BETWEEN -1 * @LongitudeBound AND @LongitudeBound)

所以,这是一个非常简单的方法。 @LatitudeBound@LongitudeBound只是数字,用于拉回点 @SearchInLat, @SearchInLng 的粗边界矩形内的所有客户.一旦结果到达客户端 PC,一些结果就会被过滤掉,因此有一个边界圆而不是一个矩形。 (这是在客户端 PC 上完成的,以避免在服务器上计算平方根。)

这种方法在过去非常有效。然而,我们现在想让搜索做更有趣的事情——例如,让回溯的结果数量更可预测,或者让用户动态增加搜索半径的大小。为此,我一直在寻找升级到 sql server 2008 的可能性,以及它的 Geography 数据类型、空间索引和距离函数。我的问题是:这些速度有多快?

我们目前拥有的简单查询的优点是它非常快,而且不是性能密集型的,这一点很重要,因为它经常被调用。基于这样的查询的速度有多快:
SearchInPoint.STDistance(Addresses.GeographicPoint) < @DistanceBound

相比之下?空间索引是否运行良好,STDistance 是否快?

最佳答案

如果您只是按照您的描述处理标准的 Lat/Lng 对,并且您所做的只是简单的查找,那么可以说您不会通过使用 Geometry Type 来提高速度。

但是,如果您确实希望像您所说的那样更具冒险精神,那么切换到使用 Geometry 类型将为您打开一个充满新可能性的世界,而不仅仅是搜索。

例如(基于我正在开展的一个项目)您可以(如果是英国数据)下载给定区域所有城镇/村庄/城市的多边形定义,然后进行交叉引用以在特定城镇中进行搜索,或者如果您有路线图,您可以找到哪些客户住在主要送货路线、高速公路、主要道路等各种事物的旁边。

你也可以做一些非常花哨的报告,想象一张城镇 map ,其中每个轮廓都被绘制在 map 上,然后用颜色阴影显示一个区域的客户密度,一些简单的几何 SQL 可以很容易地直接返回给你一个计数从数据库中,绘制此类信息。

然后是跟踪,我不知道你处理什么数据,或者为什么你有客户,但是如果你交付任何东西,输入送货车的坐标,告诉你它与给定客户的距离有多近。

至于问题是STDistance快吗?嗯,这真的很难说,我认为更好的问题是“与......相比它是否快”,很难说是或否,除非你有什么可以比较的东西。

空间索引是将数据移动到具有地理意识的数据库的主要原因之一,它们经过优化以针对给定任务产生最佳结果,但与任何数据库一样,如果您创建了错误的索引,那么您将获得糟糕的性能。

一般来说,你肯定会看到某种速度的提高,因为排序和索引中的数学更能意识到数据的目的,而不是像普通索引那样在操作上是相当线性的。

还要记住,SQL 服务器机器越强大,你得到的结果就越好。

最后要提到的一点是数据管理,如果您使用 GIS 感知数据库,那么这为您使用 GIS 包(例如 ArcMap 或 MapInfo)来管理、更正和可视化数据打开了途径,这意味着更正非常容易通过指向、单击和拖动来完成。

我的建议是为现有的表创建一个并排的表,该表针对空间操作进行格式化,然后编写一些存储过程并进行一些计时测试,看看哪个是最好的。如果您仅在您所做的基本操作上有显着增加,那么这只是理由,如果大致相同,那么您的决定真正取决于您实际想要实现的新功能。

关于sql-server-2008 - sql server 2008 中的地理数据类型有多好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7307147/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com