Выполнение объединения даты и времени в метку времени - PullRequest
0 голосов
/ 27 октября 2018

Oracle 12C, без разделов, без ASM.

Это фон.У меня есть таблица с несколькими столбцами, 3 из которых -

TRAN_DATE                             DATE
TRAN_TIME                             TIMESTAMP(6)
FINAL_DATETIME                        NOT NULL TIMESTAMP(6)

В таблице около 70 миллионов записей.То, что я хочу сделать, - это объединить поле tran_date и tran_time и обновить поле final_datetime с этим выводом для всех 70 миллионов записей.

Это мой запрос -

update MYSCHEMA.MYTAB set FINAL_DATETIME = (to_timestamp( (to_char(tran_date, 'YYYY/MM/DD') || ' ' ||to_char(TRAN_TIME,'HH24MISS') ), 'YYYY-MM-DD HH24:MI:SS.FF'))

Например:

В настоящее время (для одной записи)

TRAN_DATE=01-DEC-16
TRAN_TIME=01-JAN-70 12.35.58.000000 AM    /*I need only the time part from this*/
FINAL_DATETIME=22-OCT-18 04.37.18.870000 PM

Отправьте запрос - для FINAL_DATETIME должно быть

01-DEC-16 12.35.58.000000 AM

Для to_timestamp требуется 2 символастроки, и я боюсь, что это сильно замедлит обновление.Есть предложения?

Что еще можно сделать, чтобы повысить производительность?Никто больше не будет использовать таблицу в этот момент, поэтому у меня есть возможность

  • Удалить индексы
  • Отключить ведение журнала

    ивсе, что кто-либо может предложить.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 28 октября 2018

Я бы предпочел метод CTAS, и ваша работа была бы проще, если бы в вашей таблице не было индексов, триггеров и ограничений.

Создайте новую таблицу для столбца, который нужно изменить.

CREATE TABLE mytab_new
NOLOGGING
     AS
      SELECT /*+ FULL(mytab) PARALLEL(mytab, 10) */ --hint to speed up the select.
       CAST(tran_date AS TIMESTAMP) + ( tran_time - trunc(tran_time) ) AS final_datetime
          FROM mytab;

Я включил только один ( последний ) столбец в новую таблицу, потому что сохранение двух других в новой таблице - пустая трата ресурсов.Вы можете включить в select другие столбцы, кроме двух теперь избыточных.

Read logging / nologging , чтобы узнать о опции NOLOGGING в выборе.

Следующий шаг - перестроить индексы, триггеры и ограничения для новой таблицы new_mytab, используя определение из mytab для других столбцов, если они существуют.

Затем переименуйте таблицы

rename mytab     to mytab_bkp;

rename mytab_new to mytab;

Вы можете сбросить таблицу mytab_bkp после проверки новой таблицы или позже, когда почувствуете, что она вам больше не нужна.

Демо

...