У нас есть таблица с долгами клиентов, она большая, около 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 запросом, потому что это очень будет тормозить, проще вывести в отдельную таблицу и вставлять в нее данные, а потом добавить нужные индексы и разбить по партициям, в данном проекте очень важна скорость работы, по этому если вам кажется, что я костылю, то прошу вас предложить мне варианты для правильного решения данной проблемы. Спасибо.