首页 > 解决方案 > 有没有办法在 PL SQL 中本地缓存和过滤表?

问题描述

我不得不在 ORACLE 11g 中处理一个包含大约 500 万条记录的表。这些记录是沿分开的高速公路的速度限制。有 SpeedLimitId、HighwayId 和 from mile post 和 to mile post 来描述应用限速的区域。目前所有的记录都只在分开的高速公路的一侧,需要处理这些记录才能将它们也应用到另一侧。有一个测量方程表可以让我们知道高速公路一侧的测量范围等于高速公路另一侧的测量范围。这允许我们通过计算测量值在测量范围内的百分比,然后在对侧找到相同的范围百分比来计算速度限制事件将在另一侧的测量值。限速记​​录可以包含在一个测量方程记录中,也可以跨越多个测量方程记录。根据限速表中的信息和度量方程,需要在第三个表中插入一条或多条记录。

速度极限

+--------------+------------+--------------+------- -----+------------+--------+
| SpeedLimitId | 公路编号 | FromMilePost | 里程邮报 | 限速 | 车道 |
+--------------+------------+--------------+------- -----+------------+--------+
| 1 | 75N | 115 | 123 | 60 | 南 |
+--------------+------------+--------------+------- -----+------------+--------+

MEASURE_EQUATION

+------------+----------------+------------+------ --+-------+----------------+------------+---------+ --------+------------------+
| 方程 ID | 北公路编号 | NFromMile | NToMile | 增益 | SouthHighwayId | SFromMile | SToMile | 增益 | IsHighwayDivided |
+------------+----------------+------------+------ --+-------+----------------+------------+---------+ --------+------------------+
| 1 | 75N | 105 | 120 | 15 | 75S | 100 | 110 | 10 | 没有 |
| 2 | 75N | 120 | 125 | 5 | 75S | 110 | 125 | 15 | 是 |
| 3 | 75N | 125 | 130 | 5 | 75S | 125 | 130 | 5 | 没有 |
+------------+----------------+------------+------ --+-------+----------------+------------+---------+ --------+------------------+

根据 SPEED_LIMIT 和 MEASURE_EQUATION 表中的信息,将需要在第三个表中插入至少一条但最多可插入三条记录。由于字段中的值不同,可能会出现十几种不同的情况。
使用上面的数据,您可以看到 SpeedLimitId 1 被标记为位于高速公路的南侧,但它当前位于北侧,并且它还跨越了 ID 为 1 和 2 的 2 个方程记录。在此在这种情况下,它跨越两个测量范围,因为一条单独的道路分裂并成为分割的高速公路。我们需要将原始记录拆分为两个事件,并将它们添加到第三个处理表中,并计算南行车道的新度量。

SPEED_LIMIT_PROCESSING

+--------------+------------+-------+----------+--- -----+
| SpeedLimitId | 公路编号 | 车道 | 从英里 | 万里 |
+--------------+------------+-------+----------+--- -----+
| 1 | 75N | 北 | 115 | 120 |
| 1 | 75S | 南 | 110 | 119 |
+--------------+------------+-------+----------+--- -----+

南行车道措施的计算方法如下:

+--------------------+---------------- +------------------------------+
| | 来自测量翻译 | 测量翻译 |
+--------------------+---------------- +------------------------------+
| 事件度量为 % | ((120 – 120)/5) * 100 = 0% | ((123 – 120)/5) * 100 = 60% |
| 偏移测量 | ((15 * 0) / 100 = 0 | ((15 * 60) / 100) = 9 |
| 翻译测量 | 110 + 0 = 110 | 110 + 9 = 119 |
+--------------------+---------------- +------------------------------+

我关心的是尽可能以最有效的方式做到这一点。这个想法是遍历 SPEED_LIMIT 表中的每条记录,在度量方程表中选择相应的记录,然后根据这两个表中的信息,我将记录插入到第三个表中。为了限制 PL/SQL 上下文切换,我计划使用“BULK COLLECT 和 FORALL”语句来查询事件表并运行插入语句,这将允许我批量执行操作。缺少的组件是如何获取MEASURE_EQUATION 表中对应的记录,无需对 SPEED_LIMIT 表中的每个记录循环进行 sql 查询。MEASURE_EQUATION 中只有大约 700 条记录,

正如您可能从我的问题中所看到的那样,我在 PL SQL 和 ORACLE 方面相当新,所以也许我正在以完全错误的方式处理它。

标签: oracleplsqloracle11g

解决方案


推荐阅读