我在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
和end>2
的范围扫描。
(额外的上下文:开始/结束实际上是日期,这个查询机制允许有效的“最新截至日期”查询,而不是像选择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。我需要使用类似psuedocolumn的东西,我可以自己定义:
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子句返回一个值,我认为子查询会失去通过在一个select中完成所有操作而获得的索引效率。
答案 0 :(得分:0)
尝试类似:
select
prim_key,
case when start = 3 then 'a3' else 'a-2' end pseudo
from
you_table
where
...