我们有一个“审计”表,我们在其中创建了很多行。我们的持久层查询审计表序列以在审计表中创建一个新行。每天创建数百万行,select语句从序列中获取下一个值是我们执行率最高的十大查询之一。我们希望减少数据库往返次数,以便在审计表中插入新行之前获取序列的下一个值(主键)。我们知道您无法从JDBC批量选择语句。是否存在减少数据库往返以获得序列下一个值的常用技术?
答案 0 :(得分:2)
通过单个选择预先获得一对(例如1000)序列值:
select your_sequence.nextval
from dual
connect by level < 1000
缓存获取的序列并将其用于接下来的1000个审核插入。 当你用完了缓存的序列值时重复这个。
答案 1 :(得分:1)
跳过序列的select语句,并在insert语句本身中生成序列值。
insert (ID,..) values (my_sequence.nextval,..)
无需额外选择。如果你需要序列值,可以通过添加一个返回子句来获取它。
insert (ID,..) values (my_sequence.nextval,..) returning ID into ..
通过指定序列的缓存值来节省一些额外的时间。
答案 2 :(得分:0)
我建议你改变&#34; INCREMENT BY&#34;序列的选项并将其设置为100之类的数字(您必须决定序列必须采用的步长,100就是一个例子。) 然后实现一个名为SequenceGenerator的类,在这个类中,你有一个包含nextValue的属性,并且每100次调用一次sequence.nextVal,以使db序列保持最新。 通过这种方式,您将为序列nextVal
每100次插入数据进行db每次应用程序启动时,都必须使用sequence.nextVal初始化SequenceGenerator类。
这种方法的唯一缺点是,如果您的应用程序因任何原因停止,您将丢失一些序列值,并且您的ID将存在间隙。但如果你没有id值的商业逻辑,这不应该是一个逻辑问题。