Sql 查询优化问题(空间)

Sql 查询优化问题(空间),sql,sql-server,spatial,spatial-index,Sql,Sql Server,Spatial,Spatial Index,我有两个空间数据集 数据集1大约有15000000条记录。 数据集2大约有16000000条记录 两者都使用地理GPS坐标数据类型,所有记录都是点 两个表都有空间索引,每个对象的单元格数为1,级别分别为高、高、高、高 从全球范围来看,所有点都位于美国州的一个小区域1。这些点的分布足以保证使用地理信息而不是几何投影 DECLARE @g GEOGRAPHY SET @g = (SELECT TOP 1 GPSPoint FROM Dataset1) EXEC sp_help_spatial_ge

我有两个空间数据集

数据集1大约有15000000条记录。 数据集2大约有16000000条记录

两者都使用地理GPS坐标数据类型,所有记录都是点

两个表都有空间索引,每个对象的单元格数为1,级别分别为高、高、高、高

从全球范围来看,所有点都位于美国州的一个小区域1。这些点的分布足以保证使用地理信息而不是几何投影

DECLARE @g GEOGRAPHY
SET @g = (SELECT TOP 1 GPSPoint FROM Dataset1)

EXEC sp_help_spatial_geography_index 'Dataset1', 'Dataset1_SpatialIndex', 0, @g
显示

这意味着查询

DECLARE @g GEOGRPAHY
SET @g = (SELECT TOP 1 GPSPoint FROM Dataset1)

SELECT TOP 1
  *
FROM
  Dataset2 D
WHERE
  @g.Filter(D.GPSPoint.STBuffer(1)) = 1
几乎需要一个小时才能完成

我也试过这样做

WITH TABLE1 AS (
  SELECT
    A.RecordID,
    B.RecordID,
    RANK() OVER (PARTITION BY A.RecordID ORDER BY A.GPSPoint.STDistance(B.GPSPoint) ASC) AS 'Ranking'
  FROM
    Dataset1 A
  INNER JOIN
    Dataset2 B
  ON
    B.GPSPoint.Filter(A.GPSPoint.STBuffer(1)) = 1
    AND A.GPSPoint.STDistance(B.GPSPoint) <= 50
)

SELECT 
  *
FROM
  TABLE1
WHERE
  Ranking = 1
结果是速度快了1000倍,但按照这个速度,我要做的是运行6个月的查询才能完成。老实说,我现在不知道该怎么办。最终目标是对dataset1中的每个记录进行最近邻搜索,以找到dataset2中的最近点,但这样似乎是不可能的


有谁知道我可以在哪些方面提高这个过程的效率吗?

试试这个:它是基于我的建议

要使用空间索引,最近邻查询必须满足以下要求:

空间索引必须出现在其中一个空间列上,并且STDistance方法必须在WHERE和ORDER BY子句中使用该列。 TOP子句不能包含PERCENT语句。 WHERE子句必须包含STDistance方法 如果WHERE子句中有多个谓词,则包含STDistance方法的谓词必须通过AND连接到其他谓词。STDistance方法不能位于WHERE子句的可选部分中。 ORDER BY子句中的第一个表达式必须使用STDistance方法。 order BY子句中第一个STDistance表达式的排序顺序必须为ASC。 必须过滤掉STDistance返回NULL的所有行。
WITH TABLE1 AS (
  SELECT
    A.RecordID,
    B.RecordID,
    RANK() OVER (PARTITION BY A.RecordID ORDER BY A.GPSPoint.STDistance(B.GPSPoint) ASC) AS 'Ranking'
  FROM
    Dataset1 A
  INNER JOIN
    Dataset2 B
  ON
    B.GPSPoint.Filter(A.GPSPoint.STBuffer(1)) = 1
    AND A.GPSPoint.STDistance(B.GPSPoint) <= 50
)

SELECT 
  *
FROM
  TABLE1
WHERE
  Ranking = 1
  SELECT TOP(1)
    A.RecordID,
    B.RecordID,
    A.GPSPoint.STDistance(B.GPSPoint) AS Distance
  FROM
    Dataset1 A
  INNER JOIN
    Dataset2 B
  ON
    A.GPSPoint.STDistance(B.GPSPoint) <= 50
    AND B.GPSPoint IS NOT NULL
  ORDER BY BY A.GPSPoint.STDistance(B.GPSPoint) ASC
B.GPSPoint.Filter(A.GPSPoint.STBuffer(1)) = 1 
    AND 
//or try B.GPSPoint.STIntersects(A.GPSPoint.STBuffer(1)) = 1