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

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

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

38 ответов

10 просмотров

Тип поля 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 выступает намного хуже.

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

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

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Всем привет, у меня есть сервер принимающий входящие HTTP подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
Кибер Бомж
8
Карта сайта