java JDBC Oracle查询。使用setInt()而不是setObject()执行时速度较慢
我有以下代码片段:
public static void main(String[] args) throws SQLException {
Connection c = getConnection();
long time = System.currentTimeMillis();
PreparedStatement ps = c.prepareStatement(sqlQuery);
int index = 1;
for (String param: parameters) {
if (isInt(param)) {
//ps.setInt(index++, Integer.parseInt(param));
ps.setObject(index++, Integer.parseInt(param), java.sql.Types.NUMERIC , 0);
} else {
ps.setString(index++, param);
}
}
displayResult(ps.executeQuery());
System.out.println("It took " + (System.currentTimeMillis()-time) + ".");
time = System.currentTimeMillis();
Statement s = c.createStatement();
ResultSet rs = s.executeQuery(expandParametersInStatement(sqlQuery, parameters));
displayResult(rs);
System.out.println("It took " + (System.currentTimeMillis()-time) + ".");
}
使用PreparedStatement执行的查询速度慢了4000倍。与声明方法相比。它们给出相同的结果,执行顺序也没有太大区别
使用setObject()而不是setInt()可以使PreparedStatement与语句一样快
有什么区别?数据库中的强制转换不会那么昂贵吗?数据库中的数据类型是数字(10)。我想这是使用的索引的问题。但是,我不能在SQL Developer中使用CAST(x作为整数)复制这个
谢谢
声明如下:
private static String sqlQuery = "SELECT sum(value) " +
"FROM a monat, " +
" n jahr, " +
" kunde kunde " +
"WHERE monat.kunde_nr IN " +
" (SELECT DISTINCT kunde.kunde_nr " +
" FROM MASKE_4_KUNDEN kunde " +
" WHERE kunde.firma_nr = ? " +
" AND kunde.verkaufsbereich_nr = ? " +
" AND kunde.vertriebsbereich_nr BETWEEN (CASE WHEN ? <> -1 THEN ? ELSE -9999999999 END) AND (CASE WHEN ? <> -1 THEN ? ELSE 9999999999 END) " +
" AND kunde.vertreter_nr BETWEEN (CASE WHEN ? <> -1 THEN ? ELSE -9999999999 END) AND (CASE WHEN ? <> -1 THEN ? ELSE 9999999999 END)" +
" AND kunde.konzern_nr BETWEEN (CASE WHEN ? <> -1 THEN ? ELSE -9999999999 END) AND (CASE WHEN ? <> -1 THEN ? ELSE 9999999999 END) " +
" AND kunde.geschaeftsjahr = ? " +
" AND kunde.kunde_nr BETWEEN (CASE WHEN ? <> -1 THEN ? ELSE -9999999999 END) AND (CASE WHEN ? <> -1 THEN ? ELSE 9999999999 END))" +
" AND monat.firma_nr = ? " +
" AND monat.verkaufsbereich_nr = ? " +
" AND monat.jahr_nr = ? " +
" AND jahr.kunde_nr = monat.kunde_nr " +
" AND jahr.firma_nr = monat.firma_nr " +
" AND jahr.jahr_nr = monat.jahr_nr " +
" AND jahr.verkaufsbereich_nr = monat.verkaufsbereich_nr " +
" AND kunde.kunde_nr = monat.kunde_nr " +
" AND kunde.firma_nr = monat.firma_nr";
# 1 楼答案
setInt()方法接收int作为第二个参数(不是整数)。现在,我知道自动装箱应该是有效的,但显然它并不总是有效:http://www.coderanch.com/t/550628/JDBC/java/setInt-String-int-Lost 我的猜测是,它在较旧版本的JDBC中不起作用,在较新版本中也起作用,但仍然存在bug。。。 我会尝试使用整数。intValue()并查看它是否工作得更好
如果有人在这方面有更多的意见,我很乐意听到
# 2 楼答案
在Oracle数据库10.2.0.4.0上,我们也观察到了同样的行为,即准备好的语句只有setString()语句
问题已完全解决将jdbc驱动程序从10.2.0.3.0更新为10.2.0.4.0