2010-10-01 38 views
1

我在使用Java与“ojdbc.jar”作为客户端时出现了一些奇怪的行为。当使用Java/OJDBC时性能巨大

我有一个简单的程序,试图只使用一个查询插入500行。 (一个INSERT ALL FROM dual)。

该程序需要25秒才能在Java中完成。这是statement.execute()方法完成所需的时间。

Wen我从SQLplus/SQLdeveloper运行查询需要不到1秒。

任何想法?

回答

1

听起来就像你正在为每个插入物获得一个新的连接。

+0

我应该在的澄清我的问题。只有一个查询正在执行,它恰好插入了大量的行。 – Will 2010-10-01 23:53:12

0

尽管您的性能问题似乎过分,并且超出了应该导致的性能问题,但值得注意的是,Java JDBC-ODBC驱动程序非常慢。如果可能,请使用数据库的本地驱动程序,因为它们通常会更快。

0

一般而言,您可能希望避免使用非常大的SQL语句,特别是INSERT ALL FROM DUAL技巧。我不知道为什么,但我已经看到几个Oracle需要很长时间才能解析大型SQL语句的案例。出于某种原因“insert into table_name(从double union选择'asdf'所有选择'asdf from dual ...)”似乎效果更好,但它在一段时间后仍然开始减慢。

我曾经计算过不同大小的类似查询,并且解析时间似乎在某些时候呈指数级增长。我相信这是在10.2.0.3.0上。但是我现在不能在10.2.0.1.0上重现这个问题,也许这只是某个特定版本的错误?

我建议您改用UNION ALL版本,并减少每条语句发送的行数。另一个解决方案是构建一个PL/SQL块来执行插入操作。 Oracle似乎比大型SQL更好地解析大型PL/SQL,但该解决方案更为复杂。

(顺便说一句,这可能只是一个巧合,它运行在SQL开发人员更快。由于问题出在分析时,你第二次运行它总是会更快。)

相关问题