我想使用任何可能的 RDBMS 创建一个数据库。它将有一个包含大约 150 列的表。目标是执行一些其他对象的最近邻搜索。所以它是150维空间中的NNS。
我已经尝试使用一些明显的方法,例如 L1 或 L2 距离,但当然对于包含多行的表需要花费大量时间。我还尝试查看 KD-tree(注意我没有测试它)和 PG-Strom,但它们对于多维数据并不是一个好的解决方案。
我可以使用数学方法(如 KD-tree)或技术方法(如 PG-Strom)以某种方式提高所描述的搜索速度吗?
我将尝试使用任何可以提高 NNS 速度的 RDBMS。但是 MySQL 和 PostgreSQL 是最适合我的 DBMS。
我有一个性能不佳的现有数据库解决方案。我正在使用浮点数等使用传统表结构搜索多维数据。数据库包含约 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) 我想查询最近邻的空间数据。我正在使用这篇文章,以下查询完美运行:
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