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

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

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

38 ответов

13 просмотров

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

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

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

Мужики и девушки, привет) в Вelphi xe7 в настройках во вкладке "Editor Options" далее " Color" есть список: "Elements", открыв который мы можем настраивать отображение разных...
Kraszx
14
Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
как быть с принтером? такой подход прокатит?
zamtmn
12
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
А вот это что за конструкция? Вернее, она тут нафига?
Serjone
10
Привет. Подскажите, как правильно сматчить лист фиксированного размера, чтобы компилятор не говорил мне о неполном паттерне? Допустим что-то такое [x', y'] = sort [x, y]?
Arseny
8
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
Товарищи, кто работа с iphelper? Или может я в самой логике ошибки фигачу, не пойму.... var ifTable : PMIB_IFTABLE; size, corSize: DWORD; Buffer ...
Warfarellen
4
Мужики. привет) в Вelphi xe7 в настройках во вкладке "Editor Options" далее " Color" есть список: "Elements", открыв который мы можем настраивать отображение разных элементов...
Kraszx
2
Карта сайта