Найти в Дзене
Oracle Developer

Друзья, всем привет

Друзья, всем привет! 👋🏻 На связи Паша, ваш куратор и специалист в мире Oracle. Давно ничего не писал в канал, пришло время исправиться 😉 На собеседованиях часто задают вопросы про CTE и WITH, поэтому сегодня решили немного поговорить о том, что это за конструкция, и как она выглядит в плане запроса. Итак, поехали 🤞🏻 Многие привыкли думать о CTE так: вынесли подзапрос в WITH, Oracle его один раз вычислил и потом просто использует готовый результат. Звучит логично… но не всегда так работает 🤔 Вот небольшой пример для разминки (типовая схема Order Entry): WITH top_orders AS ( SELECT o.* FROM oe.orders o WHERE o.order_date >= DATE '2024-01-01' ) SELECT c.cust_last_name, (SELECT COUNT(*) FROM top_orders t WHERE t.customer_id = c.customer_id) cnt_orders, (SELECT SUM(t.order_total) FROM top_orders t WHERE t.customer_id = c.customer_id) sum_amount FROM oe.customers c; В этом запросе top_orders используется дважды. Интуитивно кажется: Oracle один раз посчитает CTE и дальш

Друзья, всем привет! 👋🏻

На связи Паша, ваш куратор и специалист в мире Oracle. Давно ничего не писал в канал, пришло время исправиться 😉

На собеседованиях часто задают вопросы про CTE и WITH, поэтому сегодня решили немного поговорить о том, что это за конструкция, и как она выглядит в плане запроса. Итак, поехали 🤞🏻

Многие привыкли думать о CTE так: вынесли подзапрос в WITH, Oracle его один раз вычислил и потом просто использует готовый результат. Звучит логично… но не всегда так работает 🤔

Вот небольшой пример для разминки (типовая схема Order Entry):

WITH top_orders AS (

SELECT o.*

FROM oe.orders o

WHERE o.order_date >= DATE '2024-01-01'

)

SELECT c.cust_last_name,

(SELECT COUNT(*)

FROM top_orders t

WHERE t.customer_id = c.customer_id) cnt_orders,

(SELECT SUM(t.order_total)

FROM top_orders t

WHERE t.customer_id = c.customer_id) sum_amount

FROM oe.customers c;

В этом запросе top_orders используется дважды. Интуитивно кажется: Oracle один раз посчитает CTE и дальше будет просто брать данные из уже подготовленного набора. Но так ли это на самом деле? Напишите в комментариях 👇🏻

Заодно ещё пара вопросов, ответы на которые пригодятся на собеседовании:

• Может ли Oracle "развернуть" CTE, как обычный подзапрос, и выполнить его несколько раз?

• В каких случаях действительно стоит заставлять Oracle материализовать CTE вручную, и как это сделать?

Делитесь опытом: используете ли WITH ради оптимизации или всё-таки только ради читабельности кода? 🧩

Продолжение, как обычно, в четверг.

Всем хорошего дня ☀️

#oracle #backendpro #sql #оптимизация #Pavel_Dolganov

Канал Oracle Developer | Чатик 💬

Мини-курс Оптимизация: Быстрый старт 🚀

Анкета предзаписи на 7 поток "Оптимизация Oracle SQL"

📱 Facebook 📱 YouTube 📱 ВКонтакте 📱 LinkedIn 📱 Threads