曼哈顿距离与oracle中的n维度

use*_*422 5 sql oracle query-optimization

我有一个大约有5百万行的表,每行有10列代表10个维度.我希望能够在新的输入来执行表中的搜索以使用曼哈顿距离返回最近的行.距离是abs(Ai-Aj)+ abs(Bi-Bj)的总和...问题是,如果我进行查询,它会对整个表进行全扫描,以计算距离每一行,然后对它们进行排序以找到顶部的X.

有没有办法加快流程并提高查询效率?

我在线查看了SDO_GEOMETRY的距离函数,但我找不到4个以上的尺寸.

谢谢

Ati*_*gur 0

我建议使用基于函数的索引。您需要计算这个距离,因此使用基于函数的索引预先计算它。

您可能想阅读以下问题及其链接。基于函数的索引为您创建隐藏列。这个隐藏列将保存曼哈顿距离,因此排序会更容易。

感谢@Xophmeister 的评论。基于函数的索引不会帮助您任意点。我不知道有什么sql函数可以帮助你。但如果你愿意使用机器学习数据挖掘算法。

我建议使用k-means 聚类对 500 万行进行聚类。假设您找到了 1000 个聚类中心。将这个聚类中心放到另一个表中。根据聚类的定义,您的点将被分配到聚类中心。因此,您知道哪些点最接近该聚类中心,假设聚类 (1) 包含 20.000 个点,...聚类 (987) 包含 10.000 个点...

您的任意点将接近一个簇。您发现您的点最接近簇 987。运行您的 sql ,仅使用属于该簇中心的点,即 10.000 个点。

您需要向架构中添加多个表/列才能使其有效。如果 5.000.000 行连续变化,则需要在它们变化时再次运行 k-means 聚类。但如果它们是相当恒定的值,每周或每月一次聚类就足够了。