我遇到的问题很简单:
我有一组数据集。每个数据集都包含一组点。每组点都是一个相同的6千米间隔网格(此网格永远不会改变)。每个点都有一个相关的值。每个数据集都是无关的,所以问题可以看作只是一组点。
如果某个点的值超过预定义的阈值,则必须针对oracle空间数据库查询该点,以查找该点的特定距离内的所有线段。
这是一个很容易解决的问题。
线段具有非唯一ID,允许将它们组合成大小为1到700个段的要素(它是所有预定义的拓扑)。
最终,我需要知道哪些要素ID与哪些点匹配,以及每个要素与每个点匹配的线段数。
就数据集大小而言:
我已经创建了一个解决方案并且它可以正常工作, 但是我对整个运行时间不满意 - 每个数据集大约需要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空间数据库没有太多经验,所以我不确定如何提高速度。
请注意,我无法更改传入点集的格式,也无法更改数据库的格式。
我能想到的加速它的唯一方法是预先计算每个点的查询并将其存储在一个单独的表中,但我宁愿不这样做,因为它或多或少会创建另一个副本数据
所以问题是 - 有更好的方法来进行查询吗?
答案 0 :(得分:0)
我最终将查询预先计算到下表中。
+---------+---------+
| LINE_ID | VARCHAR |
| LAT | FLOAT |
| LNG | FLOAT |
+---------+---------+
有太多的多线段可以提高效率。
通过预先计算,我可以在表格中查找相关的ID(最终是我所关心的)。
查询时间不到1/10,因此速度更快。
最终,每周必须重新计算点到ID映射的权衡(大约需要2个小时)值得加快。