Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / А как правильно делать запрос с учетом агрегации потомков? / 6 сообщений из 6, страница 1 из 1
22.11.2019, 08:58
    #39892663
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А как правильно делать запрос с учетом агрегации потомков?
Допустим у меня есть справочник REF, записи REC и детали записей DETAILS.
В деталях может быть сторнирование и мне нужно отобрать неаннулированные записи.
Сейчас я делаю так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select ...
from REF
join REC on (REC.REF_ID = REF.ID)
join (
select DETAILS.REC_ID, sum(DETAILS.SUM) as SUM
from REF
join REC on (REC.REF_ID = REF.ID)
join DETAILS on (DETAILS.REC_ID = REC.ID)
where REF.TYPE = 'type1'
group by DETAILS.REC_ID
having sum(DETAILS.SUM) > 0
) T on (T.REC_ID = REC.ID)


Но может быть я недооцениваю оптимизатор Oracle и внутри T можно делать группировку непосредственно по DETAILS (без дополнительной фильтрации), а фильтр вынести на основной уровень?
...
Рейтинг: 0 / 0
22.11.2019, 09:46
    #39892688
alex-ls
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А как правильно делать запрос с учетом агрегации потомков?
напишите оба варианта и посмотрите планы, в чем проблема?
...
Рейтинг: 0 / 0
22.11.2019, 09:56
    #39892692
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А как правильно делать запрос с учетом агрегации потомков?
По времени выполнения оба варианта одинаковы, по планам в первом варианте есть table access full для REC и DETAILS, во втором варианте table access full для REC и использование индексов DETAILS. Но не уверен, что это показательно, потому что таблицы маленькие.
У меня нет проблем с производительностью запросов, меня интересует, какой вариант более правильный.
...
Рейтинг: 0 / 0
22.11.2019, 10:27
    #39892718
alex-ls
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А как правильно делать запрос с учетом агрегации потомков?
наполните таблицы тестовыми сгенерированными записями
...
Рейтинг: 0 / 0
22.11.2019, 15:13
    #39892991
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А как правильно делать запрос с учетом агрегации потомков?
Alibek B.

Но может быть я недооцениваю оптимизатор Oracle

Оптимизатор Вы скорее переоцениваете, а вот возможности языка - да, недооцениваете.
Как правило, идея дважды соединить один и тот же набор данных дает очень мало профита.
...
Рейтинг: 0 / 0
22.11.2019, 17:01
    #39893073
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А как правильно делать запрос с учетом агрегации потомков?
andrey_anonymous
Оптимизатор Вы скорее переоцениваете, а вот возможности языка - да, недооцениваете.
Как правило, идея дважды соединить один и тот же набор данных дает очень мало профита.

Вероятно да.
Поменял таблицы в запросе так, чтобы DETAILS был таблицей на пару сотен миллионов записей, а кардинальность остальных таблиц была более-менее сопоставимой.
Второй вариант работает определенно лучше, чем первый.
Я бы даже сказал, что был удивлен, насколько быстро Oracle смог сгруппировать столь большую таблицу, пусть даже в результате количество строк небольшое.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / А как правильно делать запрос с учетом агрегации потомков? / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]