【发布时间】:2014-06-30 13:27:15
【问题描述】:
我遇到的问题很简单:
我有一组数据集。每个数据集内都有一组点。每组点都是一个相同的 6 公里间隔网格(这个网格永远不会改变)。每个点都有一个关联的值。每个数据集都是不相关的,因此可以将问题视为只是一组点。
如果一个点的值超过了预定义的阈值,那么这个点必须在一个oracle空间数据库中查询,以找到该点一定距离内的所有线段。
这是一个足够简单的问题来解决。
线段有一个非唯一的 ID,这允许它们组合成大小为 1 到 700 个线段的要素(这都是预定义的拓扑)。
最终我需要知道哪些特征 ID 与哪些点匹配,以及每个特征与每个点匹配的线段数。
就数据集大小而言:
- 大约有 200 个数据集。
- 每个数据集有 56,000 个点。
- 空间索引数据库中有超过 180,000 条线段。
- 线段可以分为总共 1900 个要素。
- 通常每个数据集超过阈值的点数不会超过 10^3 个。
我已经创建了一个解决方案,它可以正常工作, 但是我对整体运行时间不满意 - 每个数据集大约需要 3 分钟。
通常我不介意预计算任务需要那么长时间,但由于限制,该任务的运行时间不能超过一个小时,理想情况下只需要 1/2 个小时。
目前我使用 SDO_WITHIN_DISTANCE 进行查询,我对每个超过阈值的点运行此查询:
SELECT id, count(shape) AS segments, sum(length) AS length
FROM (
SELECT shape, id, length
FROM lines_1
UNION ALL
SELECT shape, id, length
FROM lines_2
)
WHERE SDO_WITHIN_DISTANCE(
shape,
sdo_geometry(
3001,
8307,
SDO_POINT_TYPE(:lng,:lat, 0),
null,
null
),
'distance=4 unit=km'
) = 'TRUE'
GROUP BY id
这个查询大约需要 0.4 秒的时间来执行,这还不算太糟糕,但它会为单个数据集加起来,并在所有数据集上复合。
我对 Oracle 空间数据库没有过多的经验,所以我不知道如何提高速度。
请注意,我无法更改传入点集的格式,也无法更改数据库的格式。
我能想到的唯一加速它的方法是预先计算每个点的查询并将其存储在一个单独的表中,但我宁愿不这样做,因为它或多或少会创建另一个副本数据。
所以问题是 - 有没有更好的查询方法?
【问题讨论】: