Pull to refresh

Comments 5

В DWH нет операции update, вместо неё используется delete+insert. В оракле обновляюмую партицию можно держать отдельной небольшой таблицей, даже без индексов (Кимбал - статья партиции реального времени), объединить её с основной таблицей в представлении, которое дать пользователям. Потом, когда ночью будет время данные перегружаются из неё в основную таблицу, эта таблица очищается.

Суть в том. Что переключение партиций позволяет делать все на горячую. И не нужно прыгать со вью поверх таблиц и ждать ночи. Все можно делать днём. В отличие от Delete+Insert.

Но саму идею двух таблиц view_total = main + inc и мы применяем на практике. Но после проверок горячего наката, поняли, что для exchange все можно делать на горячую. DBA не прибегали/пользователи таблиц проблем не выявили. Нагрузочные тесты также не расходились и не убивали базу.

Несколько замечаний по тексту про Oracle:

  1. Все же документация находится по адресу docs.oracle.com.

  2. При обмене производится переназнаение на уровне сегментов: сегмент, относящийся к таблице, заменяется сегментом, относящимся к партиции. В связи с этим все характеристики сегмента для подмененного наследуются с таблицы. Если, например, в имени тейблспейса есть какая-то логика, то нужно аккуратно создавать промежуточную таблицу.

  3. Начиная с версии 12.2 можно подготовить таблицу с нужной структурой используя инструкцию `for exchange with table` команды `create table`.

  4. После операции `exchange [sub]partition` данные никуда физически не удаляются (см. пункт 2): они начинают относиться к промежуточной таблице: https://dbfiddle.uk/sGnmqhB1

Спасибо. Учел замечания.

Частичное обновление больших объемов данных в таблицах, которые активно используются пользователями на чтение осуществляется без всяких партиций выбором такого движка СУБД, который блокирует на чтение только ту строку, для которой сейчас идёт update, оставляя все остальные строки таблицы доступными для чтения.

Sign up to leave a comment.

Articles