Замена временных таблиц в PgrSQL для оптимизации update, insert
Добрый день!
Подскажите, пожалуйста, если кто-то сталкивался.
Пытаюсь заполнить и сделать upd ate из временной таблицы в PgrSQL.
Но из-за того что и сама temp строится путем выборки из нескольких таблиц с большим количеством данных, и таблицы t, f тоже состоят из сотен тысяч строк, медленно отрабатывает.
Как можно оптимизировать эту процедуру, чтобы она эффективно отрабатывала под нагрузкой? Может ли кто-то подсказать, как, например, встроить UPDATE по сегментам или есть какие-то еще более удачные решения?
-----------
CREATE OR REPLACE FUNCTION public.F() RETURNS void
AS $$
DECLARE
sql_str text;
begin
--Создание temp
sql_str := 'DR OP TABLE IF EXISTS Temp;
CREATE temporary TABLE Temp(
Field1 uuid,
Field2 uuid,
Field3 uuid,
Field4 uuid,
Field5 text,
Field6 text,
Field7 text,
Field8 text,
Field9 int,
Field10 int,
Field11 int,
Fiels12 int);';
execute sql_str;
--Заполнение temp
sql_str := 'ins ert into Temp
sel ect distinct on (-- перечень полей --
fr om t
left join c on t.id =c.uid
--объединение нескольких таблиц с десятками тысяч строк--
where --перечень нескольких условий--;
execute sql_str;
--Заполнение таблицы t на основе temp
sql_str := 'INS ERT IN TO public.t (--перечень полей--)
sele ct --перечень полей--
from Temp;
execute sql_str;
--Обновление таблицы f на основе temp
sql_str := 'UPDATE public.f
SE T --перечень полей--
fr om Temp
wh ere --перечень условий--;
execute sql_str;
return;
END;
$$ LANGUAGE plpgsql;
Подскажите, пожалуйста, если кто-то сталкивался.
Пытаюсь заполнить и сделать upd ate из временной таблицы в PgrSQL.
Но из-за того что и сама temp строится путем выборки из нескольких таблиц с большим количеством данных, и таблицы t, f тоже состоят из сотен тысяч строк, медленно отрабатывает.
Как можно оптимизировать эту процедуру, чтобы она эффективно отрабатывала под нагрузкой? Может ли кто-то подсказать, как, например, встроить UPDATE по сегментам или есть какие-то еще более удачные решения?
-----------
CREATE OR REPLACE FUNCTION public.F() RETURNS void
AS $$
DECLARE
sql_str text;
begin
--Создание temp
sql_str := 'DR OP TABLE IF EXISTS Temp;
CREATE temporary TABLE Temp(
Field1 uuid,
Field2 uuid,
Field3 uuid,
Field4 uuid,
Field5 text,
Field6 text,
Field7 text,
Field8 text,
Field9 int,
Field10 int,
Field11 int,
Fiels12 int);';
execute sql_str;
--Заполнение temp
sql_str := 'ins ert into Temp
sel ect distinct on (-- перечень полей --
fr om t
left join c on t.id =c.uid
--объединение нескольких таблиц с десятками тысяч строк--
where --перечень нескольких условий--;
execute sql_str;
--Заполнение таблицы t на основе temp
sql_str := 'INS ERT IN TO public.t (--перечень полей--)
sele ct --перечень полей--
from Temp;
execute sql_str;
--Обновление таблицы f на основе temp
sql_str := 'UPDATE public.f
SE T --перечень полей--
fr om Temp
wh ere --перечень условий--;
execute sql_str;
return;
END;
$$ LANGUAGE plpgsql;
Прикрепленные файлы:
Script.txt
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
С виду по запросу можно попробовать:
1. Оптимизировать выборку самих сотен тысяч строк подобрав индексы, изменив структуру таблиц
2. Рассмотреть вариант без промежуточных таблиц в одном запросе производить выборку и запись.
3. Облегчить таблицу записи убрав из нее не нужные индексы, поля или писать в другую таблицу с более легкой структурой и потом запросами соединять с ней.
4. Распараллелить
Для подбора правильного варианта изменений хорошо бы снять план запроса с длительностями, количествами циклов, строк по ним увидите куда тратится наибольшее время.
1. Оптимизировать выборку самих сотен тысяч строк подобрав индексы, изменив структуру таблиц
2. Рассмотреть вариант без промежуточных таблиц в одном запросе производить выборку и запись.
3. Облегчить таблицу записи убрав из нее не нужные индексы, поля или писать в другую таблицу с более легкой структурой и потом запросами соединять с ней.
4. Распараллелить
Для подбора правильного варианта изменений хорошо бы снять план запроса с длительностями, количествами циклов, строк по ним увидите куда тратится наибольшее время.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот