java.sql.date, предикат java.sql.timestamp -> тип данных раздела Oracle

1

Привет, у нас был большой объект столбца 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;

Мой вопрос: вы столкнулись с такой проблемой? Если так, вы можете направить меня к некоторым документам.

Теги:
jdbc
database-partitioning

2 ответа

1
Лучший ответ

Описанный вами случай документирован в разделе 8 - Сопоставление типов SQL и Java "Начало работы с API JDBC"

8.3.12 DATE, TIME и TIMESTAMP

Поскольку стандартный 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, добавляя поле наносекунд.

  • 0
    Хотя это хорошая информация о типах jdbc, она не помогает со спецификой типа DATE в Oracle и того, как он отображается на типы jdbc.
  • 0
    Логика картирования была представлена. Не требуется писать о том, как детали реализации могут отличаться. Чтобы использовать специфику типа Oracle DATE, вы должны выйти из Java API и работать с пакетом oracle.sql . ИМХО, это не тот случай, так как это делается внутри драйвера.
Показать ещё 3 комментария
1

Руководство разработчика 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()));

Ещё вопросы

Сообщество Overcoder
Наверх
Меню