У меня есть такой запрос:
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 каким-то образом отбросит комментарий/подсказку?
Да, конечно. Подсказки поддерживаются> http://docs.oracle.com/cd/E11882_01/java.112/e16548/instclnt.htm#JJDBC28224