@wolf-9830

Как взять предпоследние значение перед вставкой новой записи в большой таблице СУБД postgres?

У нас есть таблица с долгами клиентов, она большая, около 5 миллионов записей, суть проблемы в том, что перед вставкой нового значения долга для определенного клиента мне нужно получить запись с предыдущим долгом клиента (обычно долги начисляются по крону пачками), решая задачу я выбрал два пути решения:
1) пишется триггер на эту большую таблицу и перед вставкой вычисляется id прошлой записи для определенного id клиента и записывается в промежуточную таблицу. Но такой вариант использовать как мне кажется не очень гуманно, потому что скорость выполнения запроса выборки нужного мне ид прошлой записи ~1.2 секунды, за ночь в таблицу вставляется около 50 000 записей, вполне возможно я не правильно составляю запрос на выборку, если что не так, направьте меня пожалуйста в нужное направление, вот мой запрос:
select id from debt where id<6534794 AND cus_id = 143867 ORDER BY id desc LIMIT 1

И его результаты я вставляю insert-ом в промежуточную таблицу для дальнейших операций

2) В промежуточную таблицу я пишу только id новой записи, которая была вставлена в большую таблицу, после пишу функцию на языке plpgsql, которая анализирует промежуточную таблицу, берет id вставленной записи и на основе этого id делает выборку уже из большой таблицы предпоследнего значения, но это очень долго, мне критически важно, чтоб запрос отрабатывал меньше секунды для одной записи

У вас наверно возникнет вопрос а зачем собственно так извращаться? А затем, что эти данные будет обрабатывать скрипт на php и в том числе он будет вычислять дельту между долгами клиентов, по этому я беру данные из промежуточной таблицы с долгами, потом к ним прибавляю еще огромное количество других данных и пишу в отдельную таблицу, вопрос, почему я не сделаю одним sql запросом, потому что это очень будет тормозить, проще вывести в отдельную таблицу и вставлять в нее данные, а потом добавить нужные индексы и разбить по партициям, в данном проекте очень важна скорость работы, по этому если вам кажется, что я костылю, то прошу вас предложить мне варианты для правильного решения данной проблемы. Спасибо.
  • Вопрос задан
  • 734 просмотра
Решения вопроса 1
Falseclock
@Falseclock
решаю нестандартные задачи
а чем RETURNING не нравится?

Туда же можно привязать что угодно

Я например удаляя какие-то данные вытаскиваю что вообще удалилось и джоинами прикручиваю все что мне нужно вытащить. например

DELETE FROM 
				waybills 
			USING 
				invoices 
			JOIN invoice_data ON
				invoice_data.invoice_uuid = invoices.invoice_uuid
			WHERE 
				waybills.invoice_uuid = waybills.invoice_uuid AND 
				waybills.waybill_uuid = ?
			RETURNING 
				invoice_data.order_data_id,
				invoices.order_id,
				invoices.invoice_uuid


Вы же в своем инсерте также можете добавить RETURNING и указать что вы хотите вернуть )))
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы