172 похожих чатов

Подскажите пути, как грохнуть дубли в здоровой таблице (около 1млрд

записей, около 500 гб), секционирована на около 60-70 секций

Есть уникальный для каждой записи db_id,есть chat_id и id, которые должны быть уникальными, но прокрались дубли.

Вариант по всей таблице
DELETE FROM messages
WHERE db_id NOT in (
SELECT min(db_id)
FROM messages
GROUP BY chat_id, id
);

Отваливается по памяти (съедает 8гб оперативы и 10гб свопа и через 4 часа рушится).

Он же по секции молотит больше 2часов, упираясь в ЦПУ (выедает одно ядро) без видимых результатов.




Нашел рабочий вариант - скопировать секцию в таблицу

SELECT min(db_id) as id into test_delete_temp
FROM messages_2021_m04
GROUP BY chat_id, id;

построить индекс и грохнуть всё в секции:

delete from messages_2021_m04 as t where not exists(select id from test_delete_temp where id=t.db_id);,

Он занимает около получаса на секцию. Вопрос: можно ли быстрее?

18 ответов

20 просмотров

Когда-то давно удалял пачками по 5000-50000 записей в зависимости от нагрузки. В цикле выбираем записи в список - темповую таблицу, потом удаляем по этому списку. Не знаю как в новых версиях, а в старой надо было не просохатить момент опустошения партиции и успеть сделать analyse.

Вы бы хоть планы (просто EXPLAIN) этих запросов посмотрели... а то непонятно, что и где там "отваливается".

Eshu Marabo
screenshot

Это на уровне "где-то происходит какая-то ошибка" (детализации-то нет). Смотрите планы.

Я в таких случаях всегда сначала дубликвты выбираю (group by chat_id, id having count(*) > 1). Притом в отдельную табличку. А поиом ужэ думаю — как так получилось и как их отстреливать. Понятно, что отработает это только при наличии индэкса (chat_id, id, ...)

Eshu-Marabo Автор вопроса
Ilya Anfimov
Я в таких случаях всегда сначала дубликвты выбираю...

Ну я в итоге пошел тем же путем примерно, только выбрал не дубликаты а набор уникальных id и занялся отстрелом тех, что к ним не относится

А вот чего он по памяти оиваливается — мне непонятно. По идее, сожрав shared_buffers и work_mem — должэн начать на диск всё перекладывать.

Eshu-Marabo Автор вопроса
Ilya Anfimov
А вот чего он по памяти оиваливается — мне непонят...

он схавал всю оперативку сервера (8гб) + весь своп (10гб)

Eshu-Marabo Автор вопроса
Eshu Marabo
Ну я в итоге пошел тем же путем примерно, только в...

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

Eshu-Marabo Автор вопроса
Eshu Marabo
он схавал всю оперативку сервера (8гб) + весь своп...

По моим представлегиям — хавать он должэн только shared_buffers+work_mem.

Eshu-Marabo Автор вопроса

мне тоже так казалось😂

Eshu Marabo
дубликатов - около 250 млн из миллиарда

А они точно дубликаты информацыи? А не только пары айдишников?

Eshu Marabo
дубликатов - около 250 млн из миллиарда

А если взять ваш любимый язык программирования и сделать скриптик, который берет одну строку ищет и удаляет ее дубли, запустить и оставить на недельку?

Eshu-Marabo Автор вопроса
Sergey Nikitchenko
А если взять ваш любимый язык программирования и с...

я прикинул - обработка займет около 15 лет😂😂😂

Похожие вопросы

Обсуждают сегодня

Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
Товарищи, кто работа с iphelper? Или может я в самой логике ошибки фигачу, не пойму.... var ifTable : PMIB_IFTABLE; size, corSize: DWORD; Buffer ...
Warfarellen
4
я так понимаю, я так подозреваю, что создание такого плагина для человека, кто умеет писать плагины для делфи потребует минут 5-10 времени. но это мое подозрение. хотелось бы ...
Kraszx
7
Коллеги, добрый вечер. Создаю коллекцию от TFPGMap, ключ - перечисление, значение - целое. Нужно отсортировать коллекцию по значению. Как это можно сделать?
Kirill Filippenok
11
Скажи а ты когда этот канал создавал ты уже дельфи не любил, или это со временем пришло?
Роман Лях (rgreat)
18
Привет, такой вопросик появился кажется ли вам что Rust слишком сложный/строгий для высокоуровневого программирования и слишком "безопасный"/строгий для низкоуровневого?
Крокант
10
Всем привет! Использую кастомное модальное диалоговое окошко, все по классике - mrOK, mrCancel как ModalResult. Однако есть нюанс - в главной форме есть универсальный обработч...
Олег Гранишевский
20
Карта сайта