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

Привет) не могу придумать как эффективно решить задачу: есть таблица (5

млрд) с полями key varchar, value varchar,
В большинстве value лежит IP-адрес, но есть плохие данные, где там фигня вместо IP.
Вопрос: как можно эффективно убрать плохие данные, оставив value где только IP?
Пробовал выбирать с regexp (~) - очень долго
При insert в таблицу с value inet - ошибка
Может какой-то индекс нужно построить? или как-то иначе...

38 ответов

15 просмотров

Тип поля value какой?

Omodamos-Doe Автор вопроса
Ilya Zviagin
Тип поля value какой?

сейчас - обычный varchar

Omodamos Doe
сейчас - обычный varchar

И в каком виде там лежит ip address? 127.0.0.1 ?

Omodamos Doe
да, все так :)

Печально. Надо писать курсор и бежать по таблице, выбрасывать плохие записи, по одной в транзакции. Запустить на недельку работать, когда-нибудь разберёт это дело

Omodamos-Doe Автор вопроса

Вам в итоге нужно получить таблицу с value inet или просто зачистить то, что не проходит валидацию? В табличку в это время кто-то пишет? Если нужно тип сменить, то create table xxx as select key, value::inet from таблица where value ~ регексп. Если менять тип не надо и в неё кто-то пишет - создавайте not valid констрейнт по условию корректности адреса, затем удаляйте кривые строки и делайте validate constraint (это, вроде, можно без блокировки всей таблицы сделать). В остальных случаях тупо delete по условию. Да, медленно, но тут ничего не поделаешь.

Radist
Вам в итоге нужно получить таблицу с value inet ил...

Не, delete не вариант. Большая таблица

Ilya Zviagin
Не, delete не вариант. Большая таблица

а если с условием по id (если он есть) и через циклик ? )

Omodamos-Doe Автор вопроса
Radist
Вам в итоге нужно получить таблицу с value inet ил...

можно оба варианта... таблица временная, никто не пишет кроме меня value ~ regexp - работает оооооочень долго, непредсказуемо долго

Radist
Вам в итоге нужно получить таблицу с value inet ил...

@rrrrad , 5 не миллионов, и миллиардов, какой ещё delete?

Yaroslav Schekin
Хмм... и почему же?

Да потому что он никогда не закончится

Omodamos Doe
можно оба варианта... таблица временная, никто не ...

А какой regexp? В общем, показали бы Вы то, что у Вас есть — \d и \dt таблицы, и запрос, которым удаляете.

Ilya Zviagin
Да потому что он никогда не закончится

Закончится, куда он денется. А альтернатива, кстати, какая?

Omodamos-Doe Автор вопроса
Yaroslav Schekin
А какой regexp? В общем, показали бы Вы то, что у ...

regexp поставил '[a-z]' (строки с буквой в любом месте)

Yaroslav Schekin
Закончится, куда он денется. А альтернатива, кстат...

Курсором бежать по записям, проверять валидность, удалять по одной плохие строки (либо что-то ещё делать с ними). Так хоть прогресс гарантирован. Ну и это конечно не неделю работать будет, месяца два...

Omodamos-Doe Автор вопроса
Yaroslav Schekin
Я попросил три вещи показать, нет?

на телефоне доступа нет к данным, извините... )

Ilya Zviagin
Курсором бежать по записям, проверять валидность, ...

И это будет тупо гораздо дольше, больше ничего. Вот из какой СУБД у Вас такие привычки, где разработчики умудрились так накосить, что у них курсор работает быстрее простого DELETE FROM, а? ;)

Ilya Zviagin
Курсором бежать по записям, проверять валидность, ...

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

Omodamos Doe
на телефоне доступа нет к данным, извините... )

Так покажите, когда будет. Там вполне может быть полезная информация, которой Вы пока не показали.

Ilya Zviagin
Я не говорил что будет быстрее.

Ну так тогда этим есть смысл заниматься только для защиты от отката в случае "падения" сервера.

Yaroslav Schekin
И это будет тупо гораздо дольше, больше ничего. Во...

Ты запустишь delete, он будет работать скажем неделю. Если что не так - он встанет, а что он сделал - откатиться (это ещё неделя). И потом снова неделю исправлять.... И так пока не случится идеальный delete

Omodamos Doe
хорошо) спасибо за помощь

Хорошо хоть "я не знаю, меня друг попросил узнать"

Ilya Zviagin
Ты запустишь delete, он будет работать скажем неде...

> Если что не так - он встанет, Постоит и пойдёт дальше (когда транзакция, которая его блокировала, завершится), ничего страшного. > а что он сделал - откатиться (это ещё неделя). А эти опасения у Вас из какой СУБД? ;) ROLLBACK в PostgreSQL почти всегда происходит мгновенно, причём независимо от выполненного в транзакции объёма работы, just FYI.

Триграммный индекс не пробовали?

Omodamos-Doe Автор вопроса
Евгений Смирнов
Триграммный индекс не пробовали?

здесь нет, но думал про него. Он обычно долго строится и не сильно ускоряет запросы вида '%term%' (по моему скромному опыту)

Ilya Zviagin
Я имел в виду ошибку

Нормально написанный DELETE может прервать разве что deadlock (и т.п.), а если к этой таблице никто больше не обращается, это не проблема. Вот "падение" / перезапуск сервера PostgreSQL (по несвязанным причинам) в это время — это риск, да.

Yaroslav Schekin
Нормально написанный DELETE может прервать разве ч...

При таком объеме, вероятно возможная причина падения - нехватка дискового пространства. Вот об этом надо будет позаботиться (чтобы место было столько, сколько занимает таблица + wal-ы)

Radist
При таком объеме, вероятно возможная причина паден...

Мне показалось, что "кривых" записей там единицы, так что и в WAL будет записано немного. Но причина может любой, да.

Omodamos Doe
здесь нет, но думал про него. Он обычно долго стро...

Хм... да, на вашей регулярке (и других коротких) без индекса может оказаться раза в 3 быстрее. У меня, на 13 символах (~ '52\:18\:0060131') GIN ускоряет с ~2300 мсек до ~60 мсек, а GIST выступает намного хуже.

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта