标签: sqlgeography

空间索引减慢了查询速度

背景

我有一个表格包含代表客户区域的POLYGONS/MULTIPOLYGONS:

  • 该表包含大约8,000行
  • 大约90%的多边形是圆形
  • 其余的多边形代表一个或多个州,省或其他地理区域.这些形状的原始多边形数据是从美国人口普查数据中导入的.
  • 该表在主键上具有空间索引和聚簇索引.未对默认的SQL Server 2008 R2设置进行任何更改.每个对象16个单元格,所有级别中等.

这是一个简化的查询,将重现我遇到的问题:

DECLARE @point GEOGRAPHY = GEOGRAPHY::STGeomFromText('POINT (-76.992188 39.639538)', 4326)

SELECT terr_offc_id
FROM tbl_office_territories
WHERE terr_territory.STIntersects(@point) = 1
Run Code Online (Sandbox Code Playgroud)

看起来像一个简单,直接的查询需要12或13秒才能执行,对于这样一个简单的查询来说,这似乎是一个非常复杂的执行计划.

执行计划

在我的研究中,有几个消息来源建议在查询中添加索引提示,以确保查询优化器正确使用空间索引.添加WITH(INDEX(idx_terr_territory))没有任何效果,并且从执行计划中可以清楚地看出,无论提示如何,它都引用了我的索引.

减少多边形

从美国人口普查数据导入的领土多边形似乎有可能是不必要的复杂,因此我创建了第二列,并测试了具有不同程度公差的缩小多边形(带有Reduce()方法).对新列运行与上面相同的查询会产生以下结果:

  • 没有减少:12649ms
  • 减少10:7194ms
  • 减少20:6077ms
  • 减少30:4793ms
  • 减少40:4397ms
  • 减少50:4290ms

显然朝着正确的方向前进,但精确度下降似乎是一个不优雅的解决方案.这不是索引应该是什么?对于这样的基本查询,执行计划似乎仍然很复杂.

空间索引

出于好奇,我删除了空间索引,并被结果震惊:

  1. 没有索引时查询速度更快(sub 3 sec w/no reduction,sub 1 sec with reduction tolerance> = 30)
  2. 执行计划看起来很远,更简单:

执行计划没有索引

我的问题

  1. 为什么我的空间索引减慢了速度?
  2. 为了加快查询速度,减少多边形复杂度真的很有必要吗?降低精度可能会导致问题,并且似乎不会很好地扩展.

其他说明

  • 已应用SQL Server 2008 R2 Service Pack 1
  • 进一步的研究建议在存储过程中运行查询.试过这个,似乎没有任何改变.

sql-server-2008-r2 spatial-index sqlgeography

6
推荐指数
1
解决办法
961
查看次数

如何从SQL Server Geography数据类型字段中选择Lat&Long坐标

考虑SQL Server的"地理"数据类型......

我可以输入一个纬度和经度数组(顺便说一句,这是正确的顺序还是经度纬度?),如下所示:

INSERT INTO SpatialZonePolygons (Coordinates)
VALUES (geography::STGeomFromText('POLYGON((-122.358 47.653 , -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))', 4326));
GO
Run Code Online (Sandbox Code Playgroud)

然后显示为:

0xE6100000010405000000DD24068195D34740F4FDD478E9965EC0508D976E12D3474083C0CAA145965EC04E62105839D4474083C0CAA145965EC04E62105839D44740F4FDD478E9965EC0DD24068195D34740F4FDD478E9965EC001000000020000000001000000FFFFFFFF0000000003
Run Code Online (Sandbox Code Playgroud)

如何将它们选择回纬度和经度格式?

非常感谢.

sql sqlgeography

6
推荐指数
2
解决办法
8559
查看次数

KML 到 SqlGeography

任何人都有将 KML 转换为 SqlGeography (SQLServer DataType) 的函数或 DLL?

如果有必要,我会自己写出来,但我很惊讶我在那里找不到。

c# kml google-maps-api-3 sqlgeography

5
推荐指数
1
解决办法
5934
查看次数

是否有SqlGeometryBuilder的实现?

在实体框架中实现空间类型(System.Data.Spatial.DBGeometry)之前,我们可以使用"Microsoft.SqlServer.Types.SqlGeometry"来处理缺少空间支持.该库具有类SqlGeometryBuilder,用于根据不同的几何点创建SqlGeometry.

我决定从SqlGeometry继续到DBGeometry,但我找不到任何与SqlGeometryBuilder过去相同的函数.你知道这有什么功能吗?或者你知道它是否会包含在下一个版本中吗?

提前致谢.

c# spatial sqlgeography entity-framework-5

5
推荐指数
1
解决办法
680
查看次数

使用地理位置和距离从SQL Server数据库中选择记录

我使用SQL Server地理数据类型来存储我的数据库中的记录位置.我想选择给定位置给定距离内的所有记录:

DECLARE @location AS geography = geography::Point(@latitude, @longitude, 4326)
DECLARE @distance AS INT = 10000

SELECT * 
FROM records
WHERE records.location.STDistance(@location) <= @distance
Run Code Online (Sandbox Code Playgroud)

在我的测试数据库一对夫妇的十几记录本上运行很迅速,我没有任何问题,但我知道,WHERE子句运行STDistance针对我的数据库中的所有记录,一旦我有成千上万的记录,这将慢慢爬行.

有一个更好的方法吗?也许创建某种区域并首先在邻近区域选择数据?

sql sql-server select sqlgeography

5
推荐指数
1
解决办法
1694
查看次数

SQL Server - 列数据类型和曲面细分方案不匹配

我正在尝试Location在数据库中的列上创建索引.

收到此错误: Mismatch in column datatype and tessellation scheme

它是纬度和经度字段的简单地理计算字段.

[Location]  AS ([geography]::Point([Latitude],[Longitude],(4326))) PERSISTED,
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?

在我的应用程序中,我对此Location列进行了大量过滤,因此我想确保将其编入索引.

在此输入图像描述

sql sql-server indexing sqlgeography

5
推荐指数
1
解决办法
1017
查看次数

计算两点之间的距离时的轻微不一致

考虑下面的函数计算之间的距离两分

CREATE FUNCTION CoordinateDistanceMiles(
@Latitude1 float,
@Longitude1 float,
@Latitude2 float,
@Longitude2 float
)
RETURNS float 
AS  
BEGIN 
-- CONSTANTS
DECLARE @EarthRadiusInMiles float;
SET @EarthRadiusInMiles = 3963.1
DECLARE @PI  float;
SET @PI = PI();
-- RADIANS conversion
DECLARE @lat1Radians float;
DECLARE @long1Radians float;
DECLARE @lat2Radians float;
DECLARE @long2Radians float;
SET @lat1Radians = @Latitude1 * @PI / 180;
SET @long1Radians = @Longitude1 * @PI / 180;
SET @lat2Radians = @Latitude2 * @PI / 180;
SET @long2Radians = @Longitude2 * @PI / …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server sqlgeography sql-server-2012

5
推荐指数
1
解决办法
99
查看次数

SQL Server 中的位置群集

我正在澳大利亚的地图上显示大约 40,000 个纬度经度点,我怀疑大多数点都在城镇中,但没有城镇的数据,并且希望能够将这些点聚集到我所在的大小可以在地图上放置带有总数的图钉,以帮助更好地理解数据。

是否有某种方法可以查询以获取包含集群位置的集群列表并对该集群的点进行计数?

sql-server sqlgeography

5
推荐指数
0
解决办法
293
查看次数

Postgres / Postgis-确保所有多边形均已关闭

我需要编写一个查询,该查询查找所有未闭合的多边形,并通过复制第一个点并创建另一个终点来关闭它们。

我可以选择无效的行:

SELECT delivery_zone_id, polygon from delivery_zone WHERE ST_IsClosed(polygon::geometry) = FALSE;
Run Code Online (Sandbox Code Playgroud)

而且我能够转储来自每个多边形的各个点:

SELECT delivery_zone_id, ST_AsText((dp).geom) FROM
    (SELECT delivery_zone_id, ST_DumpPoints(polygon::geometry) AS dp 
        FROM delivery_zone 
        WHERE ST_IsClosed(polygon::geometry) = FALSE
    ) AS coords;
Run Code Online (Sandbox Code Playgroud)

结果看起来像这样:

1   POINT(-96.80037 33.09812)  ## Copy this point and add it to the set
1   POINT(-96.80427 33.0956)
1   POINT(-96.80401 33.09219)
1   POINT(-96.79603 33.09222)
1   POINT(-96.79346 33.09647)
1   POINT(-96.80037 33.09857)

4   POINT(-96.80037 33.099)    ## Copy this point and add it to the set
4   POINT(-96.80427 33.0956)
4   POINT(-96.80401 33.09219)
4   POINT(-96.79603 …
Run Code Online (Sandbox Code Playgroud)

postgresql postgis sqlgeography sqlgeometry

5
推荐指数
1
解决办法
325
查看次数

GROUP BY子句中的SQL Geography数据类型列

我正在使用SQL Server并创建一个脚本,该脚本将从我的数据库中获取工作者的地理位置.脚本如下.

SELECT w.display_name, w.geo_location
FROM jobs j WITH(NOLOCK)
INNER JOIN workers w WITH(NOLOCK) ON w.worker_id = j.worker_id
WHERE .....
Run Code Online (Sandbox Code Playgroud)

问题是我想添加GROUP BY w.display_name, w.geo_location到脚本,因为显示了重复的记录.向group by子句添加了具有数据类型geography的列会导致抛出错误.

添加此内容时抛出的错误是:

"地理"类型无法比较.它不能在GROUP BY子句中使用.

有没有解决的办法?我无法转换w.geo_locationVARCHAR地理数据类型中所需的a .

sql t-sql sql-server group-by sqlgeography

4
推荐指数
2
解决办法
4423
查看次数