powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / LATERAL (SELECT FROM DUAL)
13 сообщений из 13, страница 1 из 1
LATERAL (SELECT FROM DUAL)
    #39889302
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет. Есть подобный запрос:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
select
			shortcut.column_1 as returned_column_1,
			shortcut.column_2 as returned_column_2,
			(...)
			-- далее идут колонки, вычисляемые на основе колонок shortcut.* (и таблиц, участвующих в запросе)
			-- пример (из головы):
			case shortcut.some_more_column
				when 1 then shortcut.column_1
				when 2 then shortcut.column_2
				else some_udf(t0.some_column_1, t1.some_column_1, t2.some_column_1)
			end as some_calculated_column,
			(...)
		from some_table t0
			left join some_table t1
				on (...)
			left join some_table t2
				on (...)
			(...)
			left join some_table tN
				on (...)
			cross join lateral (
				select
						coalesce(tN.some_column_1, (...), t2.some_column_1, t1.some_column_1, t0.some_column_1) as column_1,
						coalesce(tN.some_column_2, (...), t2.some_column_2, t1.some_column_2, t0.some_column_2) as column_2,
						(...)
						case
							when tN.some_column_1 is not null then tN.some_column_2
							(...)
							when t2.some_column_1 is not null then t2.some_column_2
							when t1.some_column_1 is not null then t1.some_column_2
						end as some_more_column,
						(...)
					from dual) shortcut


Дак вот, вопрос такой: оправдано ли использование LATERAL в данном случае (как видно, только лишь для удобства) ?
На мой взгляд, оптимизатор в любом случае перепишет (раскроет) LATERAL(SELECT FROM DUAL), и план не будет испорчен.
Oracle 12.2
...
Рейтинг: 0 / 0
LATERAL (SELECT FROM DUAL)
    #39889347
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--
оправдано ли использование LATERAL в данном случае (как видно, только лишь для удобства) ?
А мне понравилось. Как способ избежать лишнего уровня вложенности для декларации сложных промежуточных выражений. И делать так можно несколько раз...
--Eugene--
Код: plsql
1.
cross join lateral

cross apply короче.
...
Рейтинг: 0 / 0
LATERAL (SELECT FROM DUAL)
    #39889351
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--
только лишь для удобства
Это похоже на типичный
Код: plsql
1.
merge … using dual on (1=1)
...
Рейтинг: 0 / 0
LATERAL (SELECT FROM DUAL)
    #39889493
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

я почему спрашиваю: руководитель считает, что я очень неправ, применяя CROSS LATERAL таким образом, мол, это очень(!) опасно.
мне бы ему привести какой-то аргумент..
...
Рейтинг: 0 / 0
LATERAL (SELECT FROM DUAL)
    #39889512
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--

На мой взгляд, оптимизатор в любом случае перепишет (раскроет) LATERAL(SELECT FROM DUAL), и план не будет испорчен.
Oracle 12.2

не совсем понятно с перепишет

Код: plsql
1.
2.
3.
4.
5.
6.
select ename,sal,l.*  from emp e cross join lateral (select sin(e.empno) s,cos(e.empno) c from dual) l

SELECT STATEMENT 	 	14	1	5	196	 	 
 NESTED LOOPS 	 	14	1	5	196	 	 
       FAST DUAL 	 	1	1	2	 	 	 
       TABLE ACCESS     STORAGE FULL	EMP	14	1	3	196	 



.....
stax
...
Рейтинг: 0 / 0
LATERAL (SELECT FROM DUAL)
    #39889528
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

это что же значит, остаётся мучаться и копипастить выражения колонок ?..
...
Рейтинг: 0 / 0
LATERAL (SELECT FROM DUAL)
    #39889537
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--
остаётся мучаться и копипастить выражения колонок ?
Имена выражениям можно дать в подзапросе.
--Eugene--
мол, это очень(!) опасно
Постобъявление и инициализация "переменных" по первости непривычна для восприятия. А опасности оракл обеспечивает не только с "новыми" элементами синтаксиса. В каждом патчсете есть исправление wrong result с union и подзапросами.
...
Рейтинг: 0 / 0
LATERAL (SELECT FROM DUAL)
    #39889551
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-
Имена выражениям можно дать в подзапросе.
Каким образом это можно сделать на примере примера запроса, показанного мною в начале?
...
Рейтинг: 0 / 0
LATERAL (SELECT FROM DUAL)
    #39889565
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic
cross apply короче.
неужели CROSS JOIN LATERAL и CROSS APPLY механически одно и то же?
...
Рейтинг: 0 / 0
LATERAL (SELECT FROM DUAL)
    #39889569
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--
Stax,

это что же значит, остаётся мучаться и копипастить выражения колонок ?..


імхо
в подзапрос (вью)

select ... from (select ...)

если волка не боятся то наверное можно и "латералом" вычислять

мож со временем ето станет стандартным приемом (аля connect by без start)

ps
lateral относительно недавно появился, как бы он не стал источником багов/фич при ...

.....
stax
...
Рейтинг: 0 / 0
LATERAL (SELECT FROM DUAL)
    #39889603
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
lateral относительно недавно появился
Вроде в 9.2 уже был. В качестве контраргумента по, например, анси-джоинам, упоминаю union. В списке исправлений 19.5 есть:
29002488 Wrong Result With a Query Using Union All
28350595 poor performance on ansi join nested loops outer on aggregate view
...
Рейтинг: 0 / 0
LATERAL (SELECT FROM DUAL)
    #39889818
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--
Elic
cross apply короче.
неужели CROSS JOIN LATERAL и CROSS APPLY механически одно и то же?
Неужели после десятилетий проведенных с Ораклом вызывает затруднения посмотреть план или итоговый запрос после трансформаций?

Суть в том, что ключевые слова cross apply есть в целях соответствия анси стандарту, а ключевое слово lateral есть потому Оракл всегда идет своим путём.

Ну и синтаксически cross apply это частный случай join clause, а lateral - это частный случай query table expression.
Предполагается что lateral для НЕлюбителей анси синтаксиса.
...
Рейтинг: 0 / 0
LATERAL (SELECT FROM DUAL)
    #39889825
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic
А мне понравилось.
Может мой тест излишне синтетический но тратить на 40% больше CPU за ненужный FAST DUAL это слегка перебор.
желающие могут глянуть у себя
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create table t(id,val) as select rownum, mod(rownum,2) from
(select 0 from dual connect by rownum <= 1e6),
(select 0 from dual connect by rownum <= 1e2);

with w as
(select tt.*, decode(v, 10, 2, -1) c from (select t.*, decode(t.val, 0, 0, 10) v from t) tt)
select /*+ sqsqsq */ sum(val + v + c) from w;

with w as
(select t.*, a.v, decode(a.v, 10, 2, -1) c from t cross apply (select decode(t.val, 0, 0, 10) v from dual) a)
select /*+ cacaca */ sum(val + v + c) from w;

select executions exec, cpu_time cpu, v.*
  from v$sql v
 where sql_text not like '%v$sql%' and (sql_text like '%/*+ cacaca */%' or sql_text like '%/*+ sqsqsq */%');

...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / LATERAL (SELECT FROM DUAL)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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