Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / LATERAL (SELECT FROM DUAL) / 13 сообщений из 13, страница 1 из 1
14.11.2019, 22:14
    #39889302
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LATERAL (SELECT FROM DUAL)
Привет. Есть подобный запрос:
Код: 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
15.11.2019, 07:45
    #39889347
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LATERAL (SELECT FROM DUAL)
--Eugene--
оправдано ли использование LATERAL в данном случае (как видно, только лишь для удобства) ?
А мне понравилось. Как способ избежать лишнего уровня вложенности для декларации сложных промежуточных выражений. И делать так можно несколько раз...
--Eugene--
Код: plsql
1.
cross join lateral

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

я почему спрашиваю: руководитель считает, что я очень неправ, применяя CROSS LATERAL таким образом, мол, это очень(!) опасно.
мне бы ему привести какой-то аргумент..
...
Рейтинг: 0 / 0
15.11.2019, 12:40
    #39889512
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LATERAL (SELECT FROM DUAL)
--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
15.11.2019, 12:51
    #39889528
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LATERAL (SELECT FROM DUAL)
Stax,

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

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


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

select ... from (select ...)

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

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

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

.....
stax
...
Рейтинг: 0 / 0
15.11.2019, 14:04
    #39889603
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LATERAL (SELECT FROM DUAL)
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
15.11.2019, 16:42
    #39889818
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LATERAL (SELECT FROM DUAL)
--Eugene--
Elic
cross apply короче.
неужели CROSS JOIN LATERAL и CROSS APPLY механически одно и то же?
Неужели после десятилетий проведенных с Ораклом вызывает затруднения посмотреть план или итоговый запрос после трансформаций?

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

Ну и синтаксически cross apply это частный случай join clause, а lateral - это частный случай query table expression.
Предполагается что lateral для НЕлюбителей анси синтаксиса.
...
Рейтинг: 0 / 0
15.11.2019, 16:47
    #39889825
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LATERAL (SELECT FROM DUAL)
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / LATERAL (SELECT FROM DUAL) / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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