调用返回SYS_RECURSOR或调用查询的过程是否有性能改进?
例如

CREATE OR REPLACE PROCEDURE my_proc
(
  p_id number,
  emp_cursor IN OUT SYS_REFCURSOR
)
AS
BEGIN

OPEN emp_cursor for
select * from emp where emp_number=p_id
end;
/

并通过注册Java参数从OUT调用上述内容,传递IN参数并获取结果。
或者
Java通过
preparedStatement = prepareStatement(connection, "select * from emp where emp_number=?", values);
resultSet = preparedStatement.executeQuery();

emp呼叫,上面哪一个是更好的选择?

最佳答案

假设prepareStatement方法对所有绑定变量使用适当的类型,则性能没有差异。也就是说,根据参数的数据类型,您需要确保正在调用setLongsetDatesetString等。如果数据绑定不正确(即调用setString绑定数值),则可能会强制Oracle进行数据类型转换,这可能会阻止优化器使用可提高性能的索引。
然而,从代码组织和维护的角度来看,我更希望查询在数据库中,而不是在Java应用程序中。例如,如果您发现查询使用了一个糟糕的计划,那么对于dba来说,如果查询位于存储过程中,那么解决这个问题可能要比将查询嵌入到java应用程序中容易得多。如果查询存储在数据库中,您还可以使用数据库的依赖项跟踪函数来更容易地执行影响分析,如果您需要执行一些操作,例如确定如果emp表需要更改将影响什么。

10-07 12:22
查看更多