gpt4 book ai didi

java - JDBC Oracle 查询。使用 setInt() 而不是 setObject() 执行时速度慢

转载 作者:行者123 更新时间:2023-11-29 09:16:29 27 4
gpt4 key购买 nike

我有以下代码片段:

    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 执行的查询比 Statement 方法慢 4000 倍。它们给出相同的结果,执行顺序没有太大区别。

使用 setObject() 而不是 setInt() 可以使 PreparedStatement 与 Statement 一样快。

有什么区别?数据库中的类型转换不会那么贵吗?数据库中的数据类型是 NUMBER(10)。我想这是使用的索引的问题。但是,我无法使用 CAST(x AS INTEGER) 在 SQL Developer 中复制它?

谢谢。

语句是:

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";

最佳答案

setInt() 方法接收 int 作为第二个参数(不是 Integer)。现在,我知道自动装箱应该有效,但显然它并不总是有效:http://www.coderanch.com/t/550628/JDBC/java/setInt-String-int-Lost我的猜测是它在旧版本的 JDBC 中不起作用,它在新版本中起作用但仍然存在问题......我会尝试使用 Integer.intValue() 看看它是否更好用!

如果有人对此有更多意见 - 我很乐意听到!

关于java - JDBC Oracle 查询。使用 setInt() 而不是 setObject() 执行时速度慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9093870/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com