Oracle эффективный способ обновления неиндексированной и не разделенной таблицы? - PullRequest
0 голосов
/ 04 марта 2020

Есть ли эффективный способ обновления строк таблицы, в которой нет индексов и разделов (и ~ 50 миллионов строк)?

У меня есть поле даты LOAD_DTTM и значения этого поля для строк, которые требуют обновления (около 2000 различных дат).

Будет ли обновление быстрее, если я укажу дату в предложении WHERE вместе с UNIQUE_ID строки?

Ответы [ 3 ]

1 голос
/ 04 марта 2020

Если вы хотите обновить все или большое количество строк, то самый быстрый способ:

create table my_table_copy as
select ... -- all the columns, updating values as required
from my_table;

drop table my_table;

rename my_table_copy to my_table;

Если в вашей таблице есть какие-либо индексы, ограничения или триггеры, вам теперь нужно будет повторно добавьте их - но, похоже, у вас нет этой проблемы!

0 голосов
/ 05 марта 2020

Ответ НЕТ . Даже если вы указали оба условия в своем предложении WHERE, как вы заявили, это не поможет вам избежать полного сканирования вашей таблицы. Даже если один из ваших критериев будет однозначно определять строку, это все равно не поможет.

Существует реальный пример, проверенный на Oracle 12 C ver.2, похожий на ваш случай. Нет индексов, нет разделов, ничего. Просто простая таблица с 4 столбцами

У меня есть таблица с 18-миллионными записями. У меня также есть CUSTOMER_ID, который является уникальным идентификатором для строки. У меня также есть столбец ORDER_DATE там.

Даже если я выполню запрос, который вы упомянули

update hit set status = 1 where customer_id = 408518625844 and order_date = '09-DEC-19';

, это не поможет мне избежать полного сканирования таблицы. Смотрите ниже План выполнения. Поэтому в указанных вами условиях вы всегда будете получать самое медленное время выполнения. Полное сканирование таблицы по 50-миллионным строкам на самом деле является наихудшим сценарием.

enter image description here

И обратите внимание на эту стоимость, она равна 26539 в 18-миллионных строках. Так что, если у вас есть 50 млн строк, мы легко можем ожидать гораздо больше затрат на ваш запрос

0 голосов
/ 04 марта 2020

Вы можете создать процедуру PL / SQL, которая зацикливает, обновляет и фиксирует таблицу при каждом n числе строк - скажем, каждые 20 000 строк. Я не советую обновлять полную таблицу, так как это создаст блокировку на долгое время и подвергнет вас потере данных в случае внешних факторов.

...