我有一个这样的查询:
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 会以某种方式删除评论/提示?