1

我有一个这样的查询:

String sql = "DELETE FROM " + table.getName().quoted() + " WHERE modificationTime < ? AND ROWNUM < " + (objectsPerCommit + 1);
PreparedStatement statement = connection.prepareStatement(sql);
statement.setObject(1, ...timestamp_value..., ...timestamp_type...);
boolean result = statement.execute();
...
statement.close();

所以我执行的SQL基本上是:

  DELETE
  FROM
    mytable 
  WHERE
    modificationTime < to_date('2014-06-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS') 
    AND ROWNUM <= 10000;

此查询运行速度非常非常慢,因为它没有使用修改时间和其他两个列上的现有组合索引。相反,它会进行全表扫描。如果我通过如下所示的提示强制使用所述索引,则一切运行顺利。

  DELETE /*+ index(mytable PK_MYTABLE) */
  FROM
    mytable 
  WHERE
    modificationTime < to_date('2014-06-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS') 
    AND ROWNUM <= 10000;

我的问题是:这对 OJDBC 有效吗?我可以简单地将代码更改为:

String sql = "DELETE /*+ index(mytable PK_MYTABLE) */ FROM " + table.getName().quoted() + " WHERE modificationTime < ? AND ROWNUM < " + (objectsPerCommit + 1);
...

一切都按预期工作?或者 OJDBC 会以某种方式删除评论/提示?

4

1 回答 1

1

是的当然。支持提示 > http://docs.oracle.com/cd/E11882_01/java.112/e16548/instclnt.htm#JJDBC28224

于 2014-07-01T12:48:01.040 回答