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

Уважаемые, как лучше "обрезать" табличку, оставив за последние 2 месяца?


Есть таблица (лог) за 5 лет. 250гиг. Индекс по Id и статусу. Дата есть но без индекса.

20 ответов

22 просмотра

Особо не выпендриваясь -- DELETE FROM WHERE date<... За несколько часов закончит. Всё это время простые INSERT смогут идти, большынство SELECT -- нет.

По опыту из оракла — удалять в цикле небольшими порциями (тысяч по 10 — 50), с промежуточными коммитами.

Ну или как вариант - переложить рядом 2 месяца, а остальное дропнуть. Быстрее может отработать. create а потом insert rename rename в одной транзакции.

Dees7- Автор вопроса
Dees7- Автор вопроса
Nastya Afanaseva
Ну или как вариант - переложить рядом 2 месяца, а ...

так же. индекса нет по дате. а селект просто убьет базу. Сколько будет строиться индекс?

Dees7
так же. индекса нет по дате. а селект просто убьет...

Природа id* известна? Если это лог, то он строго возрастающий, это верно? Достаточно примерно определить границу для селекта. А в новой таблице уже подумать про партицирование и более удачную структуру хранения.

Dees7
на проде неприемлемо.

В 98% случаев прода -- вполне приемлемо. В остальных -- ну, рубите по частям. Хоть DELETE FROM WHERE date < (нужная - 3 года) и т.д., хоть DELETE FROM WHERE date < нужная AND id<какое-то небольшое значение, куда немного попадёт. Первое будет по-минимум отрабатывать минут 5-10, встревать на это время будут только селекты, которые могут получить значения из данных дат. Второе можно сделать практически мгновенным, но суммарно время выполнения будет большэ. Но, ещё раз -- я не очень верю, что у вас как-то сложно запланировать тех.промежуток в котором ваша аналитика не будет читаться.

Можно найти нужный id (если там int), начиная с которого идут даты за последние 2 месяца. И удалить все записи, что меньше него.

Ilya Portnov
По опыту из оракла — удалять в цикле небольшими по...

Здесь не оракл, тут свои погремушки. Там да, там сто миллионов сразу удалённых -- это повод для лулзов и лучшэ так не нарываться.

Dees7- Автор вопроса
Dmitriy Sviridov
Можно найти нужный id (если там int), начиная с ко...

ID похоже простой инкремент. Буду просто бить диапазон и удалять маленькими кусочками в цикле :) Спасибо всем за идеи.

Dmitriy Sviridov
Можно найти нужный id (если там int), начиная с ко...

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

Ilya Anfimov
Здесь не оракл, тут свои погремушки. Там да, там ...

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

Ilya Portnov
я подозреваю что в постгресе тоже не большая радос...

Баз с реально большым объёмом обновлений, которым замершый на несколько часов автовакуум будет создавать проблемы -- не так много.

Dees7- Автор вопроса
Ilya Portnov
я подозреваю что в постгресе тоже не большая радос...

Все как обычно ) так сложилось исторически. данные вообще не нужны в безе =( просто кому то там удобнее искать.

Ilya Anfimov
Если в критэриях удаления добавить и дату -- то и ...

Типа брать кусками по возрастанию id, пока не наткнёмся на нужную дату?

Dmitriy Sviridov
Типа брать кусками по возрастанию id, пока не натк...

Типа брать кусками по возрастанию id, всегда добавляя к условию правильную дату. Тогда не удалится ничего лишнего. Останавливаться ли при этом на каких-то id в районе той даты (можно с запасом +пара дней) или нет -- ужэ не так важно.

Dmitriy Sviridov
Типа брать кусками по возрастанию id, пока не натк...

А, ещё, если у вас по умолчанию транзакцыи serializable (обычно это не так) -- то смените для этого удаления на repeatable read или read committed.

Я подвешиваю новый "партишн" через инхеритенс и констрайнт .Свап имена. В результате все пишется в новую таблицу , а читается с обеих. Через два месяца - дроп старую

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
Карта сайта