Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Параллелим запрос  [new]
ParallelQ
Guest
Есть запроса вида
select ... from ...
union all
select ... from tab1...
union all
select ... from tab2...
union all
select ... from tab3...
union all
select ... from tab4...
union all
select ... from tab5...
union all
select ... from tab6...
...

Каждый селект по отдельности выполняется от 1-5 секунд, все вместе выполняются в районе минуты (это долго)
Можно ли распараллелить запрос, разбив на части именно по union all-ам (в надежде, что будет немного быстрее)?
28 июн 16, 12:28    [19344609]     Ответить | Цитировать Сообщить модератору
 Re: Параллелим запрос  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9250
google ?

https://docs.oracle.com/database/121/VLDBG/GUID-1F4C90F9-3EF5-423A-B55B-2593FB3F1433.htm

Не факт, что параллельно будет в N-раз быстрее. Если все "стоит колом" на обращение к дискам, то от параллелности/последовательности разницы не будет.
28 июн 16, 12:33    [19344633]     Ответить | Цитировать Сообщить модератору
 Re: Параллелим запрос  [new]
ParallelQ
Guest
Leonid Kudryavtsev
Не факт, что параллельно будет в N-раз быстрее. Если все "стоит колом" на обращение к дискам, то от параллелности/последовательности разницы не будет.

Понятно, что не факт, и скорее всего, что не будет, но надо попробовать )
В 11.2 PQ_CONCURRENT_UNION не канает похоже.
Найти бы пример или суть, как распараллелить через pipeline-функции (если это возможно, не используя scheduler и job-ы).
28 июн 16, 12:44    [19344686]     Ответить | Цитировать Сообщить модератору
 Re: Параллелим запрос  [new]
Добрый Э - Эх
Guest
ParallelQ
Каждый селект по отдельности выполняется от 1-5 секунд
это до первого фетча или возврат полного набора итоговых данных?
28 июн 16, 12:47    [19344700]     Ответить | Цитировать Сообщить модератору
 Re: Параллелим запрос  [new]
ParallelQ
Guest
Добрый Э - Эх
это до первого фетча или возврат полного набора итоговых данных?

Полный набор.
28 июн 16, 12:49    [19344723]     Ответить | Цитировать Сообщить модератору
 Re: Параллелим запрос  [new]
Egoр
Member

Откуда:
Сообщений: 829
ParallelQ,

tab1 ... tab6 - это просто таблицы или запросы с условиями where?
Если второе, что оптимизатор любит искать в таких unionах одинаковые условия в where и выность их наружу из union.
Что, разумеется, ломает планы внутренних запросов.
28 июн 16, 12:50    [19344725]     Ответить | Цитировать Сообщить модератору
 Re: Параллелим запрос  [new]
pihel
Member

Откуда: СПБ
Сообщений: 160
ParallelQ,


ParallelQ
Найти бы пример или суть, как распараллелить через pipeline-функции (если это возможно, не используя scheduler и job-ы).


Распараллельте физически любым из способов: периодическое асинхронное выполнение набора процедур
Внутрях там, правда, все равно джобы.
28 июн 16, 12:53    [19344752]     Ответить | Цитировать Сообщить модератору
 Re: Параллелим запрос  [new]
ParallelQ
Guest
Egoр
оптимизатор любит искать в таких unionах одинаковые условия в where и выность их наружу из union.

Запросы с условиями, но по плану вроде ничего не выносит.
pihel
Распараллельте физически любым из способов

Спасибо, видел, но во-первых, не понял механизм, во-вторых, предположим, делаю несколько pipeline.
Не пойму как потом собрать их результат в кучу и вообще как получить результат.
28 июн 16, 13:07    [19344836]     Ответить | Цитировать Сообщить модератору
 Re: Параллелим запрос  [new]
-2-
Member

Откуда:
Сообщений: 15330
ParallelQ,

Можно сделать пипелин, который запускает несколько процессов и ожидает от них данные через pipe или aq. Плюс, контролирует завершение всех процессов через тот же механизм.
28 июн 16, 13:14    [19344870]     Ответить | Цитировать Сообщить модератору
 Re: Параллелим запрос  [new]
Egoр
Member

Откуда:
Сообщений: 829
ParallelQ
Запросы с условиями, но по плану вроде ничего не выносит.
я тоже так думал пока не наткнулся. Такое
select ... where type_id = 3 union all select ... where type_id <> 3 
пришлось написать так
select ... where type_id = 3 union all select ... where case type_id when 3 then 1 else 0 end = 0 
Планы Oracle при этом тоже рисовал замечательные.
pihel
... как потом собрать их результат в кучу и вообще как получить результат.
Зависит от того, что потом нужно делать с результатом. Можно, например, сложить в промежуточную таблицу.
28 июн 16, 13:16    [19344878]     Ответить | Цитировать Сообщить модератору
 Re: Параллелим запрос  [new]
ParallelQ
Guest
Egoр
Зависит от того, что потом нужно делать с результатом. Можно, например, сложить в промежуточную таблицу.

Придется юзать постоянную таблицу с генерацией уникальных id запросов и т.д., что вряд ли будет сильно эффективнее,
а во временные складывать в других потоках смысла нет, не увидишь потом, так ведь?
И самое главное - dml-ить нельзя - т.к. обращение к функции, где этот запрос идет как
select * from table(myfunction)

-2-
Можно сделать пипелин, который запускает несколько процессов и ожидает от них данные через pipe или aq. Плюс, контролирует завершение всех процессов через тот же механизм.

Не знаю прокатит ли, посмотрю пайп, хотя запускать-то все равно через джобы...
Видимо, пока без вариантов.
28 июн 16, 13:26    [19344960]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить