Форум программистов, компьютерный форум, киберфорум
Oracle
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
1184 / 540 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
1

Распаралелить select union all

17.02.2017, 20:27. Показов 1658. Ответов 5
Метки нет (Все метки)

Есть таблица куда нужно добавить записи из множества внешних таблиц ссылающихся на файлы из папок примонтированных к серверу. Я хочу заставить оракл распаралелить чтение из этих различных таблиц (а по сути файлов), но у меня это не получается.
Пробовал так:
SQL
1
2
3
4
5
6
INSERT INTO DESTINATION_TABLE
 SELECT /*+ PARALLEL(5) */ * FROM EXTERNAL_SOURCE_TABLE1 WHERE some_codition UNION ALL 
 SELECT /*+ PARALLEL(5) */ * FROM EXTERNAL_SOURCE_TABLE2 WHERE some_codition UNION ALL 
 SELECT /*+ PARALLEL(5) */ * FROM EXTERNAL_SOURCE_TABLE3 WHERE some_codition UNION ALL
 SELECT /*+ PARALLEL(5) */ * FROM EXTERNAL_SOURCE_TABLE4 WHERE some_codition UNION ALL 
 SELECT /*+ PARALLEL(5) */ * FROM EXTERNAL_SOURCE_TABLE5 WHERE some_codition;
и так
SQL
1
2
3
4
5
6
INSERT /*+ PARALLEL(DESTINATION_TABLE, 5) */ INTO DESTINATION_TABLE
 SELECT * FROM EXTERNAL_SOURCE_TABLE1 WHERE some_codition UNION ALL 
 SELECT * FROM EXTERNAL_SOURCE_TABLE2 WHERE some_codition UNION ALL 
 SELECT * FROM EXTERNAL_SOURCE_TABLE3 WHERE some_codition UNION ALL
 SELECT  * FROM EXTERNAL_SOURCE_TABLE4 WHERE some_codition UNION ALL 
 SELECT  * FROM EXTERNAL_SOURCE_TABLE5 WHERE some_codition;
Но в обоих случаях я вижу как в списке процессов появляется много потоков что делают селект, потом количество потоков падает до 1, потом снова появляется много потоков что делают чтение из файлов. Из этого понятно что одновременно паралельно происходит чтение из файлов одной внешней таблицы, после чего процесс переходит к следующей и следующей, а я хотел бы чтобы со всех таблиц паралельно производилось чтение, мне кажется что это уменьшило бы общее время выполнения запроса, другое дело как заставить оракл сделать как я хочу.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.02.2017, 20:27
Ответы с готовыми решениями:

Select into и union all
Подскажите что в этой конструкции не так. sql.Add('SELECT munr, tippos,oktmo, god, zn8006001 as...

SELECT SUM(...) ...UNION ALL
Помогите пожалуйста в такой ситуации: Есть запрос на объединение, оба запроса обращаются к одной...

Как применить Маску при экспорте в csv (SQL UNION SELECT)
Здравствуйте, подскажите пожалуйста Как применить Маску для Полей в Столбике КодТовара "00000" ...

union как определить из какой таблице запись после UNION?
Подскажите пожалуйста! Вот например две таблице (TEBLE_1) у которой поля row_1(BIGINT) и (TABLE_2)...

5
339 / 235 / 113
Регистрация: 12.05.2016
Сообщений: 642
18.02.2017, 21:06 2
1) У меня ощущение, что для инсертов надо врубать параллелизм не через хинт, а с помощью ALTER SESSION.
Но с ходу в документации подтверждения своим словам не нашел.

SQL
1
2
3
ALTER SESSION ENABLE PARALLEL DML
или даже
ALTER SESSION FORCE PARALLEL DML PARALLEL 5
2) Распаралеленный INSERT использует Direct-Path инсерты ("прямые вставки", так же как при INSERT /*+ append */) у которых есть несколько очень нехороших побочных эффектов: во-первых, не используется свободное место в таблице ниже high watermark (которое образуется после delete-ов), прямые вставки пишут в область выше high watermark и этим раздувают место, занимаемое таблицей в файле данных; во-вторых, при прямых вставках таблица лочится в эксклюзивном режиме (!!!) из неё даже селектить нельзя будет до коммита!

3) Надо снять трейс файл и посмотреть реальный план запроса. Там четко видно (по крайней мере, начиная с 10 версии, на каком этапе подключилась параллельная обработка)


4)
Цитата Сообщение от Gepar Посмотреть сообщение
мне кажется что это уменьшило бы общее время выполнения запроса
Это, кстати, тоже далеко не факт, можно упереться в bandwidth дисковой системы или еще быстрее - сети.

Добавлено через 8 минут
А ишо, может на пайплайн функцию перейти для чтения внешних файлов ?

В документации даже пример есть (Example 13-34 Using a REF CURSOR to Read a Set of External FIles):

http://docs.oracle.com/cd/E118... #ADDCI4745


Хотя конечно вопрос спорный, будет ли выигрыш относительно UNION.
Но по крайней мере файлы читаться будут параллельно, может тогда и INSERT распараллеливать не придется, из-за вышеописанных спецэффектов.
2
1184 / 540 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
19.02.2017, 10:55  [ТС] 3
Цитата Сообщение от Anvano Посмотреть сообщение
при прямых вставках таблица лочится в эксклюзивном режиме (!!!) из неё даже селектить нельзя будет до коммита
Я прекрасно понимаю что после APPEND до commit нельзя работать с этой же таблицей и я понимаю что использование места в таблице будет не столь эффективно, но при текущей архитектуре приложения буквально раз в неделю по набору заявок нужно вычитать огромные архивы данных что лежат в виде файлов и читаются часов 5 в текущем режиме, при этом найдётся пара тысяч записей и всё.
Я также понимаю что возможно параллельное чтение файлов из разных таблиц не даст ускорения, но я хочу сравнить. Я уже поднимал inittrans на таблице при создании до 20, в пн. попробую ещё force parallel на сессии, спасибо что напомнили об этой возможности, о результатах отпишусь.
0
759 / 660 / 195
Регистрация: 24.11.2015
Сообщений: 2,160
20.02.2017, 17:55 4
Цитата Сообщение от Gepar Посмотреть сообщение
хочу заставить оракл распаралелить чтение из этих различных таблиц (а по сути файлов),
Я, обычно, в подобных случаях (распараллеливание работы с файлами) делаю несколько сессий (джобов) и явно запускаю их в параллель. Не уверен, что это даст наилучший результат по быстродействию, но если таблицы (файлы) велики, то делаю так. А если они невелики, то как ни сделаешь, все, практически, одинаково

Добавлено через 3 минуты
Цитата Сообщение от Gepar Посмотреть сообщение
Я прекрасно понимаю что после APPEND до commit нельзя работать с этой же таблицей
Как-то изначально не указывалось, что нужен APPEND. Или я чего-то не заметил? Может быть, как-то уточнить постановку?
0
1184 / 540 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
20.02.2017, 22:58  [ТС] 5
Цитата Сообщение от AGK Посмотреть сообщение
Я, обычно, в подобных случаях (распараллеливание работы с файлами) делаю несколько сессий (джобов) и явно запускаю их в параллель. Не уверен, что это даст наилучший результат по быстродействию, но если таблицы (файлы) велики, то делаю так. А если они невелики, то как ни сделаешь, все, практически, одинаково
Хотелось бы одной транзакцией, иначе придётся ещё целостность потом валидировать и обдумывать случаи перезапуска если одна сессия отпала и т.д
Цитата Сообщение от AGK Посмотреть сообщение
Как-то изначально не указывалось, что нужен APPEND. Или я чего-то не заметил? Может быть, как-то уточнить постановку?
APPEND не нужен, но его свойства не пугают так как этот insert select это последнее что будет делаться с таблицей куда добавляются данные.

FORCE PARALLEL DML не помогло. Распаралелись все тупейшие запросы типа delete from table where x = 100500, но вот этот insert select union all перестал паралелиться вообще, тоесть не то что без хинтов, а даже с хитнами parallel именно этот insert стал работать в один поток, пришлось выключить опцию чтобы хинты parallel снова заработали.
0
759 / 660 / 195
Регистрация: 24.11.2015
Сообщений: 2,160
21.02.2017, 11:08 6
Цитата Сообщение от Gepar Посмотреть сообщение
придётся ещё целостность потом валидировать
Если целостность будет нарушена, то UNION ALL не спасет ситуацию, а, наоборот, усугубит ее, поскольку крест будет поставлен на всех сканированиях всех таблиц. А если сессии независимы, то хотя бы что-то будет завершено. Но это так, общие рассуждения.
Цитата Сообщение от Gepar Посмотреть сообщение
обдумывать случаи перезапуска если одна сессия отпала
Да, согласен, приходилось это делать. Но это не так сложно, как кажется. Валидация данных более опасна. Может быть, merge использовать вместо insert, а валидацию как-то включить в условие merge?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.02.2017, 11:08

Распаралелить программу
Здравствуйте уважаемые форумчане! Нужно распаралелить программу которая меняет местами столбцы...

Распаралелить алгоритм нахождения кратчайшего пути
Здравствуйте. Помогите, пожалуйста, распаралелить алгоритм Дейкстры. Вообще идей нету как это можно...

Распаралелить работу с базой (фоновый процесс)
Проблема состоит в следующем. Когда пользователь запускает рассылку, то может идти пить чай --...

Как распаралелить цикл с помощью второго потока?
double Y(double p) { return sin(p); } void PrM ( double a1, double b1, int n1, double h1) {...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru