Oracle. Приводит ли удаление большого количества строк к аналогичному конфликту индексов из-за вставки большого количества строк?

В Oracle RDBMS, если вы используете несколько потоков для вставки очень большого объема данных, которые влияют на один сегмент индекса (например, обычный индекс в неразделенной таблице или локальный индекс в многораздельной таблице), вставки станут медленный из-за разногласий по индексу. Каждый поток конкурирует за защелки и блокировки в индексе, что является основной причиной проблемы с производительностью. Эту проблему можно решить, разделив таблицу на разделы и запустив по одному потоку на раздел, который вставляет подмножество очень больших данных.

Есть ли такая же проблема при удалении очень большого объема данных? Я думаю, что удаление также требует блокировки подмножества индекса, что заблокирует другие потоки, которые вставляют/удаляют в этом подмножестве. Однако мне не ясно, аналогична ли степень блокировки при выполнении удаления степени блокировки при выполнении вставки. Возможно, количество блокировок намного меньше или время, необходимое для блокировки, меньше, и, следовательно, конкуренция также будет намного меньше.

Возможно, есть и другие случаи, которые следует учитывать: возможно, удаления блокируют другие удаления, но, возможно, удаления не блокируют другие вставки, потому что, скорее всего, параллельное удаление и вставка не будут работать с одними и теми же блоками данных.

Любые ссылки были бы замечательными.


person Matthew Moisen    schedule 20.02.2021    source источник
comment
Я думаю, что было бы трудно понять сложность внутренних структур данных Oracle DB. Вы можете проверить планы выполнения соответствующих операторов SQL, чтобы понять, сколько это будет стоить. Хотя это вряд ли даст вам точный ответ, поскольку планы выполнения в основном будут отслеживать фактическую стоимость извлечения данных, а не фактическую стоимость модификации данных (вставка/удаление).   -  person biqarboy    schedule 20.02.2021


Ответы (2)


Вы можете сделать: 1.

  • Начните очищать все индексы в начале, просто удалите их.
  • Выполните свои потоки.
  • Когда процесс завершится, вы можете создать индекс, в зависимости от того, секционирован он или нет, вы можете создать его как ЛОКАЛЬНЫЙ. Удаление и создание выполняют те же действия, что и обновление. Если вы хотите вставить данные с индексами, это приведет к потере большого количества времени. W Индексы всегда должны очищаться перед вставкой данных.
  • Create partitions into your table.
  • Ссылка на создание наиболее важных полей для вашего раздела.
person Vahram Danielyan    schedule 21.02.2021

Удаление большого количества строк в Oracle является на удивление дорогостоящей операцией.

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

Как сказал Ваграм, при определенной сумме некоторые люди отключают индекс (ALTER INDEX xxx UNUSABLE), удаляют строки и перестраивают индекс (ALTER INDEX xxx REBUILD).

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

person wolφi    schedule 04.04.2021