Sql 查询优化问题(空间)
我有两个空间数据集 数据集1大约有15000000条记录。 数据集2大约有16000000条记录 两者都使用地理GPS坐标数据类型,所有记录都是点 两个表都有空间索引,每个对象的单元格数为1,级别分别为高、高、高、高 从全球范围来看,所有点都位于美国州的一个小区域1。这些点的分布足以保证使用地理信息而不是几何投影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
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