我在 oracle 数据库中有一个大型数据集,当前一次从 Java 访问一个项目。例如,如果用户尝试批量获取 50 个项目,它将按顺序处理它们,为每个项目调用一个存储过程。我现在正在尝试实现批量获取,但由于用户可以传入范围查询的方式而遇到了一些困难:
一个示例表:
prim_key | identifier | start | end
----------+--------------+---------+-------
1 | aaa | 1 | 3
2 | aaa | 3 | 7
3 | bbb | 1 | 5
它的工作方式是,如果您有类似的查询(id='aaa' and pos=1)
,它将找到prim_key = 1
,但如果您查询(id='aaa' and pos=2)
,它将找不到任何东西。如果你这样做(id='aaa' and pos=-2)
了,它会再次找到 prim_key=1 因为存储的过程将 -2 转换为等效于start<=2
and的范围扫描end>2
。
(额外的上下文:开始/结束实际上是日期,这种查询机制允许有效的“最新日期”查询,而不是执行类似 select prim_key 之类的操作,
start from myTable
where start = (select max(start) from myTable where start <= 2))
这一切都很好,并且对于单次获取可以正常工作,但是现在我正在尝试批量获取,以便我们可以大大加快批处理速度。第一次尝试是对单个调用进行多线程处理,但它给数据库带来了太大的压力,无法在同一张表上执行如此多的并行查询。为了解决这个问题,我一直在尝试创建一个类似的查询
select prim_key
from myTable
where (identifier='aaa' and start=3)
or (identifier='aaa' and start<=2 and end>2)
从输入参数列表中构建它('aaa',3 ; 'bbb',-2)
,它运行良好并使用我期望的所有索引生成解释计划。
我的问题:我需要知道检索该行的输入参数是什么,以便进行进一步处理并返回相关的 prim_key。我需要使用可以定义自己的伪列之类的东西:
select prim_key, PSUEDO
from myTable
where (identifier='aaa' and start=3 and PSUEDO='a3')
or (identifier='aaa' and start<=2 and end>2 and PSUEDO='a-2')
但是我找不到从 where 子句返回值的任何方法,而且我认为子查询会失去通过一次选择完成所有操作所获得的索引效率。