查询每组最近邻的空间数据

got*_*tqn 5 sql-server sql-server-2012 spatial sql-server-2014 nearest-neighbor

我想查询最近邻的空间数据。我正在使用这篇文章,以下查询完美运行:

SELECT TOP 1 [Location].STDistance(@Location)
FROM [DS1]
WHERE [Location].STDistance(@Location) IS NOT NULL          
ORDER BY [Location].STDistance(@Location);
Run Code Online (Sandbox Code Playgroud)

问题是我需要为每个MSPID. 我尝试了几件事(使用交叉应用,创建单独的函数等)但没有任何效果。所以,我决定创建一个循环来计算每个MSPID.

SELECT TOP 1 [Location].STDistance(@Location)
FROM [DS1]
WHERE [Location].STDistance(@Location) IS NOT NULL 
    AND @CurrentMSPID = [MSPID]         
ORDER BY [Location].STDistance(@Location);
Run Code Online (Sandbox Code Playgroud)

问题是上面的语句没有使用索引。如果我@CurrentMSPID用一个数字替换使用索引,但是当使用一个变量时,使用聚集索引而不是空间索引。

我尝试了很多选择,唯一有效的是:

OPTION (OPTIMIZE FOR ( @CurrentMSPID  = 1001 ))
Run Code Online (Sandbox Code Playgroud)

或者当值是硬编码时。我不能那样做,因为将来这id甚至可能不存在,并且肯定会更改它匹配的行数。

[DS1]表在[MSPID]列上有主键,在列上有空间索引[Location]

如何在不使用OPTIMIZE FOR选项的情况下帮助引擎生成更好的执行计划并使用空间索引?


当从表中提取其他数据时(我们MSPID现在正在过滤),引擎似乎无法使用空间索引并执行聚集索引查找。

pap*_*zzo 2

到达

SELECT TOP 1 DS2.[Location].STDistance(@Location)
FROM [DS1] DS1
INNER JOIN [DS2] DS2
   ON DS1.[MSPID] = @CurrentMSPID 
  and DS2.[MSPID] = @CurrentMSPID 
WHERE DS2.[Location].STDistance(@Location) IS NOT NULL     
ORDER BY DS2.[Location].STDistance(@Location);
Run Code Online (Sandbox Code Playgroud)

您真的需要加入吗?

SELECT TOP 1 DS2.[Location].STDistance(@Location)
FROM [DS2] DS2
where DS2.[MSPID] = @CurrentMSPID 
and DS2.[Location].STDistance(@Location) IS NOT NULL     
ORDER BY DS2.[Location].STDistance(@Location);
Run Code Online (Sandbox Code Playgroud)