Друзья, всем привет!
Рад сообщить, о наборе на шестой поток курса “Основы Oracle PL/SQL”.
Он будет полезен: QA-инженерам, разработчикам (разного уровня), аналитикам.
Цель курса:
1️⃣ Научить вас читать чужой и писать свой PL/SQL-код, достаточный для современной разработки и закрытия рабочих задач.
2️⃣ Систематизировать знания.
🔹22 видео с теорией;
🔹24 практики = единый проект;
🔹13 онлайн встреч в Zoom с разбором вопросов;
🔹закрытая тг-группа;
🔹старт - 15 января 2024, 3 месяца.
Практика построена таким образом, чтобы вы с нуля, шаг за шагом, создали API на PL/SQL для прототипа платежной системы. Начав с анонимных блоков вы закончите своим мини-фреймворком для Unit-тестирования и использованием utPL/SQL. Пример.
Подробности и программа - здесь. Отзывы - здесь.
Для тех кто заинтересован, но пока не уверен, я создал промо-группу курса, в которой буду размещать подробности, отрывки с занятий, отвечать на вопросы и даже встретимся онлайн. Залетайте!
Осталось 5️⃣ мест!
Бронируй сейчас.
Oracle Developer
Задача 6. Сбор мусора Михалычем. Решение
📝 Постановка
🧑🏻💻 Автор
✅ Решение автора
Примерный алгоритм:
1) Сортируем пакеты по убыванию мест в них и таким образом проставляем номер каждому пакету.
2) Для каждого пакета генерим строки с номерами мест для бутылок, которые в него могут влезть.
3) Сопоставляем место в пакете номеру бутылки.
4) Для каждого пакета агрегируем все бутылки, которые смогли сопоставить на шаге (3).
with
-- пакеты
p as (
select 3 as cnt from dual
union all
select 2 as cnt from dual
union all
select 5 as cnt from dual
union all
select 2 as cnt from dual
union all
select 1 as cnt from dual
),
-- бутылки
b as (
select level as num
from dual
connect by level <= 11
)
-- пакеты с поместившимися бутылками
select 'Вместимость '||c2.pack_cnt as pack,
listagg(c2.bottle_num,', ') within group (order by c2.bottle_num) as bottles
from (
-- бутылки на местах в пакетах
select c1.*,
-- сопоставляем место в пакете номеру бутылки по порядку
(select bb.bottle_num
from (select row_number() over (order by b.num) as bottle_num from b) bb
where bb.bottle_num = c1.pack_place) bottle_num
from (
-- места в пакетах
select p.pack_num,
p.pack_cnt,
row_number() over (order by p.pack_num,d.n) as pack_place
from (select row_number() over (order by p.cnt desc) as pack_num, p.cnt as pack_cnt from p) p,
(select level as n from dual connect by level <= (select max(p.cnt) from p)) d
where d.n <= p.pack_cnt
order by p.pack_num,d.n
)c1
)c2
group by c2.pack_num,c2.pack_cnt
order by c2.pack_num;
Задача 4. Ускорение выполнение запроса. Решение
📝 Постановка
🧑🏻💻 Автор
✅ Решение автора
Для таблицы
1️⃣ HWM - если в таблице мало строк, а HWM высокий, необходимо сбросить HWM.
2️⃣ Проверить наличие policy и оптимизировать их, если проблема в них.
3️⃣ Проверить наличие блокировок и оптимизировать их, если необходимо.
4️⃣ Разбить таблицу на несколько более мелких, чтобы уменьшить время выполнения запросов.
5️⃣ Оптимизировать структуру таблицы, чтобы уменьшить размер записей и ускорить операции чтения и записи.
Для вьюхи
1️⃣ Проверить правильность связанных таблиц и переписать запрос, если необходимо.
2️⃣ Использовать хинты для оптимизации запроса.
3️⃣ Проверить наличие индексов и оптимизировать их, если необходимо.
4️⃣ Проверить статистику и обновить ее, если необходимо.
5️⃣ Проверить наличие блокировок и оптимизировать их, если необходимо.
6️⃣ Использовать материализованные вьюхи для ускорения выполнения запроса.
7️⃣ Разбить сложную вьюху на несколько более простых, чтобы уменьшить время выполнения.
8️⃣ Использовать партиционирование таблицы для улучшения производительности запросов.
9️⃣ Использовать кэширование результатов выполнения запросов на вьюху, чтобы уменьшить время выполнения.
Обсудить в чатике 💬
—
⚠️ Напомню, что осталось:Основы оптимизации Oracle SQL. Старт: 15.01
1 место Секционирование в Oracle. Старт: 04.02
Хочешь бустануть свои знания? 🚀 Пиши в личку пока не стало поздно.
Oracle Developer
#конкурс #решениезадачи
Задача 2. Создание deadlock. Решение
📝 Постановка
🧑🏻💻 Автор
✅ Решение автора
Запускаем запрос, ждем окончания выполнения. Дальше запускаем этот запрос еще в двух сессиях. После этого откатываем транзакцию в первой и остальные начинают блокировать блоки с разными строками в произвольном порядке, натыкаясь на дедлок.
select some_field
from some_table
order by dbms_random.random() for update;
Друзья, всем привет!
На этой недели было опубликовано 6 конкурсных задачек.
На следующей - решения авторов и голосование. Итоги подведем 31го декабря ⛄️
Если вы были заняты на этой недели, вы можете уделить им время на выходных. Закидывайте решения в чатик 💬
Кто знает, вдруг именно ваш ответ наберет большинство реакций и вы получите 🎁
Всем хороших выходных! 👍🏻
—-
Тем временем, продолжается набор на курсы:
🔸Основы Oracle PL/SQL - 5 мест. Старт: 15.01🔸Основы оптимизации Oracle SQL - мест нет. Старт: 15.01🔸Секционирование в Oracle - 1 место. Старт: 04.02
За подробностями в личку.
Oracle Developer
#конкурс
Задача 5. Поиск недостающих кодов
Имеется таблица mytbl
. В ней есть столбец code
, который содержит заглавные буквы и цифры длиной 3.
Между минимальным и максимальным значениями этого столбца необходимо найти недостающие коды.
Для примера, столбец может содержать такие значения как '8TS' или 'A56'. Но не содержит значения типа 'A_4', '7F' или '2 C'.
Тестовые данные:
create table mytbl(code varchar2(3));Обсудить в чатике 💬
insert into mytbl values('8TS');
insert into mytbl values('A56');
insert into mytbl values('912');
insert into mytbl values('BZ0');
Задача 3. Вывод календаря
Вывести средствами SQL календарь на текущий месяц "как в винде".
Например на сентябрь 2023 надо вывестиПН ВТ СР ЧТ ПТ СБ ВС
28 29 30 31 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 1
Обсудить в чатике 💬
Oracle Developer
#конкурс
Задача 1. Вычисление факториала
Чистым SQL вычислить факториал числа.
Обсудить в чатике 💬
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
Решение задачи. Транспонирование данных
Данная задача - пример работы с универсальной коллекцией данных, имеющих произвольный набор полей (но одинаковых в рамках одного источника данных).
Итоговый запрос
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 'ИВАНОВ';
Итоги собеседования в Леруа Мерлен
Оба собеседования прошел успешно.
🔸Корпоративная культура в Леруа Мерлен:
В Леруа очень ценят людей, можно назвать это даже фанатизмом. Мне после российского ритейла было очень непривычно.
Лучше всего корпоративная культура отражена в диалоге, который у меня произошел с одним из моих коллег.
Вкратце, была обнаружена ошибка в отчете об остатках(диалог проходил в личном чате):
Я: "Косяк в стоках у тебя. Мы продаем в день ~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
Техническое собеседование в Леруа Мерлен. Ответы
Список вопросов: см. в посте вторника.
Ответы:
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
Собеседование в Леруа Мерлен
Друзья, всем привет!
Пока нахожусь в процессе написания поста по секции 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
Внимание всем постам. Вакансии в QIWI.
Команда банковских технологий QIWI расширяет штат.
Ищем коллег в сопровождение и в разработку АБС ЦФТ Банк.
⚡️Крайне важен опыт работы с модулем «Кредиты». Если кроме «Кредитов» вы работали с модулями «Гарантии» и «РКО», признаем вас уникальным специалистом!
Описание вакансий
1️⃣ Вакансия в команде сопровождения (кредиты)
2️⃣ Вакансия в команде сопровождения (БКИ)
3️⃣ Вакансия в команде разработки
🏖Работать можно в Москве и не только).
💰По з/п мы обычно договариваемся. Платим в рублях.
🧑🏻🏫Собеседование в 1 этап в Zoom.
Задавайте любые вопросы про деньги, условия и команду в телеграм рекрутеру @give_me_your_cv – Маша
3️⃣ Задача на SQL:
Необходимо перестроить справочник ресторанов, убрав столбец director. История должна быть перестроена.
Основная цель задания - написать sql запрос, который пересоберет историю изменений в формате SCD2, исключая столбец director.
При решении этой задачи в голове сразу всплывает мысль воспользоваться оконными функциями для объединения/схлопывания интервалов по строкам, в которых изменения происходили только по полю director.
Важно учесть периоды, в которых происходили изменения только в поле seat_cnt: 300, 500, 300 при прочих равных условиях, т.е. временные изменения кол-ва мест в ресторанах.
В противном случае получим пересечение соседних интервалов в рамках одного ресторана.
Можно также решить через конструкцию model в oracle.
Обсудить в чатике 💬
Автор: Ruslan
#вкусноиточка #собеседование
Oracle Developer
Коллеги, всем привет!
На этой и на прошлой недели было опубликовано 6 задачек.
Все они были разные. Какие-то было совершенно практические, какие-то на поболтать, сложные, легкие - на любой вкус и опыт.
Я запущу процесс голосования.
Итоги подведем 3️⃣1️⃣ декабря🎄
Победители получат денежные призы:
🔸Авторам задач: 1 место - 5К, 2 место - 3К, 3 место - 2К.
🔸Автору ответа в чатике (не важно на какую задачу), набравшему максимальное количество реакций.
Коллеги, не скупимся на реакции к ответам в чате 😉
Если #конкурс понравился ставьте 🔥, будем проводить периодически.
Обсудить в чатике 💬
—-
Тем временем, продолжается набор на курсы:
🔸Основы Oracle PL/SQL - осталось 4 места.🔸Основы оптимизации Oracle SQL - мест нет.
🔸Секционирование в Oracle - осталось 1 место.
За подробностями в личку.
Oracle Developer
#конкурс
Задача 5. Поиск недостающих кодов. Решение
📝 Постановка
🧑🏻💻 Автор
✅ Решение автора
with chars as
(select case
when level > 10 then
chr(54 + level)
else
to_char(level - 1)
end as letter
from dual
connect by level <= 36),
codes as
(select c2.letter c1.letter c0.letter as code
from chars c0, chars c1, chars c2)
select *
from codes t
where not exists (select 1 from mytbl f where t.code = f.code)
and t.code between (select min(code) from mytbl) and (select max(code) from mytbl);
Задача 3. Вывод календаря. Решение
📝 Постановка
🧑🏻💻 Автор
✅ Решение автора
🗯 "Запрос написан немного в лоб. Может быть коллеги предложат что-то более симпатичное"
WITH par_date AS
(SELECT to_date('26.09.2023', 'dd.mm.yyyy') AS par_date FROM dual),
t AS
(SELECT (pd.par_date - 40 + LEVEL) AS d FROM par_date pd CONNECT BY LEVEL <= 80),
tt AS
(SELECT t.d
,to_char(d, 'DY', 'NLS_DATE_LANGUAGE=AMERICAN') AS dd
,to_char(d, 'IW') AS w
,to_char(d, 'MM') AS m
FROM t
,par_date pd),
ttt AS
(SELECT *
FROM tt
pivot(MAX(tt.d), MAX(tt.m) AS m
FOR dd IN('MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'))
ORDER BY 2)
SELECT ttt.w AS "НЕД"
,EXTRACT(DAY FROM ttt."'MON'") AS "ПН"
,EXTRACT(DAY FROM ttt."'TUE'") AS "ВТ"
,EXTRACT(DAY FROM ttt."'WED'") AS "СР"
,EXTRACT(DAY FROM ttt."'THU'") AS "ЧТ"
,EXTRACT(DAY FROM ttt."'FRI'") AS "ПТ"
,EXTRACT(DAY FROM ttt."'SAT'") AS "СБ"
,EXTRACT(DAY FROM ttt."'SUN'") AS "ВС"
FROM ttt
,par_date pd
WHERE ttt."'MON'_M" = to_char(pd.par_date, 'MM')
OR ttt."'TUE'_M" = to_char(pd.par_date, 'MM')
OR ttt."'WED'_M" = to_char(pd.par_date, 'MM')
OR ttt."'THU'_M" = to_char(pd.par_date, 'MM')
OR ttt."'FRI'_M" = to_char(pd.par_date, 'MM')
OR ttt."'SAT'_M" = to_char(pd.par_date, 'MM')
OR ttt."'SUN'_M" = to_char(pd.par_date, 'MM');
Задача 1. Вычисление факториала. Решение
📝 Постановка
🧑🏻💻 Автор
✅ Решение автора
with
step1(num) as
(select 3 /*стартовое число*/
from dual),
step2(x,y) as
(select 1, 1
from dual
union all
select x + 1, y * (x + 1)
from step2, step1
where x < step1.num)
select y as factorial
from step2, step1
where x = num;
Задача 6. Сбор мусора Михалычем
Бомж-аутист Михалыч каждое утро обходит район и собирает в свои пакеты выброшенные пустые бутылки.
У Михалыча в силу обстоятельств каждое утро может быть разное количество пакетов разной вместимости (какой-то пакет вмещает 5 бутылок, какой-то - только 3 и т.д.). Количество найденных пустых бутылок каждое утро тоже может быть разным.
Михалыч очень любит порядок, при каждом обходе он чертит и заполняет в найденной, когда-то тетрадке новую таблицу с указанием всех пакетов и списка бутылок, которые он в каждый из них положил. Если какой-то пакет остался пустым, то он все равно указывается в таблице. При этом Михалыч любит сперва заполнять самые вместительные пакеты, затем менее вместительные и т.д.
Напишите запрос, который для набора пакетов и количества бутылок нарисует таблицу Михалыча.
Например для исходных данных:
Пакеты:Результат запроса должен быть таким:
Вместимость 3
Вместимость 2
Вместимость 5
Вместимость 2
Вместимость 1
Бутылки: 11
------------------------------|
Пакет | Бутылки |
------------------------------|
Вместимость 5 | 1, 2, 3, 4, 5 |
------------------------------|
Вместимость 3 | 6, 7, 8 |
------------------------------|
Вместимость 2 | 9, 10 |
------------------------------|
Вместимость 2 | 11 |
------------------------------|
Вместимость 1 | |
------------------------------|
Задача 4. Ускорение выполнение запроса
Ускорить выполнение запроса "select * from asd", где "asd" может быть, как таблицей, так и вьюхой.
Этот вопрос не имеет конкретного ответа, количество верных вариантов не ограничено.
Обсудить в чатике 💬
Oracle Developer
#конкурс
Задача 2. Создание deadlock
Имеем таблицу в 10к строк (содержимое не имеет значения). Надо написать такой селект, который при одновременном запуске в разных сессиях приведет к дедлоку с максимальной вероятностью. Отдельно надо указать как эти разные сессии запустить одновременно.
Обсудить в чатике 💬
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 - осталось 1 место.
🔸Секционирование в Oracle - осталось 4 места.
За подробностями в личку.
Oracle Developer
#конкурс
Восстанавливаем текст запроса
Друзья всем привет!
Судя по отклику, задание по восстановлению текста из плана запроса всем зашло. Давайте повторим 😉
Я привел сразу с вариантами ответов - должно быть очень просто для тех кто знает.
Анализ, как всегда, в четверг 🎓
Обсудить в нашем ламповом чатике.
#задача
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 *Названия полей заранее известны ('NAME', 'SURNAME', 'MIDDLE_NAME', 'AGE', 'GENDER') и данные валидные.
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')
)
)
));
1,Иван,Иванов,Иванович,45,MРазбор задачки в четверг 🎓
3,Михаил,Иванов,Михайлович,25,M
Техническое собеседование в Леруа Мерлен
Формат общения - онлайн, звонок по 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
Всем привет!
Конкурс пока откладываем, сейчас нет времени им заниматься, но он обязательно состоится.
А пока наслаждайтесь, собеседованием в "Леруа Мерлен" от Руслана.
Итоги собеседования во "Вкусно и Точка"
Так и не сумели договориться по деньгам 😊
HR 💬 "Вы произвели хорошее впечатление, но, к сожалению, у нас есть ограничения по ФОТ. Максимально возможный оклад , который мы можем предложить вам, 350k gross."
Договорились на том, что если появятся вакансии поинтереснее, то продолжим диалог.
Дам оценку со своей стороны:
Начало интервью стартовало грустно. Немного смутила не бодрая подача описания задач и самой вакансии со стороны собеседующих. Но где-то в середине нашли общую волну и продолжили в позитивном ключе.
По итогу интервью у меня остались приятные впечатления и могу сказать, что в самом конце появилась профессиональная симпатия к собеседующим.
Выводы:
Для себя я понял, что на собеседовании очень важно говорить уверенно и с легкой наглостью.
⚠️Важно не перегибать и вовремя понять, что вы, возможно, не целиком видите картину.
Обсудить в чатике 🫂
Палец вверх, если зашло 👍
Ставь 🔥, если хочешь узнать, что спрашивали на интервью по секции System Design в компанию, занимающуюся разработкой продуктов интегрированного планирования и управления цепями поставок.
Обсудить в чатике 💬
Автор: 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