:: Не фоксом единым
Recursive CTE вопрос
Дмитрий Петров
Автор

Сообщений: 3142
Откуда: Пермь
Дата регистрации: 09.07.2001
Привет!
Может кто сталкивался- решал? Я столкнулся с проблемой на больших данных в Postgresql,
точнее в ArenadataDB (GreenPlum)
Банальная задача- подготовить готовую денормализованную таблицу для витрины по 2м полям id-parent_id.
Рекурсивная CTE, с нерекурсивной частью в 26 млн. записей просто сдыхает в рекурсивной части.
Я попробовал простым циклом обойти верхние элементы и руками пособирать иерархию- тоже медленно.
Не знаю куда копать. ( ориентация таблицы колоночная)
Ratings: 0 negative/0 positive
Re: Recursive CTE вопрос
alex;

Сообщений: 4085
Откуда: Москва
Дата регистрации: 23.11.2004
А если получить все записи второго или третьего уровня,
а уже по ним запускать рекурсию до последнего уровня?
Ratings: 0 negative/0 positive
Re: Recursive CTE вопрос
Дмитрий Петров
Автор

Сообщений: 3142
Откуда: Пермь
Дата регистрации: 09.07.2001
А без "сквозного" прохода я не знаю какая запись какому уровню принадлежит.
Там ключ родителя - это MD5(от т.н бизнес полей/уникальных)
На небольшой тестовой таблице, где ключи типа int4 - рекурсия отрабатывает.
А на больших данных, когда даже нерекурсивную часть ограничиваю 2-3 записями- все висит
upd
Какой то бы хитрый джойн сам на себя, или как у оракла есть конструкция connected by



Исправлено 3 раз(а). Последнее : Дмитрий Петров, 05.06.25 19:24
Ratings: 0 negative/0 positive
Re: Recursive CTE вопрос
alex;

Сообщений: 4085
Откуда: Москва
Дата регистрации: 23.11.2004
Собрал два твоих поста в один промпт.

DeepSeek

ChatGPT
Ratings: 0 negative/0 positive
Re: Recursive CTE вопрос
Дмитрий Петров
Автор

Сообщений: 3142
Откуда: Пермь
Дата регистрации: 09.07.2001
Леша, спасибо! Завтра уже проверю. Блин, тоже надо научиться этим ИИ пользоваться.
Бегло посмотрел- все вроде по делу отвечает)
Ratings: 0 negative/0 positive
Re: Recursive CTE вопрос
alex;

Сообщений: 4085
Откуда: Москва
Дата регистрации: 23.11.2004
Ratings: 0 negative/0 positive
Re: Recursive CTE вопрос
alex;

Сообщений: 4085
Откуда: Москва
Дата регистрации: 23.11.2004
Кста, есть такая фича...
В телеге можно создать свой чат(группу) или использовать чат Избранное
и туда запостить код с обратными апострофами(где ё) и получится "форматированный" разными цветами код.
Например
```SQL
select 1
```



Исправлено 3 раз(а). Последнее : alex;, 05.06.25 20:46
Ratings: 0 negative/0 positive
Re: Recursive CTE вопрос
PaulWist

Сообщений: 14819
Дата регистрации: 01.04.2004
Дмитрий Петров
Не знаю куда копать. ( ориентация таблицы колоночная)

Ну, добавить в таблицу тип данных ltree — тип данных для представления меток данных в иерархической древовидной структуре (аналог hyerarchy MSSQL)

Пример: Hierarchical data in postgres с триггером поддержания типа ltree


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено 2 раз(а). Последнее : PaulWist, 06.06.25 09:02
Ratings: 0 negative/0 positive
Re: Recursive CTE вопрос
Дмитрий Петров
Автор

Сообщений: 3142
Откуда: Пермь
Дата регистрации: 09.07.2001
PaulWist
Дмитрий Петров
Не знаю куда копать. ( ориентация таблицы колоночная)

Ну, добавить в таблицу тип данных ltree — тип данных для представления меток данных в иерархической древовидной структуре (аналог hyerarchy MSSQL)

Пример: Hierarchical data in postgres с триггером поддержания типа ltree
Не, это исключено. Добавление/изменение 1 поля- это целая эпопея. Между схемами и разнымтбазами его прокинуть- то еще занятие. У нас солянка Posrgresql, Greenplum и Clikhouse на выходе
Ratings: 0 negative/0 positive
Re: Recursive CTE вопрос
Владимир Максимов

Сообщений: 14185
Откуда: Москва
Дата регистрации: 02.09.2000
Хорошего решения при такой структуре данных не будет. Проблема здесь именно в количестве записей. По крайней мере MS SQL всегда "плохо" работает с выборками, где надо объединить два больших списка

Если количество уровней вложенности ограниченно и заранее известно, то можно попробовать просто "в лоб" собрать из последовательных UNION

select
1 as level,
tab1.id
from Tab as tab1
where tab1.ParentId = 0
UNION ALL
select
2 as level,
tab2.id
from Tab as tab1
inner join Tab as tab2 on tab2.parentId = tab1.Id
where tab1.ParentId = 0
UNION ALL
select
3 as level,
tab3.id
from Tab as tab1
inner join Tab as tab2 on tab2.parentId = tab1.Id
inner join Tab as tab3 on tab3.parentId = tab2.Id
where tab1.ParentId = 0
Ratings: 0 negative/0 positive
Re: Recursive CTE вопрос
Дмитрий Петров
Автор

Сообщений: 3142
Откуда: Пермь
Дата регистрации: 09.07.2001
Спасибо, Владимир. Я попробую. Вроде уровней меньше 5
Ratings: 0 negative/0 positive
Re: Recursive CTE вопрос
PaulWist

Сообщений: 14819
Дата регистрации: 01.04.2004
Дмитрий Петров

Не, это исключено. Добавление/изменение 1 поля- это целая эпопея. Между схемами и разнымтбазами его прокинуть- то еще занятие. У нас солянка Posrgresql, Greenplum и Clikhouse на выходе

Сделай matview + индексы на него + вычисляемое поле, вАще от таблиц отвяжешься.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено 1 раз(а). Последнее : PaulWist, 09.06.25 11:35
Ratings: 0 negative/0 positive
Re: Recursive CTE вопрос
Дмитрий Петров
Автор

Сообщений: 3142
Откуда: Пермь
Дата регистрации: 09.07.2001
Точно, надо попробовать. Сейчас на темповых таблицах сделал с минимумом полей.
В 10 минут отрабатывает
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 7 (Гостей: 7)

© 2000-2025 Fox Club 
Яндекс.Метрика