Oracle Developer👨🏻‍💻
3.17K subscribers
583 photos
63 videos
2 files
469 links
🔝 канал о разработке в СУБД Oracle:
SQL, PL/SQL, оптимизация, архитектура и многое другое...

Backend-pro.ru - обучение по различным программам, связанных с backend-разработкой для ФЛ и ЮЛ.

Отец-основатель: @denis_dbd Кивилёв Денис
Download Telegram
Ч.2. С чего начать изучать SQL? (4/17)

У нас есть таблицы (employees, departments), в которых хранится: название отдела, фио, должность, зп в месяц

Давайте их соединим:

select d.department_name, e.first_name, e.last_name, sum(e.salary) 
from employees e
join departments d on e.department_id = d.department_id
where e.first_name = 'John'
group by d.department_name, e.first_name, e.last_name
having sum(e.salary) > 1000
order by d.department_name, e.first_name;

И здесь ключевой момент:
Для тестировщика можно оперировать таким допущением.
После FROM идет сборка "огромной таблицы" из всех перечисленных таблиц.

Вот собралась одна такая таблица - и дальше уже начинают ее фильтровать и из нее делать select.

Почему я заострил на этом внимание?
Гуглеж или чтение учебников с ходу не дают эту информацию. Нужно прочитать 100500 страниц текста, чтобы это понять.
А учебники, вообще, мало кто читает...

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

Обсудить в чатике 💬

Автор: @KlimenkovDM
#sqlдлятестировщиков #тестирование
Специально для Oracle Developer
Друзья, всем привет!

По техническим причинам, решили опубликовать все посты сразу в одном месте.

Из-за отсутствия свободного времени у Даниила на редактирование, посты опубликованы "как есть" без редакций и купюр😉
Начинающим QA и заинтересовавшимся - рекомендую дочитать до конца, возможно, найдете, что-то полезное для себя.

От автора
"Да, серия постов получилась сумбурной :)
И по ней явно не научишься писать SQL запросы.
Однако, если вы сейчас изучаете SQL, то надеюсь эти лайфхаки вам помогут в работе."

Напомню, это была "проба пера". Не всегда все выходит, так как мы хотим. Ничего страшного. В нашей жизни должно быть пространство для экспериментов 😉
Если есть желание поддержать автора - ставьте 🔥

Обсудить в чатике 💬

Всем хороших выходных 🎊

Oracle Developer
Коллеги погромисты, с профессиональным праздником 👯‍♀️

А вот и эксклюзивный стих для канала про программистов от ChatGpt:
В мире кода и баз данных,
Oracle разработчик - властелин,
Он читает строки, словно маг,
А глюки в его коде - неосязаемы, по-арабски.

От себя пожелаю - гореть своей профессией, получать удовольствие, чтоб каждый день был как праздник 😉🔥

Поздравить друг друга в чатике 💬

Oracle Developer
Собеседование во "Вкусно и Точка"

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

Решил продолжить практику написания постов на тему технических собеседований. Собеседование проходил на позицию Senior Data Engineer во "Вкусно и Точка".

О вакансии
Дата платформа(DP) включает в себя:
▫️DWH(15Tb) на базе дистрибутива Greenplum от Arenadata(ADB);
▫️ClickHouse и Superset для Data Marts и BI;
▫️S3 — для хранения сырых данных (RAW слой);
▫️Airflow в качестве оркестратора ETL pipeline(ов);
▫️Шина данных ESB(Kafka, NiFi, RabbitMQ)

Основные задачи:
Основные задачи связаны с развитием Дата платформы. В текущем варианте хранилище находится в самом начале своего развития, как и в целом IT департамент, т.к. при уходе из России Макдональдс забрал практически весь IT ландшафт.

Плюшки
Годовой бонус, ДМС, скидки на спорт.

Из минусов:
Гибридный формат работы(3 дня Office, 2 дня Home Office).

Про з/п
Диалог начинали от 350k net. После тех. собеседования и приглашения в офис для личного знакомства сумма изменилась до 400к net.

Этапы собеседований
1️⃣
Предварительное общение с HR
Вкратце о своем опыте и почему ищу работу.

Продолжительность интервью - 15 минут.

2️⃣ Интервью
Состав из 2х человек:
▫️ Руководитель направления развития DP;
▫️ Архитектор;
Формат интервью:
▫️ Знакомство;
▫️ Технические вопросы;
▫️ Вопросы от соискателя.

Продолжительность интервью - 1.5 часа.

3️⃣ Оффер

Продолжение следует...

Обсудить в чатике 💬

Автор: Ruslan
Предыдущий опыт собеседований от него.

#вкусноиточка #собеседование
Oracle Developer
Техническое собеседование во "Вкусно и Точка"

Формат общения - онлайн, звонок по Телемосту Яндекс.

Список вопросов:

1️⃣ Smart Scans. Что это и как работает?

2️⃣ Способы оптимизации запросов. Описать процесс, привести примеры.

3️⃣ Задача на SQL:
Необходимо перестроить справочник ресторанов, убрав столбец director. История должна быть перестроена.

4️⃣ Какие особенности работы с таблицами в Greenplum?

5️⃣ Какие цели у централизованного DDS слоя в DWH?

Разбор, как всегда, в четверг 🎓
Обсудить в чатике 💬

Автор: Ruslan
#вкусноиточка #собеседование
Oracle Developer
Техническое собеседование во "Вкусно и Точка". Ответы

Список вопросов: см. в посте вторника.

Ответы:
1️⃣ Smart Scans. Что это и как работает?
Классические схемы включают в себя сервер СУБД и системы хранения. Под каждый из компонентов оборудование может подбираться как отдельно, так и вместе с целью достижения максимальной производительности БД. В таких схемах системы хранения становятся узким местом в вопросах оптимизации производительности БД.

Опция Smart Scan - это фича Oracle Exadata.

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

В случае Exadata выполнение SQL-запросов может выполняться на серверах хранения. Ключевое слово может. Эта опция называется Smart Scan. Поскольку это опция, она может быть как включена, так и выключена(см. параметр
cell_offload_processing).

Выборки и фильтрация данных происходят на серверах хранения, а сервер БД занимается приемом результатов от серверов хранения и их объединением в единый пакет результата.

Для тех, кто хочет углубиться в архитектуру
Oracle Exadata прикладываю ссылку.

2️⃣ Способы оптимизации запросов. Описать процесс, привести примеры.
Тема довольно сложная и обширная. Курс по секционированию и оптимизации запросов с лихвой покрывают большинство вопросов на собеседованиях.

3️⃣ Задача на SQL:
см. следующий пост.

4️⃣ Какие особенности работы с таблицами в Greenplum?
Эта тема отдельного поста. Если этот пост наберет 50 лайков, сделаю отдельную статью, в которой подробно разберу данную тему.

5️⃣ Какие цели у централизованного DDS слоя в DWH?
Detail Data Storage, DDS - один из слоев DWH, предназначенный для целей внедрения сквозной аналитики по компании. Он позволяет объединить множество таблиц из различных систем в основные сущности, в разрезе которых анализируется динамика операционных показателей бизнеса.

Отсутствие данного слоя в DWH в большинстве случаев приводит:
▫️к несогласованности показателей в отчетности;
▫️к росту нагрузки на ODS;
▫️к избыточности данных в DWH.

Обсудить в чатике 💬

Автор: Ruslan
#вкусноиточка #собеседование
Oracle Developer
3️⃣ Задача на SQL:
Необходимо перестроить справочник ресторанов, убрав столбец director. История должна быть перестроена.

Основная цель задания - написать sql запрос, который пересоберет историю изменений в формате SCD2, исключая столбец director.

При решении этой задачи в голове сразу всплывает мысль воспользоваться оконными функциями для объединения/схлопывания интервалов по строкам, в которых изменения происходили только по полю director.

Важно учесть периоды, в которых происходили изменения только в поле seat_cnt: 300, 500, 300 при прочих равных условиях, т.е. временные изменения кол-ва мест в ресторанах.
В противном случае получим пересечение соседних интервалов в рамках одного ресторана.

Можно также решить через конструкцию model в oracle.

Обсудить в чатике 💬

Автор: Ruslan
#вкусноиточка #собеседование
Oracle Developer
Итоги собеседования во "Вкусно и Точка"

Так и не сумели договориться по деньгам 😊

HR 💬 "Вы произвели хорошее впечатление, но, к сожалению, у нас есть ограничения по ФОТ. Максимально возможный оклад , который мы можем предложить вам, 350k gross."

Договорились на том, что если появятся вакансии поинтереснее, то продолжим диалог.

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

Выводы:
Для себя я понял, что на собеседовании очень важно говорить уверенно и с легкой наглостью.
⚠️Важно не перегибать и вовремя понять, что вы, возможно, не целиком видите картину.

Обсудить в чатике 🫂

Палец вверх, если зашло 👍

Ставь 🔥, если хочешь узнать, что спрашивали на интервью по секции System Design в компанию, занимающуюся разработкой продуктов интегрированного планирования и управления цепями поставок.

Обсудить в чатике 💬

Автор: Ruslan
#вкусноиточка #собеседование
Oracle Developer
Всем привет!
Конкурс пока откладываем, сейчас нет времени им заниматься, но он обязательно состоится.
А пока наслаждайтесь, собеседованием в "Леруа Мерлен" от Руслана.
Собеседование в Леруа Мерлен

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

Пока нахожусь в процессе написания поста по секции System Design, как и обещал в предыдущем посте, решил осветить мой опыт работы на проекте в одном из крупнейших ритейлеров DIY + продолжить практику написания постов на тему технических собеседований.

На текущий момент работаю в консалтинге, поэтому при смене проектов приходиться каждый раз проходить тестирование. Собеседование в этот раз проходил на проект по динамическому ценообразованию в Леруа Мерлен.

Стек:
Дата платформа(DP) включает в себя:
▫️Greenplum 320TB(ODS 205 TB, MARTS 115 TB);
▫️Greenplum&Power BI, ClickHouse/PostgreSQL&Superset для Data Marts и BI;
▫️Spark SQL — для обработки данных из RAW и загрузки в ODS;
▫️S3 — для хранения сырых данных (RAW слой - 140 TB);
▫️Airflow в качестве оркестратора ETL pipeline(ов);
▫️Шина данных ESB(Kafka, NiFi).

Детали по DP можно прочитать здесь.

Про команду и ее задачи:
Команда из 10 человек:
▫️Product Owner - InHouse;
▫️Team Lead - InHouse;
▫️2 Data Scientist(DS) - 2 FT аутстаффинга;
▫️1 Data Engineer(DE) - 1 FT аутстаффинг;
▫️1 Business and Data Analyst(DA/BA) - 1 FT аутстаффинг;
▫️1 DE/DA/BA - 1 FT аутстаффинг;
▫️2 BI developer(BI) - 1 FT аутстаффинг;
▫️Data partner - InHouse.

Задачи:
1️⃣
Разработать модель динамического ценообразования;
2️⃣Интеграция источников данных по мониторингу цен конкурентов и др. источники;
3️⃣Развитие и оптимизация отчетности ценообразования.

О моем функционале и ролях:
Совмещал роли DE, DA и BA.

Функционал:
1️⃣
Развитие DDS ценообразования;
2️⃣ Интеграция внешних источников;
3️⃣ Развитие и оптимизация BI отчетности в части Data Marts.

Детали по функционалу:
1️⃣
Роли DA и BA подразумевают опыт в части развития DDS, нужно понимать какие факты и справочники должны быть в ритейле, какие разрезы будет смотреть бизнес, ориентироваться по цифрам.
2️⃣ Есть задачи, связанные с интеграциями внешних источников. Их мало. Сам процесс подразумевает много общения и заявок в Slack и др. внутренние системы Леруа, на мой взгляд, ничего общего с функционалом DE/DA/BA.
3️⃣ Прежде всего это оптимизация скриптов и рефакторинг отчетности на предмет того, какими данными хорошо бы обогатить DDS.

Из плюсов:
▫️Доступы дали в 1ый же день;
▫️Можно работать удалено из любой точки мира;
▫️Классный офис со спортзалом и столовой(шведский стол - сравнительно дешево).

Из минусов:
▫️Французская корпоративная культура. Почему это минус - расскажу в финальной части своего поста.
▫️Релизная политика в DWH;
▫️30 % времени кластер Greenplum либо недоступен, либо тормозит.

⚠️ Т.к. мой формат работы в качестве аутстаффера на проекте не подразумевает трудоустройство напрямую в компанию и некоторые опции мне недоступны, остальные параметры я указал, исходя из того, что узнал в процессе работы.

Плюшки:
▫️ДМС и спортзал внутри офиса.
▫️Судя по вакансиям на hh.ru есть внутреннее обучение;
▫️По наблюдениям есть программы развития для сотрудников как вертикально, так и горизонтально.

Про з/п
Для внутренних сотрудников примерно от 200к до 350k net. В основном это ставки для дата-команд.
В финальном посте сделаю краткий обзор на организационную структуру процессов разработки.

Этапы собеседований
1️⃣
Техническое собеседование с одним из внутренних дата инженеров;

Продолжительность тестирования - 60 минут.

2️⃣ Знакомство с руководством(состав из 2х человек):
▫️ Директор по цифровым продуктам;
▫️ Product owner.

Продолжительность ~ 40 минут.

3️⃣ Ответ: взяли/не взяли.

Продолжение следует...

Обсудить в чатике 💬

Автор: Ruslan
#leroymerlin #собеседование
Oracle Developer
Техническое собеседование в Леруа Мерлен

Формат общения - онлайн, звонок по Zoom.

Список вопросов:

1️⃣ Есть таблица из следующих полей: Магазин, Товар, Дата старта действия цены, Цена.
При загрузке новых цен в таблицу просто добавляются новые строчки без delete/update предыдущих.
Необходимо написать запрос, который выгрузит данные по активным ценам на конкретную дату. Обернуть в функцию. Какие плюсы и минусы такого хранения данных?

2️⃣ Есть 2 таблицы:
▫️Таблица поставок: Поставщик, Цена товара, Кол-во заказанного товара, дата заказа.
▫️Таблица поставщиков: Поставщик, Наименование поставщика
Необходимо найти поставщика с максимальной суммой заказов за месяц.

3️⃣ Условия задачи выше(см. п.2). Необходимо найти поставщика, который ничего не поставил за месяц. Рассказать, какой будет план запроса, что необходимо сделать, чтобы в плане был hash join и что это такое?

4️⃣ Есть таблица поставок: id, delivery_date, supplier_id, product_id, shipped, unit_price.
Какой поставщик отгрузил товаров нам на наибольшую сумму денег?

5️⃣ Колоночное хранение данных. Какие плюсы и минусы?

6️⃣ Данные в таблице равномерно распределены за 10 лет, не секционированы.
Как "бесшовно" для юзера удалить данные за 8 лет и предусмотреть подобные регламентные очистки в будущем?

7️⃣ Есть очень большая таблица, в которой 100 полей. Первичного ключа в таблице нет, но есть набор из 30 полей, при помощи которого можно идентифицировать каждую строку. Как можно проверить наличие дубликатов в таблице?
⚠️Подсказка: GROUP BY по 30 полям выполняется очень долго или вообще не отрабатывает.

8️⃣ Как распределяются данные по сегментам и что такое перекосы?

9️⃣ Представим, что вы главный аналитик на проекте ценообразования. Раньше ценообразованием занимались эксперты, теперь хотим, чтобы цена определялась автоматически. Что вы будете делать?

Разбор как всегда в четверг 🎓

Обсудить в чатике 💬

Автор: Ruslan
#leroymerlin #собеседование
Oracle Developer
Техническое собеседование в Леруа Мерлен. Ответы

Список вопросов: см. в посте вторника.

Ответы:
1️⃣ Есть таблица из следующих полей: Магазин, Товар, Дата старта действия цены, Цена.
Полная постановка в посте вторника

Итоговая функция - см. следующий пост в файле ⬇️

Плюсы:
▫️Быстрее запись в таблицу;
▫️Меньше места занимают данные.

Минусы:
▫️При любом запросе необходимо считывать всю таблицу для преобразования в SCD2 формат;
▫️При росте объема данных текущие вычислительные ресурсы перестанут справляться с вычислениями;
▫️Отсутствие поля для секционирования, т.е. только горизонтальное масштабирование ресурсов кластера поможет решить проблемы с производительностью запросов.

По 2️⃣, 3️⃣ и 4️⃣ запросы довольно простые, поэтому решение оставим на добрую волю читателей.
Добавлю, что в плане запроса должен быть full table scan по обеим таблицам и hash join.
Что это такое и с чем это едят - рассказывается на
курсе по оптимизации Oracle SQL.

5️⃣ Колоночное хранение данных. Какие плюсы и минусы?
Вкратце колоночное хранение данных - это хранение каждого поля таблицы в отдельном файле.
Плюсы:
▫️Производительность запросов ощутимо выше, т.к. читаются только те данные, которые указаны в select, а не вся строка;
▫️Хорошо подходят для вставки большого объема данных, операции batch-insert;
▫️Удаление колонки существенно дешевле в отличии от традиционных СУБД, удаляется только файл с указанным полем, не затрагивая остальные данные;
▫️Алгоритмы сжатия данных работают лучше на колоночных таблицах, т.к. каждый файл, который необходимо сжать, хранит данные только одного типа.

Минусы:
Не подходит для OLTP, т.к. стоимость одиночных вставок очень высока.

6️⃣ Данные в таблице равномерно распределены за 10 лет, не партицированы.
Как "бесшовно" для юзера удалить данные за 8 лет и предусмотреть подобные регламентные очистки в будущем?
Алгоритм:
▫️create table t2 as select * from t where ... distributed ...;
▫️alter table t rename t3; alter table t2 rename t;

Далее решаем, удалять данные из хранилища или сохранить в качестве истории.

⚠️ Можно поступить по-другому в случае, если доступ к таблице для пользователя предоставлен через view.
К сожалению, нет под рукой GP для эксперимента.

Концепт идеи:
Реализовать онлайн перестройку таблицы, выделить в отдельную секцию данные за 8 лет, а во view добавить условие фильтрации, чтобы пользователь не смог получить эти исторические данные.

7️⃣ Есть очень большая таблица, в которой 100 полей. Первичного ключа в таблице нет, но есть набор из 30 полей, при помощи которого можно идентифицировать каждую строку. Как можно проверить наличие дубликатов в таблице?
⚠️Подсказка: GROUP BY по 30 полям выполняется очень долго или вообще не отрабатывает.

▫️Воспользоваться оконной функцией row_number() с указанием 30 полей в partition by.
▫️Создать сцепку из 30 полей и применить hash-функцию. В разрезе нового поля применить row_number.
▫️Создать уникальный индекс(в виду ограничений действий на промышленной среде этот вариант не подходит).

8️⃣ Как распределяются данные по сегментам и что такое перекосы?
Тема отдельного поста.

9️⃣ Представим, что вы главный аналитик на проекте ценообразования. Раньше ценообразованием занимались эксперты, теперь хотим, чтобы цена определялась автоматически. Что вы будете делать?
Тема довольно дискуссионная. Расскажу про свой опыт и наблюдения решения подобных задач.

Здесь можно выделить два решения:
Промышленное коробочное решение - в эту сторону чаще смотрят большие начальники;
Самописные решения на базе ML - очень любят амбициозные аналитики и разработчики.

Критерий выбора зависит от целей, которая преследует компания:
▫️Повышении уровня товарооборота и др. операционных показателей - однозначно промышленное коробочное решение.
▫️Только автоматизация - можно попробовать справиться собственными силами или силами аутстаффинга.

Автор: Ruslan
#leroymerlin #собеседование
Oracle Developer
Итоги собеседования в Леруа Мерлен

Оба собеседования прошел успешно.

🔸Корпоративная культура в Леруа Мерлен:
В Леруа очень ценят людей, можно назвать это даже фанатизмом. Мне после российского ритейла было очень непривычно.
Лучше всего корпоративная культура отражена в диалоге, который у меня произошел с одним из моих коллег.

Вкратце, была обнаружена ошибка в отчете об остатках(диалог проходил в личном чате):
Я: "Косяк в стоках у тебя. Мы продаем в день ~2 ярда, а стоков у нас на триллион руб? Такого быть не может!"
Коллега: "Давай без таких резких фраз, они на меня давят. Я в целом не очень люблю оценочных суждений и резких слов. Фразу у тебя косяк я воспринимаю тяжело".

Необходимо быть аккуратным в коммуникации, а порой и в своей собственной активности лишь бы не задеть чувств менее активных коллег. Таков уж Леруа!

🔸Организационная структура процессов развития:
Организационная структура компании состоит из доменов, подразделения которые сосредотачивают в себе определенные функции бизнеса и поддержки, аналог дирекций/управлений/служб в др. компаниях.

Леруа на текущий момент распиливает все купленные коробочные решения на микросервисы, в связи с этим активное развитие получило продуктовое направление - разработка продуктов внутренними силами доменов.

Примерная структура домена выглядит следующим образом:
▫️Операционная команда;
▫️Архитектор;
▫️Product Owner(PO);
▫️Team Lead(TL);
▫️Дата команда
Под каждый продукт выделяется отдельный PO, TL и дата команда на его развитие.

Домен, отвечающий за развитие и поддержку Даты Платформы, отвечает за выкатку релизов. Дата команда участвует в разработке до момента, когда будет сделан pull request в Git репозиторий.

🔸Релизная политика Data Platform(DP) в Леруа Мерлен:
Согласно релизной политике DP, накат на прод происходит не чаще, чем 1 раз в неделю. Прозябал какой-нибудь грант на чтение и релиз переносится на следующую неделю.
Такой регламент сильно тормозит развитие отчетности в компании и приводит к тому, что основное большинство скриптов находится "на руках" у аналитиков и разработчиков. Большие "портянки" скриптов переносятся в BI инструменты вместо элегантного однострочного обращения к таблице или представлению.

Инвестиционные затраты(CAPEX) на развитие отчетности и модели ценообразования(средняя ставка по рынку аутстаффинга ~25к/день):
CAPEX(мес) = 6 FT аутстаффинга * 25к * 22(кол-во раб. дн./мес.) ~ 3,3 млн. руб./мес. + ФОТ внутренних сотрудников даты команды.

⚠️Чем реже релизы, тем дольше люди сидят на проектах, тем больше денег платит компания за аутстафф. Сумма для небольшой команды довольно внушительная.

🔸Общее впечатление:
В целом, положительное.

Плюсы:
▫️В компании действительно развитая инженерная культура, "не боятся" новых технологий и готовы к развитию.
▫️Очень спокойный темп работы. Кому надоели дедлайны "Вчера" - вам в Леруа!

Есть и минусы:
▫️Слабо развито направление бизнес-аналитики, если сравнивать с тем, что я видел в Food Ритейле.
Учитывая, что менеджмент компании решил изменить позиционирование Леруа на рынке DIY в сторону развития омниканальных продаж(ее основными конкурентами становятся e-commerce гиганты Wildberries, Ozon, Yandex Market), усиление этого направления крайне важно для компании.
▫️ Немного смутил неопытный молодой состав руководителей. Видимо, текущая ситуация и продажа компании местному менеджменту, вынудило головную компанию ADEO перевести опытных ключевых сотрудников к себе в штат.

И ДА, от Леруа мне поступало предложение перейти к ним в штат в один из других доменов...

Обсудить в чатике 💬

Автор: Ruslan
#leroymerlin #собеседование
Oracle Developer
Задача. Транспонирование данных

Даны следующие коллекции
create type tr_dml as object(name varchar2(4000), value varchar2(4000));
create type tt_dml as table of tr_dml;
create type tr_tbl_row as object(id varchar2(4000), t_row_val tt_dml);
create type tt_tbl_row as table of tr_tbl_row;

Пример данных
SELECT *
FROM TABLE (tt_tbl_row(
tr_tbl_row(
1,
tt_dml(
tr_dml('NAME', 'Иван'),
tr_dml('SURNAME', 'Иванов'),
tr_dml('MIDDLE_NAME', 'Иванович'),
tr_dml('AGE', '45'),
tr_dml('GENDER', 'M')
)
),
tr_tbl_row(
2,
tt_dml(
tr_dml('NAME', 'Петр'),
tr_dml('SURNAME', 'Петров'),
tr_dml('MIDDLE_NAME', 'Петрович'),
tr_dml('AGE', '35'),
tr_dml('GENDER', 'M')
)
),
tr_tbl_row(
3,
tt_dml(
tr_dml('NAME', 'Михаил'),
tr_dml('SURNAME', 'Иванов'),
tr_dml('MIDDLE_NAME', 'Михайлович'),
tr_dml('AGE', '25'),
tr_dml('GENDER', 'M')
)
)
));

Названия полей заранее известны ('NAME', 'SURNAME', 'MIDDLE_NAME', 'AGE', 'GENDER') и данные валидные.

Необходимо вывести в sql запросе все объекты и их данные, у которых поле SURNAME = ИВАНОВ

Пример ответа
1,Иван,Иванов,Иванович,45,M
3,Михаил,Иванов,Михайлович,25,M

Разбор задачки в четверг 🎓

Обсудить в чатике 💬

Автор: Константин Андронов
#задача
Oracle Developer
Решение задачи. Транспонирование данных

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

Итоговый запрос
with exmpl as
(select *
from table(tt_tbl_row(tr_tbl_row(1,
tt_dml(tr_dml('NAME', 'Иван'),
tr_dml('SURNAME', 'Иванов'),
tr_dml('MIDDLE_NAME', 'Иванович'),
tr_dml('AGE', '45'),
tr_dml('GENDER', 'M'))),
tr_tbl_row(2,
tt_dml(tr_dml('NAME', 'Петр'),
tr_dml('SURNAME', 'Петров'),
tr_dml('MIDDLE_NAME', 'Петрович'),
tr_dml('AGE', '35'),
tr_dml('GENDER', 'M'))),
tr_tbl_row(3,
tt_dml(tr_dml('NAME', 'Михаил'),
tr_dml('SURNAME', 'Иванов'),
tr_dml('MIDDLE_NAME', 'Михайлович'),
tr_dml('AGE', '25'),
tr_dml('GENDER', 'M'))))))
select *
from (select e.id
,v.name
,v.value
from exmpl e
cross join table(e.t_row_val) v)
pivot (max(value) for name in('NAME' as name,
'SURNAME' as surname,
'MIDDLE_NAME' as middle_name,
'AGE' as age,
'GENDER' as gender))
where upper(surname) like 'ИВАНОВ';

Объяснение

Имеем коллекцию, состоящую из id и вложенной таблицы key - value

Первым шагом необходимо плоско развернуть вложенную таблицу, чтобы получить данные вида

|id | name |value |
|—-|—————|————|
|1 |NAME | Иван |
|1 |SURNAME |Иванов |

Для этого используем CROSS JOIN (так как надо соединить все строки вложенной таблицы с ее id) и функцию table(), позволяющую работать с вложенной таблицей так, как будто это обычная таблица

В полученном результате названия полей - значения в колонке name, что не позволяет фильтровать по ним данные.

Нам заранее известны названия полей, что позволяет транспонировать матрицу результатов предыдущего шага при помощи оператора PIVOT. По условию задачи данные валидны, поэтому можем использовать агрегатную функцию MAX (или любую другую, которая выведет нам значения из колонки value) внутри оператора PIVOT.

Транспонировав результат, остается только отфильтровать данные (с учетом регистра строки в поле SURNAME)

Обсудить в чатике 💬

Коллеги, накидали вариантов в чате, тоже полезно заценить решения 😉

👍, если понравилась задачка.

Автор: Константин Андронов
#решениезадачи #pivot #транспонирование
Oracle Developer
Восстанавливаем текст запроса

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

Судя по отклику, задание по восстановлению текста из плана запроса всем зашло. Давайте повторим 😉

Я привел сразу с вариантами ответов - должно быть очень просто для тех кто знает.

Анализ, как всегда, в четверг 🎓
Обсудить в нашем ламповом чатике.

#задача
Oracle Developer
Восстанавливаем текст запроса. Анализ

Давайте проведем анализ приведенного плана:
🔹select statement - значит выполняется select;
🔹nested loops - операция соединения множеств, значит, как минимум, есть join;
🔹порядок выполнения операций: 3-4-2-5-1-0;
🔹возле шагов с id =3 и 4 стоят звездочки, это отсылка к блоку "Predicate Information";
🔹на 3м шаге табличка departments фильтруется по полю manager_id с предикатом = :v с алиасом "t";
🔹на 4м шаге используется диапазонное сканирование индекса (range scan) с доступом по предикату соединения department_id с алиасом "e".

Уже только по "Predicate information" можно сделать вывод, что правильный вариант №2.

В этом плане мне нравится маленькая изюминка - наличие второго nested loops, т.е. второго соединения множеств.

Откуда он берется?
С 11й версии Oracle добавил оптимизацию получения данных.

В первом nested loops отбираются все необходимые строки для employees по индексу EMP_DEPARTMENT_IX, а уже затем результат соединения (2й шаг) соединяется с таблицей employees (5й и 1й шаги). Достаются необходимые колонки из employees для материализации результата. Наглядней было бы с дополнительным блоком "Column Projection".

Таким образом, в первом соединении не вытаскиваются лишние данные из employees (а вдруг они вообще не понадобятся, если не подойдут по предикатам соединения).

Задание направлено на понимание планов запросов, когда какие операции используются и т.п. Этакий reverse engineering.
Тут "изи" вариант - с вариантами выбора.

В моем курсе по оптимизации, мы разбираем подобные задачи для усвоения материала и натаскивания на собеседования
Первый поток уже во всю идет, окончание в декабре 🎓

Понравилась задачка? Ставь 👍
Обсудить в чатике 💬

#оптимизация #решениезадачи
Oracle Developer
Друзья, всем привет!
Давненько не было постов. Слишком много перемен, было некогда 🤦🏻‍♂️

Итак, давно обещанный #конкурс задачек по Oracle PL/SQL 🔥
Всего в конкурсе участвует 6 задач.

Как будет проходить
1️⃣ На этой неделе (вторник, среда, четверг) опубликую задачи (по две каждый день).

2️⃣ Можете сразу предлагать варианты решения в чатике, обсуждать задачки, возможные решения.

3️⃣ На следующей недели опубликую - решения авторов (понедельник, вторник, среда).

4️⃣ Создам голосование на лучшую задачку. Первые три места призовые.

5️⃣ Подведем итог 31 декабря и переведу денежные призы ТОП-3 авторам 🎄
1 место - 5К, 2 место - 3К, 3 место - 2К.
Рублей, конечно же, кому нужна загнивающая валюта, типа $ 😂

Приз для аудитории
Автор ответа (не важно на какую задачу), набравший максимальное количество реакций в чатике, будет так же одарен.
Коллеги, не скупимся на реакции к ответам в чате 😉

Конкурс проводит впервые - посмотрим, как пойдет. Идеи по проведению конкурса так же приветствуются 💡

—-
Тем временем, продолжается набор на курсы:
🔸Основы Oracle PL/SQL - осталось 5 мест.
🔸Основы оптимизации Oracle SQL - мест нет.
🔸Секционирование в Oracle - осталось 1 место.
За подробностями в личку.

Oracle Developer
#конкурс