У меня есть таблица, содержащая столбец TIMESTAMP (6) WITH TIME ZONE, а также столбец INTERVAL DAY (4) TO SECOND (0). Для ясности предположим следующий DDL:

CREATE TABLE TEST_TABLE
(
 time_col TIMESTAMP(6) WITH TIME ZONE,
 interval_col INTERVAL DAY(4) TO SECOND(0)
);

Эта таблица содержит индекс, который использует эти два столбца:

CREATE INDEX IDX_DELAY ON TEST_TABLE(time_col+interval_col);

При запуске этого DDL Oracle создает индекс, но неявно добавляет функцию SYS_EXTRACT_UTC:

CREATE INDEX IDX_DELAY ON TEST_TABLE(SYS_EXTRACT_UTC(time_col+interval_col));

Такой же DDL раньше выполнялся в других базах данных, а функция SYS_EXTRACT_UTC отсутствует. Я не знаю, были ли базы данных перенесены из более старых версий Oracle, но в настоящее время все они работают на 12c (12.1.0.2.0). Я сбросил индекс на одном из них и воссоздал его, что заставило Oracle добавить функцию SYS_EXTRACT_UTC.

Почему так происходит? Изменилось ли поведение в предыдущих выпусках Oracle DB? Кроме того, как может повлиять наличие этой функции в индексе (или ее отсутствие)?

Заранее спасибо!

3
Bernardo Lopes 12 Фев 2021 в 22:52

1 ответ

Лучший ответ

Так или иначе, чтобы создать индекс, вы должны иметь возможность сравнивать значения друг с другом (решать, равны ли они, или решать, какое из них больше, а какое меньше). Чтобы сравнить отметки времени с часовым поясом, вы должны преобразовать их в один часовой пояс; UTC кажется естественным выбором.

Я не могу сказать, действительно ли Oracle в старых версиях хранила метки времени с часовым поясом в индексе, не конвертируя их сначала в стандартный часовой пояс; возможно, это так, и поэтому вы не видите SYS_EXTRACT_UTC в старых версиях. Если это так, то хорошо, что кому-то пришла в голову < sizesgood идея использовать эту функцию и сохранить нормализованные отметки времени в индексе. Это делает все проще и эффективнее.

Конечно, также возможно, что Oracle делал это все время, и только недавно они решили показать нам , что именно он делает.

В любом случае, я не вижу причин, по которым вы могли бы беспокоиться об этом. Что вас беспокоит?

РЕДАКТИРОВАТЬ - поиск в Google привел меня к статье Джонатана Льюиса; он говорит, что начал писать об этом в 2013 году, когда был выпущен Oracle 12. Возможно, это совпадение, или, возможно, что-то изменилось в этой версии (либо фактический способ создания / хранения индекса, либо то, что Oracle хочет показать нам ).

https://jonathanlewis.wordpress.com/2019/05/29/timestamp-oddity/

3
mathguy 12 Фев 2021 в 20:56