- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个包含大量地理空间数据的数据库……基本上是关于成千上万人的信息,以及每个人的坐标。
坐标目前存储为纬度和经度的两个 float ,我使用一个函数来确定该记录中的坐标与我传入的坐标之间的距离......基本上是为了排序和限制我得到的结果距离。这就是函数中使用的大致代码。
DECLARE @earthSphereRadiusKilometers as float
DECLARE @kilometerConversionToMilesFactor as float
SELECT @earthSphereRadiusKilometers = 6366.707019
SELECT @kilometerConversionToMilesFactor = .621371
-- convert degrees to radians
DECLARE @lat1Radians float
DECLARE @lon1Radians float
DECLARE @lat2Radians float
DECLARE @lon2Radians float
SELECT @lat1Radians = (@lat1Degrees / 180) * PI()
SELECT @lon1Radians = (@lon1Degrees / 180) * PI()
SELECT @lat2Radians = (@lat2Degrees / 180) * PI()
SELECT @lon2Radians = (@lon2Degrees / 180) * PI()
-- formula for distance from [lat1,lon1] to [lat2,lon2]
RETURN ROUND(2 * ASIN(SQRT(POWER(SIN((@lat1Radians - @lat2Radians) / 2) ,2) + COS(@lat1Radians) * COS(@lat2Radians) * POWER(SIN((@lon1Radians - @lon2Radians) / 2), 2))) * (@earthSphereRadiusKilometers * @kilometerConversionToMilesFactor), 4)
存储过程需要 4 或 5 秒才能运行。
我注意到 SQL Azure 现在支持几何数据类型..(当我创建数据库时它不支持)。
所以我的问题是......我的存储过程运行速度是否会显着提高,这将使我值得花时间将其更改为使用几何数据类型?
谢谢!
史蒂文
最佳答案
您的问题“我是否会体验到显着的增加速度……[通过]改变使用几何数据类型?”似乎忽略了使用专用空间数据类型实际上会减慢速度的可能性。然而,出于多种原因,实际上可能就是这种情况。
首先,请记住几何和地理数据类型不仅支持点,还支持线串和多边形。它们支持的额外复杂性意味着它们不一定使用简单的点对点距离计算。它们还支持这些类型的更多内置函数,因此点的序列化值比一组经纬度坐标更复杂。这意味着几何/地理点值的检索和查询速度可能比原始浮点坐标数据的等效列慢。
第二个也是更重要的因素与执行距离计算的准确性有关:
1.) 如果您有投影坐标(即 UTM、国家网格或国家平面),则坐标值在平面上以线性 (x, y) 单位测量。因此,使用基本三角函数很容易计算出两点之间的距离:距离(xy) = SQRT( (x2 - x1)2 + (y2 - y1)2 )这是一个简单的数学方法,无论您自己实现还是使用几何数据类型,您都不太可能看到性能差异。
2.) 如果您有地理坐标(即纬度/经度),则这些是在椭球 上以角度单位测量的。最常见的是 WGS84 系统使用的 WGS84 椭球体。在许多情况下,您可以通过使用简单的球面 计算来获得椭圆体上两点之间距离的足够好的近似值,就像您在存储过程中所做的那样。然而,地球的形状更像是一个被压扁的球体——它在赤道处的宽度比在两极处的高度要宽,而且你的计算不允许地球变平。地理数据类型使用椭圆体计算,基于提供的 SRID 的椭圆体模型,这必然更复杂,但会产生更准确的答案。
所以我建议,如果您想提高空间数据的精度和功能,那么您应该转向空间数据类型,但不是出于性能原因。
关于sql-server - MS SQL - 使用几何数据类型查找距离是否明显更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3968754/
SQL、PL-SQL 和 T-SQL 之间有什么区别? 谁能解释一下这三者之间的区别,并提供每一个的相关使用场景? 最佳答案 SQL 是一种对集合进行操作的查询语言。 它或多或少是标准化的,几乎所有关
这个问题已经有答案了: What is the difference between SQL, PL-SQL and T-SQL? (6 个回答) 已关闭 9 年前。 我对 SQL 的了解足以完成我的
我在数据库中有一个 USER 表。该表有一个 RegistrationDate 列,该列有一个默认约束为 GETDATE()。 使用 LINQ 时,我没有为 RegistrationDate 列提供任
我有一个可能属于以下类型的字符串 string expected result 15-th-rp 15 15/12-rp 12 15-12-th
很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center . 9年前关闭
我有一个存储过程(称为 sprocGetArticles),它从文章表中返回文章列表。这个存储过程没有任何参数。 用户可以对每篇文章发表评论,我将这些评论存储在由文章 ID 链接的评论表中。 有什么方
我目前正在做一个 *cough*Oracle*cough* 数据库主题。讲师介绍embedded SQL作为让其他语言(例如 C、C++)与(Oracle)数据库交互的方式。 我自己做了一些数据库工作
SQL Server 中 SQL 语句的最大长度是多少?这个长度是否取决于 SQL Server 的版本? 例如,在 DECLARE @SQLStatement NVARCHAR(MAX) = N'S
这个问题已经有答案了: Simple way to transpose columns and rows in SQL? (9 个回答) 已关闭 8 年前。 CallType
预先感谢您对此提供的任何帮助。 假设我有一个查询,可以比较跨年的数据,从某个任意年份开始,永无止境(进入 future ),每年同一时期直到最后一个完整的月份(其特点是一月数据永远不会显示至 2 月
我在数据库中有一个 USER 表。该表有一个 RegistrationDate 列,该列的默认约束为 GETDATE()。 使用 LINQ 时,我没有为 RegistrationDate 列提供任何数
下面是我试图用来检查存储过程是否不存在然后创建过程的 sql。它会抛出一个错误:Incorrect syntax near the keyword 'PROCEDURE' IF NOT EXISTS
我有一个同事声称动态 SQL 在许多情况下比静态 SQL 执行得更快,所以我经常看到 DSQL 到处都是。除了明显的缺点,比如在运行之前无法检测到错误并且更难阅读,这是否准确?当我问他为什么一直使用
来自 lobodava 的动态 SQL 查询是: declare @sql nvarchar(4000) = N';with cteColumnts (ORDINAL_POSITION, CO
使用 SQL Server 中的存储过程执行动态 SQL 命令的现实优点和缺点是什么 EXEC (@SQL) 对比 EXEC SP_EXECUTESQL @SQL ? 最佳答案 sp_executes
我有这个有效的 SQL 查询: select sum(dbos.Points) as Points, dboseasons.Year from dbo.StatLines dbos i
我正在调试一些构建成功运行的 SQL 命令的代码。 然而,在查询结束时,查询结果似乎被写入了一个文本文件。 完整的查询如下 echo SELECT DATE,DATETABLE,DATE,APPDAT
我有一些创建表的 .sql 文件(MS SQL 数据库): 表_1.sql: IF OBJECT_ID (N'my_schema.table1', N'U') IS NOT NULL DROP TAB
我写了下面的 SQL 存储过程,它一直给我错误@pid = SELECT MAX(... 整个过程是: Alter PROCEDURE insert_partyco @pname varchar(20
我在 SQL Server 2005 中有包含两列 Fruit 和 Color 的表,如下所示 Fruit Colour Apple Red Orange
我是一名优秀的程序员,十分优秀!