Привет, у нас был большой объект столбца Oracle, и мы разделили его на Data Type of DATE
Один из разделов выглядит следующим образом:
GCP_P1 TO_DATE(' 2011-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 83 M_DATA01 DISABLED 348132 15214 146 08.06.2014 02:20:40 1078 0
Каждый раздел длится одну неделю.
Мы запускаем наш sql через тонкий клиент с jdbc. Нет ORM только чистый jdbc.
Когда наш предикатный элемент для секционированного столбца - java.sql.timestamp, мы поняли, что запрос не пользуется разделом. Однако, когда он имеет тип java.sql.date, план выполнения показывает успешный доступ к разделу.
Так, например, наш sql выглядит так:
SELECT COUNT(1) FROM ATABLE WHERE PARTITIONED_COLUMN > ?
Когда наше выражение java:
preparedStatement.setDate(...); // it benefits from partition
Но когда это так:
preparedStatement.setTimestamp(...); //it does not benefits from partition
Я смотрю их от Жабы. Я испытал это, когда он java.sql.date, он интерпретируется как DATE на oracle, когда он является java.sql.timestamp, он интерпретируется как TIMESTAMP
Я следую за записанным типом даты jdbc со следующим оператором sql
SELECT *
FROM V$SQL_BIND_CAPTURE
WHERE WAS_CAPTURED = 'YES' AND LAST_CAPTURED BETWEEN SYSDATE-1/50 AND SYSDATE
ORDER BY LAST_CAPTURED DESC;
Мой вопрос: вы столкнулись с такой проблемой? Если так, вы можете направить меня к некоторым документам.
Описанный вами случай документирован в разделе 8 - Сопоставление типов SQL и Java "Начало работы с API JDBC"
Поскольку стандартный Java-класс java.util.Date точно не соответствует ни одному из этих трех типов даты и времени JDBC (он включает в себя как данные DATE, так и TIME, но не имеет наносекунд), JDBC определяет три подкласса java.util.Date для соответствия типы SQL. Они есть:
java.sql.Date
для информации SQL DATE. Поля часа, минуты, секунды и миллисекунды базового класса java.util.Date должны быть установлены на ноль. Если количество миллисекунд, переданных в конструктор java.sql.Date, отрицательно, драйвер вычисляет дату как число миллисекунд до 1 января 1970 г. В противном случае дата вычисляется как указанное количество миллисекунд после 1 января, 1970.
java.sql.Time
для информации SQL TIME. Поля года, месяца и дня базового класса java.util.Date установлены в 1970, январе и 1. Это "нулевая" дата в эпоху Java.
java.sql.Timestamp
для информации SQL TIMESTAMP. Этот класс расширяет java.util.Date, добавляя поле наносекунд.
Руководство разработчика oracle jdbc содержит сопоставление типов jdbc с типами данных oracle. Из-за его сложности существует раздел, специфичный для типа данных DATE. Он имеет следующее примечание:
В Oracle Database 11g, если у вас есть индекс столбца DATE, который будет использоваться SQL-запросом, то для получения более быстрых и точных результатов вы должны использовать метод setObject следующим образом:
Date d = parseIsoDate(val);
Timestamp t = new Timestamp(d.getTime());
stmt.setObject(pos, new oracle.sql.DATE(t,(Calendar)UTC_CAL.clone()));
oracle.sql
. ИМХО, это не тот случай, так как это делается внутри драйвера.