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

Всем привет. Есть одна таблица, в ней 69 миллионов записей.

Из них нужно обновить одно поле в jsonb поле у шести миллионов. Запускаю update set.. where... и запрос очень долго выполняется. Больше шести часов. Я думаю он завис. Что может мешать? Индексы?(есть индекс на jsonb поле, есть индекс ещё на одно поле)

15 ответов

9 просмотров

Быстрее всего обновлять пачками по 1000 - 100000 записей. В зависимости от погоды и число проще всего подобрать эмпирическим путём.

> Я думаю он завис. Почему Вы так думаете? Что в pg_stat_activity? Может быть, что-то "нехорошее" есть в логах? > Индексы?(есть индекс на jsonb поле, есть индекс ещё на одно поле) А какие индексы вообще есть на таблице (покажите \d+ your_table, например)? А, и какая это полная версия PostgreSQL?

Kanstantsin- Автор вопроса
Yaroslav Schekin
> Я думаю он завис. Почему Вы так думаете? Что в ...

не смогу глянуть pg_stat_activity. У меня rds и я так и не поставил ту утиллиту, которую в прошлый раз советовали. На этой таблице четыре индекса: PK, FK(в моих 6 миллионах записях он не используется), индекс по строковому полю для ускорения поиска, индекс по уникальности для комбинации строковое поле + поле в jsonb поле

Kanstantsin
не смогу глянуть pg_stat_activity. У меня rds и я ...

> не смогу глянуть pg_stat_activity. Почему?! > У меня rds и я так и не поставил ту утиллиту, которую в прошлый раз советовали. Если он настолько отличается от vanilla PostgreSQL, то все вопросы уже не сюда. ;) Но, по-моему, Вы что-то путаете. > На этой таблице четыре индекса Легче же показать \d, а не пересказывать.

Kanstantsin- Автор вопроса
Yaroslav Schekin
> не смогу глянуть pg_stat_activity. Почему?! >...

блин, перепутал)))) да, глянул pg_stat_activity - там есть два процесса с моим апдейтом. У одного event DataFileRead c типом IO, у второго transactionid c типом Lock

Kanstantsin
блин, перепутал)))) да, глянул pg_stat_activity - ...

Хмм... а почему два-то? Один же должен быть? > У одного event DataFileRead c типом IO Т.е. работает, что-то читает (или пытается — точно нет в логах проблем?).

Kanstantsin- Автор вопроса
Yaroslav Schekin
Хмм... а почему два-то? Один же должен быть? > У ...

тот вчерашний, который c типом IO. У него статус поменялся вчера в 9. Отменил этот запрос я сегодня утром. Думаю он тоже завис. Я как-нибудь эти два процесса кильнуть могу?

Роман Жарков
Быстрее всего обновлять пачками по 1000 - 100000 з...

а можете подробнее объяснить. если взять вводную про 69млн. нашли магическое число пусть 10к записей, а дальше? на 1 раз понятно, например cte по условию первые 10к записей и update записей

Владимир
а можете подробнее объяснить. если взять вводную п...

Сначала я пробовал with... update. Минут через сорок (условно) оно плавно начинало тормозить и раком вставало. Но эффективнее всего в старых версиях было в транзакции делать через явную темповую таблицу с id-шками. create temp table ... select for update ... limit 10000; Обновляем, дропаем табличку и всё заново.

Роман Жарков
Сначала я пробовал with... update. Минут через сор...

не совсем понял чем это лучше with temp_table as( select id.... ... limit 10000) update .... почему с cte все тормозило, а с постоянным пересозданием временной таблицы все работало приемлимо?

Владимир
не совсем понял чем это лучше with temp_table as( ...

блоат, статистика. Короче, от красивостей cte ( такого слова я тогда не знал ) пришлось отказаться. Эффективнее всего фигачить по заранее сделанному списку с обращениями по PK

Роман Жарков
блоат, статистика. Короче, от красивостей cte ( та...

ясно. если бы вы не объяснили, я бы считал, что с cte лучше. спасибо.

Владимир
ясно. если бы вы не объяснили, я бы считал, что с ...

Я много чудес насмотрелся. Самый прикол с перекладыванием данных из партицию в партицию был ( перераспределить для уменьшения числа партиций или наоброт, нарезать слишком выросшую таблицу ). Как только последнюю пачку данных удаляеешь из таблицы ( а она большая была и стала один сплошной блоат ), планировщику крышу рвёт и он начинает по ней сексканить. Вот тут надо успеть или отвакуумить или analyse сделать.

Роман Жарков
Я много чудес насмотрелся. Самый прикол с переклад...

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

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

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

Какой-то там пердун в 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 подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
DS
8
Карта сайта