Sql server 在SQL Server中,选择/插入位置时,地理类型和浮点类型哪个更有效?

Sql server 在SQL Server中,选择/插入位置时,地理类型和浮点类型哪个更有效?,sql-server,floating-point,processing-efficiency,sqlgeography,Sql Server,Floating Point,Processing Efficiency,Sqlgeography,将位置存储为地理类型与简单地将经度和纬度分别保存为一个浮点值对性能有什么影响?我运行了以下测试,始终保存坐标1,2。这是为了避免将坐标转换为字符串的字符串处理成本,以便使用函数DECLARE@location geography=geography::Point('1','2',4326);(在撰写本文时,这是从坐标中获取地理类型的最有效方法) 创建表GeogXYtable(GeogXYID int主键标识(1,1),GeogXY地理); 声明@i int=0; 而(@i

将位置存储为地理类型与简单地将经度和纬度分别保存为一个浮点值对性能有什么影响?

我运行了以下测试,始终保存坐标1,2。这是为了避免将坐标转换为字符串的字符串处理成本,以便使用函数DECLARE@location geography=geography::Point('1','2',4326);(在撰写本文时,这是从坐标中获取地理类型的最有效方法)

创建表GeogXYtable(GeogXYID int主键标识(1,1),GeogXY地理);
声明@i int=0;
而(@i<100000)
开始
声明@location geography=geography::Point('1','2',4326);
在GeogXYtable(GeogXY)中插入值(@location);
设置@i=@i+1;
结束
上面的循环需要59秒才能运行。(SQL Server实例没有执行任何其他操作,重新运行时的结果相同)

将此与将坐标另存为两个单独的浮动进行比较:

CREATE TABLE floatXYtable ( GeogXYID int PRIMARY KEY IDENTITY(1,1), X float, Y float );

 DECLARE @i int = 0;
 WHILE (@i < 100000) 
 BEGIN
   INSERT INTO floatXYtable ( X, Y ) VALUES ( 1, 2 );
   SET @i = @i + 1;
 END
创建表floatXYtable(GeogXYID int主键标识(1,1)、X float、Y float);
声明@i int=0;
而(@i<100000)
开始
在floatXYtable(X,Y)中插入值(1,2);
设置@i=@i+1;
结束
上面的循环需要38秒才能运行


结论:将点保存为地理类型比将其保存为浮动慢55%

五次运行后,我的上述基准测试显示21秒对17.5秒,速度慢约16%。我正在运行SQL Server 2016。将两个表中的值相加(将数据量增加十倍后)会有更大的差异-浮动与地理位置的差异约为0.25秒与6秒(浮动速度约为24倍)。读取所有实际数据会导致12s与19s之间的差异,这大约要慢36%,解码的大部分差异都会在实际发送数据的成本中丢失。如果您只关心写入,则序列化CLR对象将花费更长的时间。但是,如果您希望查询诸如“选择靠近另一个对象的对象”或“选择位于某个区域的对象”之类的数据,那么地理数据类型将带来好处。为什么?“将其存储为浮动”的第一步是做一些粗略的三角运算。你可以对你表格中的每一点都这样做,因为没有办法索引它。@Ben,这是一个单独的讨论。(但我发现,在许多情况下,通过索引X和Y浮动字段来查找半径中的点实际上比在地理列上有索引的情况下进行空间几何查询要快)。但这不是这篇文章的主题。
CREATE TABLE floatXYtable ( GeogXYID int PRIMARY KEY IDENTITY(1,1), X float, Y float );

 DECLARE @i int = 0;
 WHILE (@i < 100000) 
 BEGIN
   INSERT INTO floatXYtable ( X, Y ) VALUES ( 1, 2 );
   SET @i = @i + 1;
 END