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
现在正在过滤),引擎似乎无法使用空间索引并执行聚集索引查找。
到达
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)
归档时间: |
|
查看次数: |
4244 次 |
最近记录: |