powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сохранение порядка строк в UNION ALL
51 сообщений из 51, показаны все 3 страниц
Сохранение порядка строк в UNION ALL
    #39997978
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня есть запрос в котором мне удобно сохранить порядок строк:

Код: plsql
1.
2.
3.
4.
5.
6.
select 'П' from dual   union all
select 'р' from dual   union all
select 'и' from dual   union all
select 'м' from dual   union all
select 'е' from dual   union all
select 'р' from dual 



По умолчанию, моя версия оракла уже так и делает - UNION ALL в 11.2 гарантирует последовательное исполнение подзапросов, и сохранение их порядка как они записаны сверху вниз.

В Оракле 12+ я знаю что можно указать хинт чтоб и там сохранялся порядок строк, но в ущерб параллельного исполнения подзапросов.

А как сделать чтобы и подзапросы исполнялись параллельно, и результат был в определенном порядке?
Параллельность важна, если у подзапросов долгий тайм-аут.

Пока я додумался до такого:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
select val from (
  select 10, 'П' val from dual   union all
  select 20, 'р' from dual   union all
  select 30, 'и' from dual   union all
  select 40, 'м' from dual   union all
  select 50, 'е' from dual   union all
  select 60, 'р' from dual 
order by 1)



Что работает, немного коряво с точки зрения поддержки - нужно следить за номерами строк, как в старом бэйсике.

В PL/SQL 10.0+ очень удобно использовать $$PLSQL_LINE для этих целей, но в SQL это макро недоступно.

Есть ли способ решить эту задачу, кроме вышеописанной ручной нумерации строчек?
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998001
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pipelined function
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998041
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
UNION ALL в 11.2 гарантирует последовательное исполнение подзапросов, и сохранение их порядка как они записаны сверху вниз.
С чего ты взял?
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998045
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров
НеофитSQL
UNION ALL в 11.2 гарантирует последовательное исполнение подзапросов, и сохранение их порядка как они записаны сверху вниз.
С чего ты взял?

думаю, он имел в виду вот это: https://docs.oracle.com/database/121/VLDBG/GUID-1F4C90F9-3EF5-423A-B55B-2593FB3F1433.htm

поведение по умолчанию предполагает, что следующая ветка union all не начнет исполняться до окончания предыдущей. при этом я не нашел упоминания о том, в каком именно порядке эти ветки будут исполняться (в порядке как указано в запросе, или в каком-то ещё).

с другой стороны, а в каком ещё порядке они могут исполняться? что может побудить оптимизатор перемешать union all?
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998054
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кит северных морей
с другой стороны, а в каком ещё порядке они могут исполняться? что может побудить оптимизатор перемешать union all?

Ни разу не сталкивался с выполнением union all в порядке, отличном от исходного, что, однако, не отменяет того факта, что oracle все-таки не гарантирует этого и закладываться на это в боевом коде глупо.
И именно отсутствие этой гарантии и позволило включить параллельную обработку частей union all по умолчанию в 12 версии.
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998055
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кит северных морей

с другой стороны, а в каком ещё порядке они могут исполняться? что может побудить оптимизатор перемешать union all?


Ну например parallel slaves или (гипотетически) RAC - разбросать по nodes. Результат - мешанина строк из разных частей UNION ALL.

SY.
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998056
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Меня больше интересует принципиальные вопросы:
1. Если порядок важен, то почему не указан order by?
2. Какой смысл хотеть параллельного выполнения, если хочется, чтобы сначала вернулись строки в порядке указания частей union all? Ведь это означает лишнюю работу, если фетч прекратится досрочно и зря простаивающие слейвы пока фетчатся предыдущие части.
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998060
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
Ну например parallel slaves или (гипотетически) RAC - разбросать по nodes.
это вариант с PQ_CONCURRENT_UNION. я говорю именно о NO_PQ_CONCURRENT_UNION, т.е. когда каждая ветка выполняется с DOP > 1, и потенциально cross-instace, но при этом строго последовательно.
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998063
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexFF__|
что, однако, не отменяет того факта, что oracle все-таки не гарантирует этого

косвенно гарантирует?

https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/The-UNION-ALL-INTERSECT-MINUS-Operators.html#GUID-B64FE747-586E-4513-945F-80CB197125EE You can combine multiple queries using the set operators UNION, UNION ALL, INTERSECT, and MINUS. All set operators have equal precedence. If a SQL statement contains multiple set operators, then Oracle Database evaluates them from the left to right unless parentheses explicitly specify another order.
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998065
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
кит северных морей

с другой стороны, а в каком ещё порядке они могут исполняться? что может побудить оптимизатор перемешать union all?
пока - ничто, но учитывая, что они никак не гарантировали, то в будущем могут легко изменять поведение. Например, переставлять в зависимости от order by, чтобы избежать сортировки, или переставлять более лёгкие части вперёд в случаях firsr_rows_n, и тд
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998067
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
кит северных морей
AlexFF__|
что, однако, не отменяет того факта, что oracle все-таки не гарантирует этого

косвенно гарантирует?

https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/The-UNION-ALL-INTERSECT-MINUS-Operators.html#GUID-B64FE747-586E-4513-945F-80CB197125EE You can combine multiple queries using the set operators UNION, UNION ALL, INTERSECT, and MINUS. All set operators have equal precedence. If a SQL statement contains multiple set operators, then Oracle Database evaluates them from the left to right unless parentheses explicitly specify another order.
evaluates и executes - разные вещи. Это как and/or в where - логический порядок, но не порядок выполнения (кстати, если правильно помню, там как раз бывает, что порядок меняется на обратный из-за специфики парсинга)
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998186
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

Потому что в стандарте SQL не определен порядок "по умолчанию".
Понятно, что он есть, но он может быть какой угодно.
Чтобы отсортировать в "правильном порядке", нужно указать как сортировать (по какому полю).

Так что все правильно Oracle делает.
А то что вы хотите это специфичная вещь, для конкретной реализации и привязываться к ней, это говнокод. С неизбежным получением в будущем кучи проблем.
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998413
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем!

SY уже указал раздел документации, где Оракл гарантирует сохранение порядка UNION ALL "как записано на экране".

В https://docs.oracle.com/database/121/VLDBG/GUID-1F4C90F9-3EF5-423A-B55B-2593FB3F1433.htm сказано:
авторHowever, unlike the sequential processing of one branch after another, the concurrent processing does not guarantee an ordered return of the results of the individual branches.

Мое прочтение, что фраза " в отличие от последовательного исполнения, параллельное исполнение не гарантирует упорядоченный результат", гарантирует упорядоченный результат для не-параллельного исполнения, и несет вес документации производителя.

Вот один из менее трудоемких способов задать порядок возврата строчек "как в тексте", без ручной перенумерации при передвижении строк вверх/вниз, который пришел на ум:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
-- монотонно растущий счетчик для поддержки натурально упорядоченных UNION ALL запросов
create sequence sq
minvalue 1
maxvalue 999999999999999999999999999
start with 1
increment by 1;

.........

select /*+ PQ_CONCURRENT_UNION(@"SET$1") */ val from (
  select sq.nextval, 'П' val from dual   union all
  select sq.nextval, 'р' from dual   union all
  select sq.nextval, 'и' from dual   union all
  select sq.nextval, 'м' from dual   union all
  select sq.nextval, 'е' from dual   union all
  select sq.nextval, 'р' from dual 
order by 1)



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

По вопросам уважаемых участников:
xtender
Меня больше интересует принципиальные вопросы:
1. Если порядок важен, то почему не указан order by?
2. Какой смысл хотеть параллельного выполнения, если хочется, чтобы сначала вернулись строки в порядке указания частей union all? Ведь это означает лишнюю работу, если фетч прекратится досрочно и зря простаивающие слейвы пока фетчатся предыдущие части.


1. Order by - предпочтительный метод, я считаю. Полагаться на задокументируемые аспекты поведения - плохая практика.
К сожалению, не предусмотрен удобный ключ сортировки соответствующий номеру строки, как в PL/SQL.
Добавление числа вызывает неудобства ручной перенумерации, описанные в первом сообщении.
2. Смысл в том, чтобы время исполнения всего запроса не слишком превышало время исполнения самого долгого из подзапросов.
Например, подзапросы ходят в интернет, у которого при обрыве связи тайм аут может достигать десятки секунд. UNION ALL из сотни непараллельных запросов может подвиснуть на час, а параллельных - завершится в пределах минуты.
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998429
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Вот один из менее трудоемких способов

Как уже писали в соседней ветке, надеюсь, никогда не придётся сопровождать ваш код.

НеофитSQL
Например, подзапросы ходят в интернет

А за такое по-хорошему надо сразу давать по рукам. Для решения задач параллельного сбора данных из вызовов веб-сервисов есть другие решения. И это не SQL.
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998439
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL

Этот код отвечает моим требованиям: разрешить параллельное исполнение, сохранить порядок результата как в коде, не требовать ручной (и подверженной ошибкам) перенумерации при изменении порядок строчек в коде.

имхо
Вы сами себе противоречете
"разрешить параллельное исполнение" подразумевает что результат может не сответствовать union all

если нужен/важен порядок то "как в старом бэйсике" нагляднее и понятнее, по крайней мере мне

.....
stax
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998474
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env
Для решения задач параллельного сбора данных из вызовов веб-сервисов есть другие решения.
ну, справедливости ради, он нигде не сказал про веб-сервисы. под "ходят в интернет" мог подразумеваться db link.
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998477
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кит северных морей,

Сомневаюсь, что ТС уже знает, что такое дб линки. По предыдущим постам - автор топика пытается натянуть функционал декларативной совы на императивный объектно-ориентированный глобус.


упд. по теме топика - порядок гарантирует только явный order by
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998481
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
НеофитSQL
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
select /*+ PQ_CONCURRENT_UNION(@"SET$1") */ val from (
  select sq.nextval, 'П' val from dual   union all
  select sq.nextval, 'р' from dual   union all
  select sq.nextval, 'и' from dual   union all
  select sq.nextval, 'м' from dual   union all
  select sq.nextval, 'е' from dual   union all
  select sq.nextval, 'р' from dual 
order by 1)


Даже помимо
Код: plsql
1.
2.
ERROR at line 3:
ORA-02287: sequence number not allowed here


что вообще планировалось достичь добавлением сиквенса? Есть понимание как вообще работают сиквенсы в параллельных планах? Сиквенсы сейчас выполняются в отдельной непараллельной строке плана - операция так и называется "SEQUENCE"...
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998483
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
К сожалению, не предусмотрен удобный ключ сортировки соответствующий номеру строки, как в PL/SQL


Нет никакого номера строки пока не начался фетч (псевдостолбец rownum) или не будет задана явная сортировка набора данных. Пора бы уже прекратить ждать от множеств поведения им несвойственного.
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998485
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
НеофитSQL
2. Смысл в том, чтобы время исполнения всего запроса не слишком превышало время исполнения самого долгого из подзапросов.
Основная ошибка у вас в том, что вы не понимаете как работают параллельные планы/операции... Пока слейв не передал свои данные координатору, он не запустит очередную итерацию дочерних операций. Соответственно, чтобы он продолжал "работать", надо чтобы координатор куда-то буферизовал полученные данные, пока их не отфетчат, что опять-таки приводит либо к блокирующим операциям типа BUFFER SORT или SORT ORDER BY. Так или иначе - это хрень полная
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998503
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtender
НеофитSQL
2. Смысл в том, чтобы время исполнения всего запроса не слишком превышало время исполнения самого долгого из подзапросов.
Основная ошибка у вас в том, что вы не понимаете как работают параллельные планы/операции... Пока слейв не передал свои данные координатору, он не запустит очередную итерацию дочерних операций. Соответственно, чтобы он продолжал "работать", надо чтобы координатор куда-то буферизовал полученные данные, пока их не отфетчат, что опять-таки приводит либо к блокирующим операциям типа BUFFER SORT или SORT ORDER BY. Так или иначе - это хрень полная


Вполне возможно, что я не понимаю - новичок в SQL.

К сожалению, у меня пока недостает эрудиции понять ваше объяснение.
Мое понимание параллельности подзапросов было такое:
- оракл запускает несколько запросов одновременно. Для примера, три подзапроса А,Б,В все начались в пределах 10-миллисекунд.
- Подзапрос А продолжался 10 секунд, подзапрос Б 5 секунд, подзапрос В - 7 секунд. Порядок завершения: Б,В,А
- учитывая что задана сортировка через order by, результаты Б и В будут сидеть в памяти пока запрос А не завершится.
- когда запрос А завершится, результат будет отсортирован и выдан в порядке А,Б,В (это исходное условие).
- Параллелизм позволяет такую задачу решить за 10 секунд, вместо 22 секунд при последовательном исполнении.

Я интересовался, есть ли удобный, известный и практикуемый метод для задания сортировочного ключа, чтобы не прибегать к ручной нумерации а-ля бэйсик.

Хотя я теперь нашел решение этой задачи которое отвечает всем моим требованиям, из негодующих ответов можно заключить, что ручная нумерация а-ля бэйсик является предпочитаемым решением, из соображений читабельности.
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998504
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
НеофитSQL
К сожалению, не предусмотрен удобный ключ сортировки соответствующий номеру строки, как в PL/SQL


Нет никакого номера строки пока не начался фетч (псевдостолбец rownum) или не будет задана явная сортировка набора данных. Пора бы уже прекратить ждать от множеств поведения им несвойственного.


Ваш ответ возможно верен для другого случая, но rownum к этой задаче не относится. Меня интересует порядок запросов в исходном коде, и PL/SQL содержит макро для этого. SQL, увы, его не содержит.
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998513
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
Для решения задач параллельного сбора данных из вызовов веб-сервисов есть другие решения. И это не SQL.


Оракл не рекомендуется использовать для хождения в интернет?
Это связано с отсутствием хороших библиотек, или есть другие причины?
Пожалуйста расскажите, какие решения предпочтительны в таком случае?

Допустим, к примеру*, у меня задача показать в запросе первые 10 сообщений из каждого из трех email почтовых ящиков на разных континентах. Если сортировка не требуется, я могу написать следующее:

Код: plsql
1.
2.
3.
4.
-- Функция FetchNewestEmails() возвращает таблицу
select FetchNewestEmails( 'imap:server1', credentials1, limit => 10 ) union all
select FetchNewestEmails( 'imap:server2', credentials2, limit => 10 ) union all
select FetchNewestEmails( 'imap:server3', credentials3, limit => 10 )



Через некоторое время, в зависимости от интернет соединения и здоровья серверов, запрос вернет до 30 строчек, где группы от разных серверов будут в неопределенном порядке - скорее всего в порядке завершения подзапросов, предполагая параллельное исполнение. Вопрос сортировки не трогаю, он уже решен в другом ответе.

Если такой код вызывает ужас и отвращение, то как лучше, и в чем его недостатки.

(*) пример придуманный, потому что у меня в данный момент нет задач требующих параллельного исполнения. Я задаю вопросы вне сферы своих задач, потому что это помогает учить SQL и ознакомиться с общепринятыми методами.
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998514
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
НеофитSQL,

Теперь все понятно, ваше понимание параллельного выполнения неверно, оттого и все проблемы и изчально странный вопрос. Вам стоит это изучить досконально, тогда и этот вопрос бы не появился. Пока достаточно вам запомнить, что никакого порядка нет пока не указан order by.
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998524
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
НеофитSQL
Код: plsql
1.
2.
3.
select FetchNewestEmails( 'imap:server1', credentials1, limit => 10 ) union all
select FetchNewestEmails( 'imap:server2', credentials2, limit => 10 ) union all
select FetchNewestEmails( 'imap:server3', credentials3, limit => 10 )

У вас еще нет понимания как работают параллельные запросы, как работает SEQUENCE, а теперь опять еще один прыжок к параллельному выполнению функций... По умолчанию, даже с concurrent union они будут выполнены в serial, а не в параллели. Желание объять "все и сразу" - понятно, но с ораклом так не получится. Пока это выглядит как будто уличный лекарь-калекарь советует выпить все таблетки разом, которые врач прописал пить по одной раз в день в течение месяца - мол, так быстрее...
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998525
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Оракл не рекомендуется использовать для хождения в интернет?
Основная задача у БД, как ни странно звучит, хранить и отдавать хранящиеся данные. Ходить за почтой за 50 косарей с ядра - откровенно так себе затея, никто же в здравом уме на S-классе картоху мешками не возит.
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998541
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Андрей Панфилов
НеофитSQL
Оракл не рекомендуется использовать для хождения в интернет?
Основная задача у БД, как ни странно звучит, хранить и отдавать хранящиеся данные. Ходить за почтой за 50 косарей с ядра - откровенно так себе затея, никто же в здравом уме на S-классе картоху мешками не возит.


Справедливое замечание, из соображений бережливости (экономии ЦПУ?).

С другой стороны, Оракл придумал/внедрил целую библиотеку для того, чтоб PL/SQL мог общаться с веб сайтами.
https://docs.oracle.com/database/121/ARPLS/u_http.htm#ARPLS70954

Если использование встроенных функций оракла для доступа к интернету считается плохим тоном, как принято это делать, учитывая что задача должна инициироваться по SQL запросу? подать сигнал на на обновление внешнему (не-Оракл) скрипту через виртуальную колонку?
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998547
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtender
НеофитSQL,

Теперь все понятно, ваше понимание параллельного выполнения неверно, оттого и все проблемы и изчально странный вопрос. Вам стоит это изучить досконально, тогда и этот вопрос бы не появился. Пока достаточно вам запомнить, что никакого порядка нет пока не указан order by.


Вам все понятно, но вы толком ничего пока не сказали. Из скромности?
Возможно, у вас есть глубокие познания в этом вопросе, но полезный вклад в эту тему вам пока не удалось сделать.

В 22196853 я изложил как я понимаю исполнение параллельных подзапросов в Оракле (когда они включены, для педантов :))
Для человека с практическим опытом было бы легко указать ошибку, тем самым улучшив не только мое понимание, но один из немногочисленных русскоязычных ресурсов по SQL.

Если вы здесь с другой целью, то с какой?
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998549
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
НеофитSQL,

НеофитSQL
В 22196853 я изложил как я понимаю исполнение параллельных подзапросов в Оракле (когда они включены, для педантов :))
я и так достаточно просто изложил в 22196830 , но вы не понимаете, так как вы даже не понимаете элементарно необходимые термины, что особенно четко видно по этому бредовому описанию - 22196853 .
Все эти "оракл запускает несколько запросов одновременно", "три подзапроса А,Б,В все начались", "порядок завершения", "результаты Б и В будут сидеть в памяти" - это все полный бред в контексте даже простых планов, даже без параллельного выполнения. Поймите сначала как хотя бы простые планы читать. Не надо пытаться перескочить на обсуждение тем, азов которых еще не понимаете.
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998550
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL

С другой стороны, Оракл придумал/внедрил целую библиотеку для того, чтоб PL/SQL мог общаться с веб сайтами.
https://docs.oracle.com/database/121/ARPLS/u_http.htm#ARPLS70954

Если использование встроенных функций оракла для доступа к интернету считается плохим тоном, как принято это делать, учитывая что задача должна инициироваться по SQL запросу? подать сигнал на на обновление внешнему (не-Оракл) скрипту через виртуальную колонку?

UTL_HTTP - это нечто, появившееся в версии 7.3.3 (это аж прошлый век) и тянущееся до текущих версий разве что из соображений обратной совместимости, а вот рассчитывать на то, что БД сможет полноценно общаться по HTTP с сегодняшним интернетом совершенно не следует, поскольку в HTTP сейчас понавернуто столько, что индусы из оракла за этим принципиально не поспевают.

Если нужно делать фигню, то можете делать ее через external table , там на каком-нить петоне можете хоть перпендикулярно почту забирать.
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998551
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
НеофитSQL
как я понимаю
начать с чтение плана запроса , потом сюда 21144264
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998553
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Андрей Панфилов,

Спасибо, я понял про внешние таблицы, я такую недавно использовал чтобы прочитать директорию на сервере,
но потом все-таки переделал на "родную" джава-функцию, для простоты. Директорию читать из Оракла наверное можно, это как одну картофелину в S-классе перевезти.

Я в целом понял что если задача посложнее, и для Оракла непрофильная, то лучше ее разгрузить в другое место (возможно, и другой хост через ssh), и общаться через external table, как в вашем примере. Почитаю, в какой сессии исполняются действию для таких таблиц.
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998558
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtender,

Увы, параллельное исполнение мне пока недоступно (версия 11.2).

Документация доступна. Давайте, вы мне немного поможете там, где можно обойтись без терминов.

Код: plsql
1.
2.
3.
4.
-- Функция FetchNewestEmails() возвращает таблицу
select FetchNewestEmails( 'imap:server1', credentials1, limit => 10 ) union all
select FetchNewestEmails( 'imap:server2', credentials2, limit => 10 ) union all
select FetchNewestEmails( 'imap:server3', credentials3, limit => 10 )



Мое понимание параллельности подзапросов было такое:
- оракл запускает несколько запросов одновременно. Для примера, три подзапроса А,Б,В все начались в пределах 10-миллисекунд.
- Подзапрос А продолжался 10 секунд, подзапрос Б 5 секунд, подзапрос В - 7 секунд. Порядок завершения: Б,В,А
- учитывая что задана сортировка через order by, результаты Б и В будут сидеть в памяти пока запрос А не завершится.
- когда запрос А завершится, результат будет отсортирован и выдан в порядке А,Б,В (это исходное условие).
- Параллелизм позволяет такую задачу решить за 10 секунд, вместо 22 секунд при последовательном исполнении.

Идентичная параллельная задача на другом языке. Исполняется параллельно, соответствует описанию выше. Терминов не требует, хотя при желании можно долго и нудно рассказывать про методы синхронизации исполнения на уровне 0 для многоядерных процессоров :)

Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#!/bin/bash
(sleep 10; echo "ResultsetA"  > 1.txt) &
process_idA=$!
(sleep  5; echo "ResultsetB" > 2.txt) &
process_idB=$!
(sleep  7; echo "ResultsetC" > 3.txt)

wait $process_idA
wait $process_idB
cat 1.txt 2.txt 3.txt



Подзапросы стартанули "одновременно" (очередно, но в пределах малого промежутка времени), самый долгий занял 10 секунд, поэтому весь запрос занял 10 секунд, но строки вернулись не в порядке запуска запросов, а в каком-то другом. Скорее всего в порядке завершения запросов, но и это Оракл вроде не гарантирует.

Где-то есть ошибка? Если есть, скажите, пожалуйста, в какой строчке.
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998561
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я ранее упомянул, что нашел-таки решение без "бейсика", но оно не изящнее, хоть и отвечает всем моим требованиям.

Прошу не пинать, это в товарный код не идет, упражнение для моего образования - на что способен SQL

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
-- QueryLine(GUID) возвращает число, соответствующее номеру строки в этом исходнике.
-- EXTERNAL_TABLE используется как интерфейс для вызова внешних, МЕДЛЕННЫХ источников данных
-- автор ожидает что при параллельном исполнении весь запрос займет не дольше чем самый медленный
-- из трех подзапросов (желаемый эффект параллельного исполнения), а порядок строчек в результате 
-- будет совпадать с порядком подзапросов в исходнике как если бы параллелизма не было.

create or replace view VZ_TEST as
select /*+ PQ_CONCURRENT_UNION(@"SET$1") */ * from (
select QueryLine('a3f9cd2a-6d17-4721-b6f2-435c2df9d152') as ord, v1.* from V_EXTERNAL_TABLE1 v1 union all
select QueryLine('13d865f8-2269-406f-a8cb-2c943ece4c76'),        v2.* from V_EXTERNAL_TABLE2 v2 union all
select QueryLine('524a3aaa-34ed-476b-ac36-fcd555a53875'),        v3.* from V_EXTERNAL_TABLE3 v3
) order by ord
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998581
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
НеофитSQL
обойтись без терминов
это проф.форум Oracle, поэтому здесь нужно пользоваться соответствующей проф. терминологией. Хотите в стиле "я художник - я так вижу", напишите мне на почту - объясню. Здесь же такой профанацией заниматься не стоит.
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998592
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
Здесь же такой профанацией заниматься не стоит.
Ну почему же? Ведь пошла же движуха, тролля покормили всласть...
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998598
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
...

create or replace view VZ_TEST as
select /*+ PQ_CONCURRENT_UNION(@"SET$1") */ * from (
select QueryLine('a3f9cd2a-6d17-4721-b6f2-435c2df9d152') as ord, v1.* from V_EXTERNAL_TABLE1 v1 union all
select QueryLine('13d865f8-2269-406f-a8cb-2c943ece4c76'),        v2.* from V_EXTERNAL_TABLE2 v2 union all
select QueryLine('524a3aaa-34ed-476b-ac36-fcd555a53875'),        v3.* from V_EXTERNAL_TABLE3 v3
) order by ord



У вас выражения "select ..." расположены одно под другим, т.е. последовательно, нет никаких оснований полагать что при таком расположении они будут выполняться параллельно.
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998669
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Идентичная параллельная задача на другом языке

Нет

НеофитSQL
Меня интересует порядок запросов в исходном коде, и PL/SQL содержит макро для этого. SQL, увы, его не содержит.

Как ещё вам объяснить, что зелёное и мягкое сравнивать нет смысла?


НеофитSQL
у меня задача показать в запросе первые 10 сообщений из каждого из трех email почтовых ящиков на разных континентах

Зачем для этого СУБД?

Если требуется анализировать эти сообщения, то отдельно обеспечьте регулярную загрузку сообщений в таблицы, отдельно делайте запрос к этим таблицам. Да, оракл может и "на лету", но зачем?!
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998748
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Андрей Панфилов
НеофитSQL

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
...

create or replace view VZ_TEST as
select /*+ PQ_CONCURRENT_UNION(@"SET$1") */ * from (
select QueryLine('a3f9cd2a-6d17-4721-b6f2-435c2df9d152') as ord, v1.* from V_EXTERNAL_TABLE1 v1 union all
select QueryLine('13d865f8-2269-406f-a8cb-2c943ece4c76'),        v2.* from V_EXTERNAL_TABLE2 v2 union all
select QueryLine('524a3aaa-34ed-476b-ac36-fcd555a53875'),        v3.* from V_EXTERNAL_TABLE3 v3
) order by ord



У вас выражения "select ..." расположены одно под другим, т.е. последовательно, нет никаких оснований полагать что при таком расположении они будут выполняться параллельно.


Это как раз один из сценариев, для которых Оракл ввел параллелизм в 12й версии.
Подробнее об этом можно прочитать здесь:
https://docs.oracle.com/database/121/VLDBG/GUID-1F4C90F9-3EF5-423A-B55B-2593FB3F1433.htm

Если вы только присоединяетесь к теме: до разрешения параллелизма Оракл гарантировал результат UNION ALL в том же порядке, как селекты написаны в коде запроса - это удобно тогда, когда нет удобного ключа сортировки.
При параллельном исполнении селектов порядок нарушался, и для его восстановления требуется order by.
Вопрос темы заключался в том, как избежать ручной нумерации строк а-ля бэйсик (10, 20, 30, 35, ..).

В PL/SQL есть встроенное макро $$PLSQL_LINE, которое дает номер строки исходника, и оно для этой цели просто идеально.
Я извернулся и написал свою функцию QueryLine() которая возвращает номер строки, но она требует GUID, что не так элегантно.
Зато теперь результаты параллельных селектов возвращаются в том же порядке, что написаны, и если мне нужно передвинуть строчки вверх-вниз в огромном селекте, мне не нужно помнить каждый раз менять ручную нумерацию.
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998820
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
как избежать ручной нумерации строк а-ля бэйсик (10, 20, 30, 35, ..).

НеофитSQL
Я извернулся и написал свою функцию QueryLine() которая возвращает номер строки, но она требует GUID

Разумеется, заменить число на строку в 36 символов и вызов функции - очень элегантное решение.

Автор, может уже поясните, какую реальную задачу пытаетесь столь извращённо решить?
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998822
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env

Автор, может уже поясните, какую реальную задачу пытаетесь столь извращённо решить?

Автор просто пытается перенести подходы и практику программирования на императивных языках в декларативные.
Наблюдаю с удовольствием.
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998825
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env,

ты слова не путай человеку.

Ясно, что "элегантный" это рояль, а он говорил изящное , подразумевая "решение".
хорошо, хоть не грациозное...
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998829
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
env

Автор, может уже поясните, какую реальную задачу пытаетесь столь извращённо решить?

Автор просто пытается перенести подходы и практику программирования на императивных языках в декларативные.
Наблюдаю с удовольствием.

Ну, это не обязательно всегда преступление.

Но читается, правда, с французским прононсом при разговоре прозой.
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998915
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
НеофитSQL
как избежать ручной нумерации строк а-ля бэйсик (10, 20, 30, 35, ..).

НеофитSQL
Я извернулся и написал свою функцию QueryLine() которая возвращает номер строки, но она требует GUID

Разумеется, заменить число на строку в 36 символов и вызов функции - очень элегантное решение.

Автор, может уже поясните, какую реальную задачу пытаетесь столь извращённо решить?


Так вот же :)

НеофитSQL
как избежать ручной нумерации строк а-ля бэйсик (10, 20, 30, 35, ..).


Решение с гуидами не требует ручной перенумерации (параллельные подзапросы вернутся в порядке как записаны, и строчки можно свободно двигать внутри UNION ALL), но выглядит громоздко, не говоря уже о внутренностях функции QueryLine, которая ковыряется в блобах исходного кода.
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998918
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQLТак вот же :)

Это не задача, это попытка натянуть сову на глобус. Какую задачу в терминах теории
множеств (на которой и базируется SQL) Вы пытаетесь решить?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998923
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Какую задачу ....

Сделать текстовый редактор на SQL ?

Автор уже упоминал, что ему нужно и в интернет лазать. Может даже и на полноценный Web Browser замахнулся! Пожелаем ему успехов.

IMHO
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998946
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
которая ковыряется в блобах исходного кода.

исходного кода чего?
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998960
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

Это не задача, это попытка натянуть сову на глобус. Какую задачу в терминах теории
множеств (на которой и базируется SQL) Вы пытаетесь решить?


Сугубо прикладную - улучшить понимание нового для меня языка и его возможностей.
Поэтому примеры не затасканные из учебника, а необычные, требующие живого мышления.
В рабочем коде все будет скучно и просто, с комментариями и без экзотики.

Браузер в Оракле? Нечем рендерить, поэтому вряд ли, да и задача большая, не для примера.
А вот забацать простой стрим крипто на SQL - это стОящий челлендж. Но поскольку
вряд ли крипто специалисты будут тут слоняться, это прикол для другого форума.

Солнышко светит, травка растет. Кто легче характером, тот дольше живет :)
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39998964
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQLСугубо прикладную - улучшить понимание нового для меня языка и его возможностей.

В таком случае именно изучение теории множеств Вам поможет.

НеофитSQLПоэтому примеры не затасканные из учебника, а необычные, требующие живого мышления.

Рекомендую https://www.sql-ex.ru
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39999010
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, посмотрю.
...
Рейтинг: 0 / 0
Сохранение порядка строк в UNION ALL
    #39999204
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
забацать простой стрим крипто на SQL - это стОящий челлендж

Ждём тему "50 оттенков челленджа"
...
Рейтинг: 0 / 0
51 сообщений из 51, показаны все 3 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сохранение порядка строк в UNION ALL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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