【问题标题】:Smallest distance search in series of points点序列中的最小距离搜索
【发布时间】:2023-12-11 21:46:01
【问题描述】:

主要目标是,给定一系列点,在庞大的数据库中找到最接近的点。 假设我们有系列 s1 = ((X1, Y1), (X2, Y2), (X3, Y3), (X4, Y4)) = (P1, P2, P3, P4),表 seriesOfPoints(IndexId, P1, P2、P3、P4)和给定的数字 Eta(最大距离)。我应该创建什么索引来优化这个查询:

从 seriesOfPoints 中选择 IndexId
其中 dist(P1, p1) + dist(P2, p2) + dist(P3, p3) + dist(P4, p4)

dist(P, p) = sqrt((x-X)^2+(y-Y)^2)。
所需的索引将基于 R-tree,但据我搜索,SQL Server 中没有这样的索引。我该如何改进这个查询?

【问题讨论】:

    标签: sql search optimization indexing distance


    【解决方案1】:

    我认为没有有助于提高查询性能的数据库索引。由于您的选择(WHERE 子句)基于函数,因此必须测试所有行以验证条件是否为真。

    您可以使用整个公式在表格上添加一个计算列(请参阅this) (dist(P1,p1) + dist(P2, p2) + dist(P3, p3) + dist(P4, p4))。然后你可以在这个新列上创建一个索引。

    之后,您的WHERE 子句将只是一个简单的less than 条件,没有任何功能。 也许这可以改善您的查询。

    【讨论】:

    • max(dist())
    • 我没看懂评论。
    • 搜索符合条件的系列: dist(P1, p1)
    • 您可以将索引放在列上。因此,点上的索引不会给性能带来任何价值,因为所有行都会被一一检查。这个想法是从查询中删除函数。