通过java检索序列nextVal比在表上触发select查询要快吗?

时间:2017-10-04 10:26:51

标签: java oracle

我正在尝试从我的Java代码中检索序列值。

Select sequence.nextVal from dual;

此查询的执行速度是否比任何表的正常选择查询都快? 我很困惑,因为序列的值被缓存。那么,他们是否将这些值存储在RAM中,因此检索速度更快?

感谢。

2 个答案:

答案 0 :(得分:2)

您正试图通过询问什么更快来过早地优化解决方案。无论答案如何,外部应用程序(例如Java)与Oracle数据库之间的请求可能比在数据库中检索序列或查询的速度要慢。

在查看数据库的某个内部部分是否会为您节省几微秒时,减少从Java到数据库的调用次数,因为它需要缓存值而不是从硬盘驱动器中查找它。

  

我需要刚插入应用程序的序列的值。所以,我正在从序列中检索值,然后通过触发另一个插入查询来插入该值。还有其他办法吗?

使用存储过程来防止Java和Oracle之间的多次往返:

CREATE PROCEDURE add_data(
  in_value1      IN  YOUR_TABLE.VALUE1%TYPE,
  in_value2      IN  YOUR_TABLE.VALUE2%TYPE,
  in_other_value IN  OTHER_TABLE.VALUE%TYPE,
  out_id         OUT YOUR_TABLE.ID%TYPE,
  out_succcess   OUT VARCHAR2
)
IS
BEGIN
  INSERT INTO your_table ( id, value1, value2 )
  VALUES ( your_table_seq.NEXTVAL, in_value1, in_value2 )
  RETURNING id INTO out_id;

  INSERT INTO other_table( id, value )
  VALUES ( out_id, in_other_value );

  out_success := 'Ok'
EXCEPTION
  WHEN DUP_VAL_ON_INDEX THEN
    ROLLBACK;
    out_id      := NULL;
    out_success := 'Already exists!'; -- Handle exceptions
END;
/

答案 1 :(得分:0)

因为序列被缓存到数据库缓冲区缓存中,所以访问下一个值非常快。 您需要调整序列缓存以适应工作负载,以避免等待oracle生成新的序列号。 查询序列与普通查询无法比较。