|
Сохранение порядка строк в UNION ALL
|
|||
---|---|---|---|
#18+
У меня есть запрос в котором мне удобно сохранить порядок строк: Код: plsql 1. 2. 3. 4. 5. 6.
По умолчанию, моя версия оракла уже так и делает - UNION ALL в 11.2 гарантирует последовательное исполнение подзапросов, и сохранение их порядка как они записаны сверху вниз. В Оракле 12+ я знаю что можно указать хинт чтоб и там сохранялся порядок строк, но в ущерб параллельного исполнения подзапросов. А как сделать чтобы и подзапросы исполнялись параллельно, и результат был в определенном порядке? Параллельность важна, если у подзапросов долгий тайм-аут. Пока я додумался до такого: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
Что работает, немного коряво с точки зрения поддержки - нужно следить за номерами строк, как в старом бэйсике. В PL/SQL 10.0+ очень удобно использовать $$PLSQL_LINE для этих целей, но в SQL это макро недоступно. Есть ли способ решить эту задачу, кроме вышеописанной ручной нумерации строчек? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2020, 20:46 |
|
Сохранение порядка строк в UNION ALL
|
|||
---|---|---|---|
#18+
pipelined function ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2020, 23:28 |
|
Сохранение порядка строк в UNION ALL
|
|||
---|---|---|---|
#18+
НеофитSQL UNION ALL в 11.2 гарантирует последовательное исполнение подзапросов, и сохранение их порядка как они записаны сверху вниз. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2020, 11:28 |
|
Сохранение порядка строк в UNION ALL
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров НеофитSQL UNION ALL в 11.2 гарантирует последовательное исполнение подзапросов, и сохранение их порядка как они записаны сверху вниз. думаю, он имел в виду вот это: https://docs.oracle.com/database/121/VLDBG/GUID-1F4C90F9-3EF5-423A-B55B-2593FB3F1433.htm поведение по умолчанию предполагает, что следующая ветка union all не начнет исполняться до окончания предыдущей. при этом я не нашел упоминания о том, в каком именно порядке эти ветки будут исполняться (в порядке как указано в запросе, или в каком-то ещё). с другой стороны, а в каком ещё порядке они могут исполняться? что может побудить оптимизатор перемешать union all? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2020, 11:59 |
|
Сохранение порядка строк в UNION ALL
|
|||
---|---|---|---|
#18+
кит северных морей с другой стороны, а в каком ещё порядке они могут исполняться? что может побудить оптимизатор перемешать union all? Ни разу не сталкивался с выполнением union all в порядке, отличном от исходного, что, однако, не отменяет того факта, что oracle все-таки не гарантирует этого и закладываться на это в боевом коде глупо. И именно отсутствие этой гарантии и позволило включить параллельную обработку частей union all по умолчанию в 12 версии. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2020, 13:27 |
|
Сохранение порядка строк в UNION ALL
|
|||
---|---|---|---|
#18+
кит северных морей с другой стороны, а в каком ещё порядке они могут исполняться? что может побудить оптимизатор перемешать union all? Ну например parallel slaves или (гипотетически) RAC - разбросать по nodes. Результат - мешанина строк из разных частей UNION ALL. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2020, 13:27 |
|
Сохранение порядка строк в UNION ALL
|
|||
---|---|---|---|
#18+
Меня больше интересует принципиальные вопросы: 1. Если порядок важен, то почему не указан order by? 2. Какой смысл хотеть параллельного выполнения, если хочется, чтобы сначала вернулись строки в порядке указания частей union all? Ведь это означает лишнюю работу, если фетч прекратится досрочно и зря простаивающие слейвы пока фетчатся предыдущие части. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2020, 13:33 |
|
Сохранение порядка строк в UNION ALL
|
|||
---|---|---|---|
#18+
SY Ну например parallel slaves или (гипотетически) RAC - разбросать по nodes. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2020, 13:38 |
|
Сохранение порядка строк в UNION ALL
|
|||
---|---|---|---|
#18+
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. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2020, 13:52 |
|
Сохранение порядка строк в UNION ALL
|
|||
---|---|---|---|
#18+
кит северных морей с другой стороны, а в каком ещё порядке они могут исполняться? что может побудить оптимизатор перемешать union all? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2020, 13:58 |
|
Сохранение порядка строк в UNION ALL
|
|||
---|---|---|---|
#18+
кит северных морей 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. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2020, 14:02 |
|
Сохранение порядка строк в UNION ALL
|
|||
---|---|---|---|
#18+
НеофитSQL, Потому что в стандарте SQL не определен порядок "по умолчанию". Понятно, что он есть, но он может быть какой угодно. Чтобы отсортировать в "правильном порядке", нужно указать как сортировать (по какому полю). Так что все правильно Oracle делает. А то что вы хотите это специфичная вещь, для конкретной реализации и привязываться к ней, это говнокод. С неизбежным получением в будущем кучи проблем. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2020, 07:57 |
|
Сохранение порядка строк в UNION ALL
|
|||
---|---|---|---|
#18+
Привет всем! 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.
Пример упрощен для читабельности, в реальности многие из строк - кандидаты для параллельного исполнения. Этот код отвечает моим требованиям: разрешить параллельное исполнение, сохранить порядок результата как в коде, не требовать ручной (и подверженной ошибкам) перенумерации при изменении порядок строчек в коде. К сожалению, он полагается на то, что Оракл начнет исполнение в порядке написания, а таких гарантий у Оракла я не нашел. По вопросам уважаемых участников: xtender Меня больше интересует принципиальные вопросы: 1. Если порядок важен, то почему не указан order by? 2. Какой смысл хотеть параллельного выполнения, если хочется, чтобы сначала вернулись строки в порядке указания частей union all? Ведь это означает лишнюю работу, если фетч прекратится досрочно и зря простаивающие слейвы пока фетчатся предыдущие части. 1. Order by - предпочтительный метод, я считаю. Полагаться на задокументируемые аспекты поведения - плохая практика. К сожалению, не предусмотрен удобный ключ сортировки соответствующий номеру строки, как в PL/SQL. Добавление числа вызывает неудобства ручной перенумерации, описанные в первом сообщении. 2. Смысл в том, чтобы время исполнения всего запроса не слишком превышало время исполнения самого долгого из подзапросов. Например, подзапросы ходят в интернет, у которого при обрыве связи тайм аут может достигать десятки секунд. UNION ALL из сотни непараллельных запросов может подвиснуть на час, а параллельных - завершится в пределах минуты. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2020, 16:52 |
|
Сохранение порядка строк в UNION ALL
|
|||
---|---|---|---|
#18+
НеофитSQL Вот один из менее трудоемких способов Как уже писали в соседней ветке, надеюсь, никогда не придётся сопровождать ваш код. НеофитSQL Например, подзапросы ходят в интернет А за такое по-хорошему надо сразу давать по рукам. Для решения задач параллельного сбора данных из вызовов веб-сервисов есть другие решения. И это не SQL. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2020, 17:09 |
|
Сохранение порядка строк в UNION ALL
|
|||
---|---|---|---|
#18+
НеофитSQL Этот код отвечает моим требованиям: разрешить параллельное исполнение, сохранить порядок результата как в коде, не требовать ручной (и подверженной ошибкам) перенумерации при изменении порядок строчек в коде. имхо Вы сами себе противоречете "разрешить параллельное исполнение" подразумевает что результат может не сответствовать union all если нужен/важен порядок то "как в старом бэйсике" нагляднее и понятнее, по крайней мере мне ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2020, 17:20 |
|
Сохранение порядка строк в UNION ALL
|
|||
---|---|---|---|
#18+
env Для решения задач параллельного сбора данных из вызовов веб-сервисов есть другие решения. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2020, 18:14 |
|
Сохранение порядка строк в UNION ALL
|
|||
---|---|---|---|
#18+
кит северных морей, Сомневаюсь, что ТС уже знает, что такое дб линки. По предыдущим постам - автор топика пытается натянуть функционал декларативной совы на императивный объектно-ориентированный глобус. упд. по теме топика - порядок гарантирует только явный order by ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2020, 18:21 |
|
Сохранение порядка строк в UNION ALL
|
|||
---|---|---|---|
#18+
НеофитSQL Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
Даже помимо Код: plsql 1. 2.
что вообще планировалось достичь добавлением сиквенса? Есть понимание как вообще работают сиквенсы в параллельных планах? Сиквенсы сейчас выполняются в отдельной непараллельной строке плана - операция так и называется "SEQUENCE"... ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2020, 18:26 |
|
Сохранение порядка строк в UNION ALL
|
|||
---|---|---|---|
#18+
НеофитSQL К сожалению, не предусмотрен удобный ключ сортировки соответствующий номеру строки, как в PL/SQL Нет никакого номера строки пока не начался фетч (псевдостолбец rownum) или не будет задана явная сортировка набора данных. Пора бы уже прекратить ждать от множеств поведения им несвойственного. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2020, 18:29 |
|
Сохранение порядка строк в UNION ALL
|
|||
---|---|---|---|
#18+
НеофитSQL 2. Смысл в том, чтобы время исполнения всего запроса не слишком превышало время исполнения самого долгого из подзапросов. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2020, 18:31 |
|
Сохранение порядка строк в UNION ALL
|
|||
---|---|---|---|
#18+
xtender НеофитSQL 2. Смысл в том, чтобы время исполнения всего запроса не слишком превышало время исполнения самого долгого из подзапросов. Вполне возможно, что я не понимаю - новичок в SQL. К сожалению, у меня пока недостает эрудиции понять ваше объяснение. Мое понимание параллельности подзапросов было такое: - оракл запускает несколько запросов одновременно. Для примера, три подзапроса А,Б,В все начались в пределах 10-миллисекунд. - Подзапрос А продолжался 10 секунд, подзапрос Б 5 секунд, подзапрос В - 7 секунд. Порядок завершения: Б,В,А - учитывая что задана сортировка через order by, результаты Б и В будут сидеть в памяти пока запрос А не завершится. - когда запрос А завершится, результат будет отсортирован и выдан в порядке А,Б,В (это исходное условие). - Параллелизм позволяет такую задачу решить за 10 секунд, вместо 22 секунд при последовательном исполнении. Я интересовался, есть ли удобный, известный и практикуемый метод для задания сортировочного ключа, чтобы не прибегать к ручной нумерации а-ля бэйсик. Хотя я теперь нашел решение этой задачи которое отвечает всем моим требованиям, из негодующих ответов можно заключить, что ручная нумерация а-ля бэйсик является предпочитаемым решением, из соображений читабельности. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2020, 19:07 |
|
Сохранение порядка строк в UNION ALL
|
|||
---|---|---|---|
#18+
env НеофитSQL К сожалению, не предусмотрен удобный ключ сортировки соответствующий номеру строки, как в PL/SQL Нет никакого номера строки пока не начался фетч (псевдостолбец rownum) или не будет задана явная сортировка набора данных. Пора бы уже прекратить ждать от множеств поведения им несвойственного. Ваш ответ возможно верен для другого случая, но rownum к этой задаче не относится. Меня интересует порядок запросов в исходном коде, и PL/SQL содержит макро для этого. SQL, увы, его не содержит. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2020, 19:11 |
|
Сохранение порядка строк в UNION ALL
|
|||
---|---|---|---|
#18+
env Для решения задач параллельного сбора данных из вызовов веб-сервисов есть другие решения. И это не SQL. Оракл не рекомендуется использовать для хождения в интернет? Это связано с отсутствием хороших библиотек, или есть другие причины? Пожалуйста расскажите, какие решения предпочтительны в таком случае? Допустим, к примеру*, у меня задача показать в запросе первые 10 сообщений из каждого из трех email почтовых ящиков на разных континентах. Если сортировка не требуется, я могу написать следующее: Код: plsql 1. 2. 3. 4.
Через некоторое время, в зависимости от интернет соединения и здоровья серверов, запрос вернет до 30 строчек, где группы от разных серверов будут в неопределенном порядке - скорее всего в порядке завершения подзапросов, предполагая параллельное исполнение. Вопрос сортировки не трогаю, он уже решен в другом ответе. Если такой код вызывает ужас и отвращение, то как лучше, и в чем его недостатки. (*) пример придуманный, потому что у меня в данный момент нет задач требующих параллельного исполнения. Я задаю вопросы вне сферы своих задач, потому что это помогает учить SQL и ознакомиться с общепринятыми методами. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2020, 19:31 |
|
Сохранение порядка строк в UNION ALL
|
|||
---|---|---|---|
#18+
НеофитSQL, Теперь все понятно, ваше понимание параллельного выполнения неверно, оттого и все проблемы и изчально странный вопрос. Вам стоит это изучить досконально, тогда и этот вопрос бы не появился. Пока достаточно вам запомнить, что никакого порядка нет пока не указан order by. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2020, 19:32 |
|
Сохранение порядка строк в UNION ALL
|
|||
---|---|---|---|
#18+
НеофитSQL Код: plsql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2020, 19:53 |
|
|
start [/forum/topic.php?fid=52&fpage=37&tid=1880894]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
57ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 179ms |
0 / 0 |