Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDBC-Oracle查询。使用setInt()而不是setObject()执行时速度较慢_Java_Sql_Performance_Oracle_Jdbc - Fatal编程技术网

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

Java JDBC-Oracle查询。使用setInt()而不是setObject()执行时速度较慢,java,sql,performance,oracle,jdbc,Java,Sql,Performance,Oracle,Jdbc,我有以下代码片段: 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 par

我有以下代码片段:

    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开发人员中将CASTx作为INTEGER复制这一点

谢谢

声明如下:

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作为第二个参数而不是整数接收。现在,我知道自动装箱应该是可行的,但显然它并不总是可行的: 我的猜测是,它在较旧版本的JDBC中不起作用,在较新版本中也起作用,但仍然存在bug。。。 我会尝试使用Integer.intValue,看看它是否工作得更好


如果有人在这方面有更多的意见,我很乐意听到

setInt方法将int作为第二个参数而不是整数接收。现在,我知道自动装箱应该是可行的,但显然它并不总是可行的: 我的猜测是,它在较旧版本的JDBC中不起作用,在较新版本中也起作用,但仍然存在bug。。。 我会尝试使用Integer.intValue,看看它是否工作得更好


如果有人在这方面有更多的意见,我很乐意听到

在Oracle数据库10.2.0.4.0上,我们还观察到了一个准备好的语句,其中只有setString语句


将jdbc驱动程序从10.2.0.3.0更新到10.2.0.4.0时,问题已经完全解决。我们还观察到,在Oracle数据库10.2.0.4.0上,一个准备好的语句只包含setString语句,我们也观察到了相同的行为


将jdbc驱动程序从10.2.0.3.0更新为10.2.0.4.0时,问题已完全解决。请向我们显示实际语句为您添加了查询。但是,这个问题是一般性的,与特定的查询无关。如果在循环中执行相同的测试和/或切换测量顺序,会发生什么?不会立即跳出。当你说与语句相比,你指的是使用文字而不是占位符的版本?在这种情况下,对语句运行解释计划,包括?并将其与使用文字解释的陈述计划进行比较。是的,我的意思是我已经替换了陈述的版本?带文本。请向我们显示为您添加查询的实际语句。但是,这个问题是一般性的,与特定的查询无关。如果在循环中执行相同的测试和/或切换测量顺序,会发生什么?不会立即跳出。当你说与语句相比,你指的是使用文字而不是占位符的版本?在这种情况下,对语句运行解释计划,包括?并将其与使用文字解释的陈述计划进行比较。是的,我的意思是我已经替换了陈述的版本?对于literals.Integer.parseInt返回一个int,也不清楚自动装箱会如何使其速度变慢。@Dmitri parseInt接收一个字符串作为参数,而intValue处理整数本身,这是我所指的选项。但是当然,您可以将parseInt与原始字符串param一起使用,而不是创建一个整数并调用它的int值——您的方法更有效;Integer.parseInt返回一个int。也不清楚自动装箱会如何使它慢得多。@Dmitri parseInt接收一个字符串作为参数,而intValue处理整数本身,这是我所指的选项。但是当然,您可以将parseInt与原始字符串param一起使用,而不是创建一个整数并调用它的int值——您的方法更有效;