Оновлення 700 мільйонів рядків до тієї ж величини


12

У мене є сховище даних (oracle), де мені потрібно встановити стовпець на однакове значення для всіх 700 мільйонів рядків.

У мене немає доступу до адміністратора або доступу до адміністратора, тому це потрібно виконати за допомогою базового sql і не створюється таблиця темп.

Подальші складності мають значення, якщо я спробую зробити просте оновлення, де 1 = 1, у нього не вистачає місця для повтору.

У тому, як я зараз його працює, це циклічно таке:

loop
  update mytable set mycolumn = '1' where mycolumn is null and rownum < 50000;
  commit;
end loop

але я знаю, що це, мабуть, наївно, і повинно бути швидше і елегантніше рішення.


Чи розділена таблиця?
Джек каже спробувати topanswers.xyz

Я не вірю в це. Є кілька індексів, але жоден з них не включає стовпчик, який я оновлюю.
owook

Відповіді:


4

Якщо у вас є вільний простір, ви можете CTAS, використовуючи мінімальне скасування / повтор . Якщо у вас взагалі є якісь індекси, робити це будь-яким іншим способом буде дуже повільно і генерувати журнал, як божевільний.

У випадку, коли у вас є один IOT без будь-яких вторинних індексів або єдиний кластер таблиці, ви можете пройти через оновлення основного / кластерного ключа по шматочках, не потребуючи повторної повторної роботи всієї таблиці, щоб знайти поля, які ще не були оновлені.

--edit

Я не в змозі створити вторинну таблицю ... Є кілька індексів, але жоден з них не включає стовпчик, який я оновлюю.

Тоді я пропоную розбити таблицю на шматки для обробки, використовуючи те, що ви індексуєте (навіть якщо це один стовпець, ви можете розділити його на діапазони значень). Це зробить FTS один раз, а не один раз за кожен фрагмент, як у вашому код. Вам доведеться жити з надзвичайно великою кількістю повторень, а також буде видалено місце для скасування скасування (тому жодного спалаху не буде згодом)

--edit2

якщо ви можете додати / перейменувати / скинути стовпці, ви можете зробити це дуже ефективно , але лише на 11g


1
Якщо ваша DBA дозволить вам це зробити NOLOGGING, це призведе до визнання недійсними гарячих стандартних номерів.
Гай

Дійсно, і резервне копіювання згодом було б також хорошою ідеєю - але це склад і nologgingє інструментом для складів
Джек каже, спробуйте topanswers.xyz

Я не в змозі створити вторинну таблицю, звичайно не одну велику, як першу, навіть якщо лише тимчасову.
owook

Ваше посилання на 11 г виглядало багатообіцяючим, але я бачу коментарі, що для 60-метрового столу це все ще було жахливо повільно через те, що потрібно було встановлювати значення для кожного ряду. Оскільки в моїй таблиці розмір 10х розмірів, цей метод може не бути вдосконаленням.
owook

@owook ні, на 11g ця операція швидка і не встановлює значення для кожного рядка "для деяких типів таблиць (наприклад, таблиць без стовпців LOB)" . Спробуйте це на підмножині таблиці ( create table foo as select * from bar where rownum<100000)
Джек каже спробувати topanswers.xyz

1

Якщо у вас 11г, опустіть стовпець і додайте його назад як стовпець "НЕ НУЛЛ" зі значенням за замовчуванням. Це контрінтуїтивно, але Oracle зберігатиме значення за замовчуванням у визначенні таблиці, замінюючи значення за замовчуванням під час виконання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.