我希望有人澄清我的以下问题。
1)目前我正在从java代码调用过程并获取结果集。要迭代500个记录,需要20秒。我尝试了各种fetchSize,如50,100,300,501,2000,4000但没有改进。有人可以就此提出建议。
2)使用查询代替过程会改善结果集迭代性能吗?
3)还有其他建议吗?
代码段:
CallableStatement callableStatement =((SessionImpl)getSessionFactory().getCurrentSession()).connection().prepareCall("{ call Proc(?,?,?) }");
callableStatement.registerOutParameter(1, OracleTypes.CURSOR);
callableStatement.setString(2,searchText.toLowerCase());
callableStatement.setInt(3, 500);
logger.debug("Before Query Execution");
callableStatement.executeUpdate();
logger.debug("After Query Execution:");
callableStatement.setFetchSize(501);
rs = (ResultSet)callableStatement.getObject(1);
logger.debug("Iterating ResultSet Starts");
Bean bean = null;
while(rs.next()){
logger.debug(“some logic but commented to check performance”);
}
答案 0 :(得分:0)
那么你的程序返回一个最多包含500行的游标? (callableStatement.setInt(3, 500);
)。你为什么要用复杂的方法?
为什么不使用纯光标?使用生产者 - 消费者设计模式时,游标是有效的。如果你想" slurp"一些大量的数据,你也可以使用COLLECTION类型。让我们说,如果记录小于10000,则集合可能比光标更有效。但是简单的纯SQL语句应该是最快的。
你应该首先确定你的瓶颈。它可以是:
PS:你的程序的源代码非常有用 PS1:如果你想使用生产者 - 消费者模式,你也应该使用FIRST_ROWS_N优化器目标。