标签: nearest-neighbor

150维空间中的快速最近邻搜索

我想使用任何可能的 RDBMS 创建一个数据库。它将有一个包含大约 150 列的表。目标是执行一些其他对象的最近邻搜索。所以它是150维空间中的NNS。

我已经尝试使用一些明显的方法,例如 L1 或 L2 距离,但当然对于包含多行的表需要花费大量时间。我还尝试查看 KD-tree(注意我没有测试它)和 PG-Strom,但它们对于多维数据并不是一个好的解决方案。

我可以使用数学方法(如 KD-tree)或技术方法(如 PG-Strom)以某种方式提高所描述的搜索速度吗?

我将尝试使用任何可以提高 NNS 速度的 RDBMS。但是 MySQL 和 PostgreSQL 是最适合我的 DBMS。

performance database-design nearest-neighbor

15
推荐指数
1
解决办法
4097
查看次数

如何使用 SQL Server 空间数据类型设置多维距离搜索的解决方案

我有一个性能不佳的现有数据库解决方案。我正在使用浮点数等使用传统表结构搜索多维数据。数据库包含约 1-2M 行。

经过一番搜索,我发现了 SQL Server 空间数据类型,您可以在其中定义基于 Point 或 MultiPoint 的几何图形,您可以在其中进行距离搜索。我认为这可能是一个解决方案,但我需要一些帮助才能朝着正确的方向开始。

我当前的表结构如下,其中每行包含 2 个(最终更多)XYZ 值:

    | ID | X1  | Y1  | Z1  | X2  | Y2  | Z2  |
    | 1  | 1.1 | 2.2 | 5.1 | 1.2 | 2.1 | 4.1 |
    | 2  | 3.2 | 5.1 | 4.1 | 3.2 | 3.1 | 3.1 |
    | 3  | 4.1 | 2.3 | 6.3 | 4.2 | 4.1 | 2.1 |
    | 4  | 2.4 | …
Run Code Online (Sandbox Code Playgroud)

sql-server spatial nearest-neighbor geometry

7
推荐指数
1
解决办法
327
查看次数

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

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

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现在正在过滤),引擎似乎无法使用空间索引并执行聚集索引查找。

sql-server sql-server-2012 spatial sql-server-2014 nearest-neighbor

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