|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
Коллеги, привет. Надо сделать update очень большой таблицы. Update будет повторяться раз в несколько месяцев. База не боевая - руки более/менее развязаны для всяких приседаний. В таблице примерно 10^11 записей (100 миллиардов). На самом деле, таблиц больше сотни, но общее количество изменяемых записей указал верно. Будет заменяться поле-строка, на строку такой же длины. Надо затереть секретные данные в базе, скорее всего не просто пробелами, а, например, посчитать хэш от исходных значений - чтобы одни и те же строки сконвертировались в одинаковый мусор. Это не обязательное требование - просто идея такая, чтобы хоть как-то сохранить селективность этих данных. Rollback не нужен - видимо можно как-то сэкономить на rollback-сегменте и redo-логе. Как? Подскажите, куда копать, что почитать? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 10:23 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
shurka22, Таблица секционирована? Или одна большая куча? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 10:48 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
env, Всего таблиц - больше 100. Самые большие из них, как ни странно - без секций. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 10:58 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
зависит от того, сколько строк нужно менять. если мало - обычный update без заморочек. если много/всю таблицу - копирование таблицы с изменением данных на лету, вида create table new_table (id, secret_value) as select id, ora_hash(secret_value) from old_table, удалением old_table и переименованием new_table в old_table. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 11:17 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
кит северных морей, create table as select - очень не хочется делать. Хочется оставить экстенты таблицы в тех же местах, где они были. Понятно, что уедут экстенты индексов по этим полям - но без этого уже никуда. Зато индексы по другим полям - останутся на своих местах. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 11:20 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
shurka22 Надо затереть секретные данные в базе, ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 11:33 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
123йй shurka22 Надо затереть секретные данные в базе, Очень не бесплатно... Data Masking and Subsetting Pack 11,500$ per CPU Да и TC не все сказал, может база передается для тестирования в другую организацию Как вариант быстрого update для подготовки базы (решал давно такую задачу, правда еще на 8i) 1) базу в noarchivelog 2) маленький RAMDISK (сейчас выделить 5-10G RAM обычно не проблема), redo и спец rbs туда на момент update 3) pl/sql маленькими порциями, чтобы быстрый rbs не распухал, set transaction use rollback segment ... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 11:57 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
Vadim Lejnin, Да я сам пока не знаю, куда это потом пойдёт. Может и правда - наружу. Спасибо за идею переключить rollback-segment (rbs) на быстрый диск. А совсем без RBS можно сделать update? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 12:08 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
shurka22, я б еще индексы с полем и триггера update отлючил ...... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 12:20 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
Stax, Это да, само собой.. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 12:36 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
shurka22 Хочется оставить экстенты таблицы в тех же местах, где они были. зачем? ну и если у вас HCC, то всё переедет даже с update. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 12:48 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
shurka22, В oracle7, oracle80 был параметр полностью отключающий undo/redo, но сейчас попытался вспомнить, не вспомнил. Однако, после его использования, базу положено было выбрасывать, то есть использовался он очень специфично, обычно для оценочнных тестов железа. Можно значительно увеличить производительность, отключив db_block_checking, db_block_checksum ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 12:51 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
shurka22 Vadim Lejnin, Да я сам пока не знаю, куда это потом пойдёт. Может и правда - наружу. Спасибо за идею переключить rollback-segment (rbs) на быстрый диск. А совсем без RBS можно сделать update? Если данные на экспорт, то фильтром менять значения в файле экспорта и БД не трогать. Что касается update, не представляю, зачем обновлять ВСЕ записи каждый раз и все сразу? Сегмент отката экономится короткими транзакциями. Обновил небольшую порцию данных, закоммитил. Лог используется циклически и не растёт. А архивы лога во время процедуры можно не делать. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 12:58 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
1. Rollback segment большой отдельный не потребуется, если разделить обновление на более скромные порции тысяч по 10. Сделать это можно разными способами. - можно делать update по диапазону rowid на базе карты экстентов - тут есть дополнительная опция в виде dbms_parallel_execute. - можно делать fetch over commit в сочетании с batch update при условии, что доступ будет FTS (при индексном сильно проще налететь на ora-1555). 2. От redo на update не уйти, но имеет смысл проверить наличие и убрать supplemental logging и mat.view logs. Еще можно перевести базу в noarchivelog на время обновления с последующей резервной копией после переключения обратно. 3. В любом случае рассмотрите вариант предоставления доступа через систему view в отдельной схеме, для выдачи наружу этот вариант тоже может подойти (в зависимости от способа передачи). ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 13:01 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
shurka22 А совсем без RBS можно сделать update? Нельзя. Update использует сегмент отката в своей работе для реконструкции образа БД на момент начала выполнения. Т.е. это не бэкап данных, а необходимые в работе данные. В принципе, можно непосредственно в файлах БД поменять значения, если они не индексированы. Думается, есть библиотеки для разбора и изменения блоков БД. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 13:06 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
mcureenab Update использует сегмент отката в своей работе для реконструкции образа БД на момент начала выполнения. Андрюх, загоняешься. Read consistency в случае update работает несколько иначе. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 13:13 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
mcureenab shurka22 Vadim Lejnin, Да я сам пока не знаю, куда это потом пойдёт. Может и правда - наружу. Спасибо за идею переключить rollback-segment (rbs) на быстрый диск. А совсем без RBS можно сделать update? Если данные на экспорт, то фильтром менять значения в файле экспорта и БД не трогать. Что касается update, не представляю, зачем обновлять ВСЕ записи каждый раз и все сразу? Сегмент отката экономится короткими транзакциями. Обновил небольшую порцию данных, закоммитил. Лог используется циклически и не растёт. А архивы лога во время процедуры можно не делать. shurka22кит северных морей, create table as select - очень не хочется делать. Хочется оставить экстенты таблицы в тех же местах, где они были. Понятно, что уедут экстенты индексов по этим полям - но без этого уже никуда. Зато индексы по другим полям - останутся на своих местах. Какой export? Судя по всему, задача передать именно копию базы для тестирования, включая текущее распределение пространства ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 13:27 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
Вот если юзать CTAS, то UNDO будет минимальный (да если еще NOARCHIVELOG и NOLOGGING) Ну и на свой страх и риск дискретные транзакции (_discrete_transactions_enabled) -- наверное именно это Stax имел ввиду ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 13:31 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров дискретные транзакции Их давно отменили. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 13:38 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров Вот если юзать CTAS, то UNDO будет минимальный Расходы на хранение временного сегмента о 100 ярдах в табличном пространстве данных не учитываем, с вариантом обновления по частям не сравниваем :) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 13:46 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
Vadim Lejnin Судя по всему, задача передать именно копию базы для тестирования, включая текущее распределение пространства Да, именно так. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 13:48 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
shurka22 Vadim Lejnin Судя по всему, задача передать именно копию базы для тестирования, включая текущее распределение пространства Да, именно так. Спасибо. Вы работаете с копией, восстановленной из backup и имеете задачу системно решить вопрос data masking для передачи базы наружу на регулярной основе? Возможно, Вам следует рассмотреть какой-либо из вариантов логического standby. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 13:51 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров Вот если юзать CTAS, то UNDO будет минимальный (да если еще NOARCHIVELOG и NOLOGGING) NOLOGGING это типа для CREATE TABLE AS SELECT. К стати вполне себе вариант для создания копии таблиц в отдельной БД по ДБ линку. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 13:51 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
mcureenab по ДБ линку. 100 ярдов * 100 таблиц по линку? Я бы даже рассматривать не стал. Даже sql*plus copy command симпатичнее, не говоря об ETL-решениях. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 13:54 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
andrey_anonymous Вячеслав Любомудров дискретные транзакции Их давно отменили. Параметр остался ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 13:58 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
andrey_anonymous mcureenab по ДБ линку. 100 ярдов * 100 таблиц по линку? Я бы даже рассматривать не стал. Даже sql*plus copy command симпатичнее, не говоря об ETL-решениях. Вот только "включая текущее распределение пространства" не выполняется. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 14:01 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
Не, dblink не вариант, все-таки слишком большие тормоза А вот если там реально не десяток, а хотя бы сотня таблиц, то копирование-переименование-удаление вполне себе может не сильно напрячь по месту в общем зачете ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 14:07 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
mcureenab "включая текущее распределение пространства" не выполняется. CTAS по dblink сохраняет? Ну и я не видел такого требования от ТС. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 14:08 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
andrey_anonymous mcureenab "включая текущее распределение пространства" не выполняется. CTAS по dblink сохраняет? Ну и я не видел такого требования от ТС. Я тоже не видел, пока не увидел. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 14:10 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров Не, dblink не вариант, все-таки слишком большие тормоза А вот если там реально не десяток, а хотя бы сотня таблиц, то копирование-переименование-удаление вполне себе может не сильно напрячь по месту в общем зачете Ещё не забыть затереть от старых данных освободившиеся блоки. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 14:13 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров andrey_anonymous отменили. Параметр остался Я как-то хотел заюзать в одном проекте (на 11g, если склероз не врет). Оказалось, что оно тихо игнорится. Вразумление снизошло толи из доки, толи с металинка - за давностью не помню, просто принял к сведению. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 14:15 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
mcureenab Вячеслав Любомудров Не, dblink не вариант, все-таки слишком большие тормоза А вот если там реально не десяток, а хотя бы сотня таблиц, то копирование-переименование-удаление вполне себе может не сильно напрячь по месту в общем зачете Ещё не забыть затереть от старых данных освободившиеся блоки. автор... Будет заменяться поле-строка, на строку такой же длины. Надо затереть секретные данные в базе, скорее всего не просто пробелами, а, например, посчитать хэш от исходных значений - чтобы одни и те же строки сконвертировались в одинаковый мусор. Это не обязательное требование - просто идея такая, чтобы хоть как-то сохранить селективность этих данных. ... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 14:25 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
mcureenab andrey_anonymous пропущено... CTAS по dblink сохраняет? Ну и я не видел такого требования от ТС. Я тоже не видел, пока не увидел. Я сам пока не знаю ответа на этот вопрос. Мы делаем копию с прома, и пытаемся давать на неё разную интересную нагрузку - замеряем, что получится, не сдохнем ли мы. Мне видится так: все блоки и сегменты хотелось оставить так же, как оно было сразу, то есть на проме. Но я уже не уверен, что сейчас это условие уже соблюдается. Завтра буду выяснять, каким образом нам попадают данные с прома: с сохранением табличных пространств, или нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 14:40 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
shurka22 Мне видится так: все блоки и сегменты хотелось оставить так же, как оно было сразу, то есть на проме. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 14:42 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров, Мы хотим регулярно делать тесты и понимать, как будет вести себя пром (с его экстентами и сегментами), если мы ему дадим новую нагрузку. Проверять на проме - слишком дорого. Значит проверяем на копии прома. Желательно, чтобы копия прома как можно меньше отличалась от прома. Если у нас на копии сегменты и экстенты будут иными - у меня есть подозрение, что мы получим не совсем верный тест. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 14:53 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
andrey_anonymous - можно делать update по диапазону rowid на базе карты экстентов - тут есть дополнительная опция в виде dbms_parallel_execute. Пока ишраюсь с dbms_parallel_execute. Получается заметно быстрее, чем просто update --+ parallel ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 14:58 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
shurka22 Если у нас на копии сегменты и экстенты будут иными - у меня есть подозрение, что мы получим не совсем верный тест. Это, пожалуй, единственное, что может повлиять Ну дык, приведите таблицы на боевой в порядок, сделайте MOVE таблиц/секций, зачем вам эти дырки? Тем более, что в современных версиях MOVE ONLINE прекрасно выполняется на лету Все остальные придумки про неверный тест -- от лукавого ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 15:05 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров Это, пожалуй, единственное, что может повлиять chained/migrated rows ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 15:46 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
Ну дык от migrated причесывание боевых таблиц через MOVE спасет А от chained -- если есть задумка заместить хешем, то там явно не про те размеры ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 15:56 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
shurka22 Мне видится так: все блоки и сегменты хотелось оставить так же, как оно было сразу, то есть на проме. если секретные поля индексированы, то индексы всяко поменяются. и не факт, что СУБД подчистит освободившиеся блоки. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 20:42 |
|
update очень большой таблицы - как?
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров Ну дык от migrated причесывание боевых таблиц через MOVE спасет А от chained -- если есть задумка заместить хешем, то там явно не про те размеры Так ТС не желает же гонять move по боевой БД. Как минимум, это требует резерв по свободному месту, которого может не быть. Что касается chained, то их легко можно получить и на не особо длинных записях. Всего-то надо 256+ колонок и +-все записи будут сhained, я такое встречал :) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 23:00 |
|
|
start [/forum/topic.php?all=1&fid=52&tid=1880567]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
47ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
others: | 11ms |
total: | 171ms |
0 / 0 |