Задача. Удаление ненужных договоров
Вернемся к нашей задаче с договорами.
Бизнес решил, что закрытые договора, старше 5 лет (от даты закрытия), можно удалять из системы.
Данные эти не нужны.
Таблица, которую мы создали:
Уточнения:
🔸 практически все запросы в системе происходят к активным договорам;
🔸 в месяц заключается - 1M договоров, закрывается - 300K.
Какие есть варианты реализации бизнес требований?
Разбор задачи в четверг 🎓
Обсудить в чатике 💬
#задача
Oracle Developer
Вернемся к нашей задаче с договорами.
Бизнес решил, что закрытые договора, старше 5 лет (от даты закрытия), можно удалять из системы.
Данные эти не нужны.
Таблица, которую мы создали:
create table contract(
contract_id number(38) not null, --PK
phone number(12) not null,
date_from date not null,
date_to date not null
);
Уточнения:
🔸 практически все запросы в системе происходят к активным договорам;
🔸 в месяц заключается - 1M договоров, закрывается - 300K.
Какие есть варианты реализации бизнес требований?
Разбор задачи в четверг 🎓
Обсудить в чатике 💬
#задача
Oracle Developer
Решение задачи. Удаление не нужных договоров
При деактивации договора, в поле date_to проставляется текущая дата. Таких договоров, в месяц может быть - 300К.
Эту задачу можно решить, как минимум, двумя способами.
1️⃣ Применить Range-секционирование к таблице по дате закрытия договора - date_to.
Алгоритм: достаточно определить секцию для удаления, выполнить DDL-команду и всё.
➕
▫️ DDL команда на удаление выполнится моментально, практически не создав UNDO\REDO информации и нагрузки на БД.
▫️Активные договора всегда будут находится в самой последней секции с date_to = 01.01.4000. Можем попутно получить плюсы от секционирования, связанные с ускорением выполнения запросов.
▫️Не важно сколько данных удаляется 300К или 300М - всегда будет предсказуемое время работы.
➖
▫️Таблицу необходимо переделать в секционированную, если она уже существует - это может быть проблемой (dbms_redifinition).
▫️Если обращение идет не по глобальному индексу (PK), то во всех запросах необходимо использовать ключ секционирования по date_to, иначе будут перебираться все секции. Запросы придется писать внимательно.
▫️DBA скептически относятся к выполнению DDL-команд на таблицах с глобальными индексами, даже с опцией update global indexes. Могут не пропустить такое решение.
2️⃣ Удалять данные пачками обычным DML
➕
▫️Не надо менять структуру таблицы;
▫️Достаточно простая реализация удаления пачками по N-строк ниже определенной даты.
➖
▫️Создается дополнительная нагрузка на СУБД - генерация UNDO\REDO.
▫️При увеличении удаляемых данных выполнение начнет проседать, необходимо будет увеличивать частоту удалений и размер пачек. В итоге можно воткнуться в потолок, при котором придется переходить на секционирование.
———
И в первом и во втором случаях, функционал заворачивается в процедурку, которая вызывается из JOBа.
С 1м вариантом JOB запускается раз в сутки\несколько раз в месяц, со 2м вариантом чаще, например, раз в 1 час - удаляем мелкими пачками, чтобы распределить нагрузку в течение дня или удаляем всё ночью.
Кстати, можно создать комбинацию из 1го и 2го вариантов 😉
Палец вверх, если понравилось 👍
Обсудить в чатике плюсы и минусы решений 💬
Плаваете в секционировании? Велком в личку, есть что предложить 🎓
#архитектура #решениезадачи #секционирование
Канал Oracle Developer | Чатик 💬
При деактивации договора, в поле date_to проставляется текущая дата. Таких договоров, в месяц может быть - 300К.
Эту задачу можно решить, как минимум, двумя способами.
1️⃣ Применить Range-секционирование к таблице по дате закрытия договора - date_to.
Алгоритм: достаточно определить секцию для удаления, выполнить DDL-команду и всё.
alter table contract drop partition part_name update global indexes;
➕
▫️ DDL команда на удаление выполнится моментально, практически не создав UNDO\REDO информации и нагрузки на БД.
▫️Активные договора всегда будут находится в самой последней секции с date_to = 01.01.4000. Можем попутно получить плюсы от секционирования, связанные с ускорением выполнения запросов.
▫️Не важно сколько данных удаляется 300К или 300М - всегда будет предсказуемое время работы.
➖
▫️Таблицу необходимо переделать в секционированную, если она уже существует - это может быть проблемой (dbms_redifinition).
▫️Если обращение идет не по глобальному индексу (PK), то во всех запросах необходимо использовать ключ секционирования по date_to, иначе будут перебираться все секции. Запросы придется писать внимательно.
▫️DBA скептически относятся к выполнению DDL-команд на таблицах с глобальными индексами, даже с опцией update global indexes. Могут не пропустить такое решение.
2️⃣ Удалять данные пачками обычным DML
delete from contract where date_to < :delete_date and rownum < N;
➕
▫️Не надо менять структуру таблицы;
▫️Достаточно простая реализация удаления пачками по N-строк ниже определенной даты.
➖
▫️Создается дополнительная нагрузка на СУБД - генерация UNDO\REDO.
▫️При увеличении удаляемых данных выполнение начнет проседать, необходимо будет увеличивать частоту удалений и размер пачек. В итоге можно воткнуться в потолок, при котором придется переходить на секционирование.
———
И в первом и во втором случаях, функционал заворачивается в процедурку, которая вызывается из JOBа.
С 1м вариантом JOB запускается раз в сутки\несколько раз в месяц, со 2м вариантом чаще, например, раз в 1 час - удаляем мелкими пачками, чтобы распределить нагрузку в течение дня или удаляем всё ночью.
Кстати, можно создать комбинацию из 1го и 2го вариантов 😉
Палец вверх, если понравилось 👍
Обсудить в чатике плюсы и минусы решений 💬
Плаваете в секционировании? Велком в личку, есть что предложить 🎓
#архитектура #решениезадачи #секционирование
Канал Oracle Developer | Чатик 💬
Друзья, всем привет! 👋
В этот понедельник закончился уже второй поток курса "Oracle оптимизация SQL. Основы" 🎉
Ребята на протяжении 3.5 месяцев изучали тайны оптимизации СУБД, систематизировали знания, избавляясь от сумбура в голове, практиковались и решали проблемы.
Для меня самое главное, когда в обратной связи в ходе и по завершению курса ребята говорят 💬
🔸"Мне это уже пригодилось на работе"
🔸"У нас был тормозной запрос, а я взял и пофиксил его"
🔸"Вчера ко мне прибежали с проблемой, и буквально за час мы все решили" и т.д.
Прямо музыка для моих ушей. 🎶
Видео-отзывы коллег первого и второго потоков 🎥
Сегодня, чуть позже, анонсирую набор на третий поток.
Всего - 10 мест. 3 уже забронировано. Кто успел того и тапки. Пишите в личку.
#оптимизация #курс
Канал Oracle Developer | Чатик 💬
В этот понедельник закончился уже второй поток курса "Oracle оптимизация SQL. Основы" 🎉
Ребята на протяжении 3.5 месяцев изучали тайны оптимизации СУБД, систематизировали знания, избавляясь от сумбура в голове, практиковались и решали проблемы.
Для меня самое главное, когда в обратной связи в ходе и по завершению курса ребята говорят 💬
🔸"Мне это уже пригодилось на работе"
🔸"У нас был тормозной запрос, а я взял и пофиксил его"
🔸"Вчера ко мне прибежали с проблемой, и буквально за час мы все решили" и т.д.
Прямо музыка для моих ушей. 🎶
Видео-отзывы коллег первого и второго потоков 🎥
Сегодня, чуть позже, анонсирую набор на третий поток.
Всего - 10 мест. 3 уже забронировано. Кто успел того и тапки. Пишите в личку.
#оптимизация #курс
Канал Oracle Developer | Чатик 💬
🚀 Курс "Оптимизация Oracle SQL.Основы" - это отличная возможность освоить искусство оптимизации SQL запросов по уникальной программе "с нуля до уверенного специалиста, который может решать 80-90% типовых проблем".
Старт: 20е мая, окончание 29е августа.
Цели
🔺научиться находить и решать проблемы в PROD среде;
🔺научиться писать сразу оптимальные запросы;
🔺успешно проходить блок по оптимизации на собеседованиях;
🔺систематизировать знания.
Кратко
🔸теория по понедельникам, практика по четвергам, встречи в Zoom;
🔸11 домашних заданий + 7 тестов + курсовая работа;
🔸содержание курса структурировано таким образом, чтобы знания можно было применять уже после первой лекции.
🔸6 блоков с фокусом на решении реальных проблем:
1️⃣ Выявление проблемных запросов.
2️⃣ Чтение и понимание планов запросов.
3️⃣ Анализ планов запросов.
4️⃣ Решение проблем.
5️⃣ Внесение изменений.
(планы, хинты, awr,ash, v$active_session_history, статистика, трассировка, tkprof, nested loops, hash join, index, full table scan и многое многое другое).
Стоимость: 79K рублей или 42 тысячи рублей в рассрочку на 2 месяца (оплата любым способом из любой страны с чеком, крипта).
Сначала бронируйте участие. Оплата ближе к запуску.
Осталось мест: не осталось. Следующая возможность попасть на курс - сентябрь. Бронируйте заранее.
Минимальные требования: знаете SQL, имели опыт работы с PL/SQL, имеете представление о СУБД Oracle. Отлично, если сталкиваетесь с задачами по оптимизации и не можете их решить. Высокая мотивация дойти до конца. QA, аналитик, разработчик.
Отзывы
Видео-отзывы ребят первого и второго потоков. Скрины отзывов в посте выше. Если у вас есть сомнения, посмотрите.
Реальная жизнь
А теперь представьте себе такую ситуацию ✨
К вам прибегают пользователи/аналитики/начальник и кричат "все пропало! все тормозит! нужно срочно решать проблему, PROD стоит!" 😱
Еще 5 минут назад вы предвкушали спокойный день, попивая халявный кофе на кофепоинте, весело общаясь с коллегой. А теперь нужно срочно куда-то бежать, что-то делать, решать проблему, которой "лучше бы не было". Вы просто обычный специалист, который ищет медленные запросы "через дебаг кода". Что делать будете? 😁
Можно еще усложнить, добавив в эту ситуацию то, что сломалась не ваша ламповая базенка в вашей же организации, до которой дотянуться легко и просто, а где-то на площадке заказчика, в банке😳
Прошел холодок по спине? Руки вспотели? Как дебажить будете? Полетите с Новосибирска в Москву (доступов то нет)? 😁
Ответы на курсе.Бронируйте пока еще есть 1 место Мест нет 🤷🏻♂️
Следующая возможность попасть на курс - сентябрь. Бронируйте заранее.
#оптимизация #курс
Канал Oracle Developer | Чатик 💬
Старт: 20е мая, окончание 29е августа.
Цели
🔺научиться находить и решать проблемы в PROD среде;
🔺научиться писать сразу оптимальные запросы;
🔺успешно проходить блок по оптимизации на собеседованиях;
🔺систематизировать знания.
Кратко
🔸теория по понедельникам, практика по четвергам, встречи в Zoom;
🔸11 домашних заданий + 7 тестов + курсовая работа;
🔸содержание курса структурировано таким образом, чтобы знания можно было применять уже после первой лекции.
🔸6 блоков с фокусом на решении реальных проблем:
1️⃣ Выявление проблемных запросов.
2️⃣ Чтение и понимание планов запросов.
3️⃣ Анализ планов запросов.
4️⃣ Решение проблем.
5️⃣ Внесение изменений.
(планы, хинты, awr,ash, v$active_session_history, статистика, трассировка, tkprof, nested loops, hash join, index, full table scan и многое многое другое).
Стоимость: 79K рублей или 42 тысячи рублей в рассрочку на 2 месяца (оплата любым способом из любой страны с чеком, крипта).
Сначала бронируйте участие. Оплата ближе к запуску.
Осталось мест: не осталось. Следующая возможность попасть на курс - сентябрь. Бронируйте заранее.
Минимальные требования: знаете SQL, имели опыт работы с PL/SQL, имеете представление о СУБД Oracle. Отлично, если сталкиваетесь с задачами по оптимизации и не можете их решить. Высокая мотивация дойти до конца. QA, аналитик, разработчик.
Отзывы
Видео-отзывы ребят первого и второго потоков. Скрины отзывов в посте выше. Если у вас есть сомнения, посмотрите.
Реальная жизнь
А теперь представьте себе такую ситуацию ✨
К вам прибегают пользователи/аналитики/начальник и кричат "все пропало! все тормозит! нужно срочно решать проблему, PROD стоит!" 😱
Еще 5 минут назад вы предвкушали спокойный день, попивая халявный кофе на кофепоинте, весело общаясь с коллегой. А теперь нужно срочно куда-то бежать, что-то делать, решать проблему, которой "лучше бы не было". Вы просто обычный специалист, который ищет медленные запросы "через дебаг кода". Что делать будете? 😁
Можно еще усложнить, добавив в эту ситуацию то, что сломалась не ваша ламповая базенка в вашей же организации, до которой дотянуться легко и просто, а где-то на площадке заказчика, в банке😳
Прошел холодок по спине? Руки вспотели? Как дебажить будете? Полетите с Новосибирска в Москву (доступов то нет)? 😁
Ответы на курсе.
Следующая возможность попасть на курс - сентябрь. Бронируйте заранее.
#оптимизация #курс
Канал Oracle Developer | Чатик 💬
SQL марафон из 5 задач с призом 🏆
Друзья, всем привет!
Решил попробовать новый формат. Это будут задачи для начинающих. Однако, мидлам и сеньерам тоже будет полезно размять мозг 🧠
Примерно такого уровня вопросы, мне попадались на собеседованиях на Java-разработчика.
Особенность - ответы будут сразу публиковаться с задачкой, но в скрытом режиме. Всего будет 5 постов-задач, с интервалом в 1.5 часа.
🔹Рекомендую, перед открытием спойлера, посидеть и подумать 😉
🔹Синтаксис, естественно, для Oracle.
🔹Я привожу не все возможные решения 👌
🔹Оставляем "за бортом" вопросы оптимизации.
🔹Определения для таблиц можно взять с репозитория
🔹Телега не позволяет использовать спойлер и SQL-форматирование одновременно😔
⚠️ Для интереса. Автору, опубликовавшему max количество оригинальных решений суммарно на все задачки в чатике, будет вручен денежный призмиллион - 5000 рублей или эквивалент USDT 💸💸 Добавляйте в ответ #решение_n.
Первая задача в 11:00 МСК ⏰
#задача #sql #марафон
Oracle Developer | Чат 💬
Друзья, всем привет!
Решил попробовать новый формат. Это будут задачи для начинающих. Однако, мидлам и сеньерам тоже будет полезно размять мозг 🧠
Примерно такого уровня вопросы, мне попадались на собеседованиях на Java-разработчика.
Особенность - ответы будут сразу публиковаться с задачкой, но в скрытом режиме. Всего будет 5 постов-задач, с интервалом в 1.5 часа.
🔹Рекомендую, перед открытием спойлера, посидеть и подумать 😉
🔹Синтаксис, естественно, для Oracle.
🔹Я привожу не все возможные решения 👌
🔹Оставляем "за бортом" вопросы оптимизации.
🔹Определения для таблиц можно взять с репозитория
🔹Телега не позволяет использовать спойлер и SQL-форматирование одновременно😔
⚠️ Для интереса. Автору, опубликовавшему max количество оригинальных решений суммарно на все задачки в чатике, будет вручен денежный приз
Первая задача в 11:00 МСК ⏰
#задача #sql #марафон
Oracle Developer | Чат 💬
SQL марафон. Задача 1.
Постановка
Необходимо найти вторую по величине зарплату сотрудников (salary).
Сотрудники - таблица employees.
Решения
1️⃣
select max(salary)
from employees
where salary not in (select max(salary) from employees);
2️⃣
select max(salary) as secondhighestsalary
from employees
where salary < (select max(salary) from employees);
3️⃣
select salary
from (select salary
,row_number() over(order by salary desc) as rnk
from employees)
where rnk = 2;
Опубликуйте свое решение в чатике с тегом #решение1 💬
#задача #sql #марафон
Канал Oracle Developer | Чатик 💬
Постановка
Необходимо найти вторую по величине зарплату сотрудников (salary).
Сотрудники - таблица employees.
Решения
1️⃣
from employees
where salary not in (select max(salary) from employees);
select max(salary) as secondhighestsalary
from employees
where salary < (select max(salary) from employees);
from (select salary
,row_number() over(order by salary desc) as rnk
from employees)
where rnk = 2;
Опубликуйте свое решение в чатике с тегом #решение1 💬
#задача #sql #марафон
Канал Oracle Developer | Чатик 💬
SQL марафон. Задача 2.
Постановка
Найдите максимальную зарплату для каждого департамента.
Выведете - имя департамента (department_name) и максимальную зарплату для него (salary).
Если у департамента нет сотрудников - максимальная зарплата должна быть "0".
Отсортируйте по имени департамента.
Департаменты - таблица departments.
Сотрудники - таблица employees.
Решения
1️⃣
select d.department_name
,nvl(max(salary), 0)
from departments d
left join employees e on e.department_id = d.department_id
group by department_name
order by department_name;
2️⃣
select d.department_name,
nvl((select max(salary)
from employees e
where e.department_id = d.department_id), 0) as max_salary
from departments d
order by d.department_name;
Опубликуйте свое решение в чатике с тегом #решение2 💬
#задача #sql #марафон
Канал Oracle Developer | Чатик 💬
Постановка
Найдите максимальную зарплату для каждого департамента.
Выведете - имя департамента (department_name) и максимальную зарплату для него (salary).
Если у департамента нет сотрудников - максимальная зарплата должна быть "0".
Отсортируйте по имени департамента.
Департаменты - таблица departments.
Сотрудники - таблица employees.
Решения
1️⃣
,nvl(max(salary), 0)
from departments d
left join employees e on e.department_id = d.department_id
group by department_name
order by department_name;
2️⃣
nvl((select max(salary)
from employees e
where e.department_id = d.department_id), 0) as max_salary
from departments d
order by d.department_name;
Опубликуйте свое решение в чатике с тегом #решение2 💬
#задача #sql #марафон
Канал Oracle Developer | Чатик 💬
SQL марафон. Задача 3.
Постановка
Нужно найти сотрудников, которые работают дольше всех в своей должности (job_id).
Выведите все поля из таблицы employees.
Сотрудники - таблица employees.
Решения
1️⃣
select e.*
from employees e
where hire_date =
(select min(hire_date) from employees where job_id = e.job_id);
2️⃣
select e.*
from employees e
join (select job_id
,min(hire_date) min_hire_date
from employees
group by job_id) m
on e.job_id = m.job_id
and e.hire_date = m.min_hire_date;
Опубликуйте свое решение в чатике с тегом #решение3 💬
#задача #sql #марафон
Канал Oracle Developer | Чатик 💬
Постановка
Нужно найти сотрудников, которые работают дольше всех в своей должности (job_id).
Выведите все поля из таблицы employees.
Сотрудники - таблица employees.
Решения
1️⃣
from employees e
where hire_date =
(select min(hire_date) from employees where job_id = e.job_id);
2️⃣
from employees e
join (select job_id
,min(hire_date) min_hire_date
from employees
group by job_id) m
on e.job_id = m.job_id
and e.hire_date = m.min_hire_date;
Опубликуйте свое решение в чатике с тегом #решение3 💬
#задача #sql #марафон
Канал Oracle Developer | Чатик 💬
SQL марафон. Задача 4.
Постановка
Нужно найти отделы с общей зарплатой сотрудников более 50000.
Вывести - ID отдела (department_id).
Сотрудники - таблица employees.
Решения
1️⃣
select department_id
from employees
group by department_id
having sum(salary) > 50000;
2️⃣
select d.department_id
from departments d
where (select sum(salary)
from employees e
where e.department_id = d.department_id) > 50000;
3️⃣
with dept_salaries as
(select department_id
,sum(salary) as total_salary
from employees
group by department_id)
select department_id
from dept_salaries
where total_salary > 50000;
Опубликуйте свое решение в чатике с тегом #решение4 💬
#задача #sql #марафон
Канал Oracle Developer | Чатик 💬
Постановка
Нужно найти отделы с общей зарплатой сотрудников более 50000.
Вывести - ID отдела (department_id).
Сотрудники - таблица employees.
Решения
1️⃣
from employees
group by department_id
having sum(salary) > 50000;
2️⃣
from departments d
where (select sum(salary)
from employees e
where e.department_id = d.department_id) > 50000;
3️⃣
(select department_id
,sum(salary) as total_salary
from employees
group by department_id)
select department_id
from dept_salaries
where total_salary > 50000;
Опубликуйте свое решение в чатике с тегом #решение4 💬
#задача #sql #марафон
Канал Oracle Developer | Чатик 💬
SQL марафон. Задача 5.
Постановка
Нужно найти всех сотрудников, у которых зарплата выше средней зарплаты в таблице employees.
Вывести - все столбцы из таблицы employees.
Сотрудники - таблица employees.
Решения
1️⃣
select e.*
from employees e
where e.salary > (select sum(salary) / count(*) from employees);
2️⃣
with avg_sal as
(select avg(salary) as avg_salary from employees)
select e.*
from avg_sal a
join employees e on e.salary > a.avg_salary;
Опубликуйте свое решение в чатике с тегом #решение5 💬
#задача #sql #марафон
Канал Oracle Developer | Чатик 💬
Постановка
Нужно найти всех сотрудников, у которых зарплата выше средней зарплаты в таблице employees.
Вывести - все столбцы из таблицы employees.
Сотрудники - таблица employees.
Решения
1️⃣
from employees e
where e.salary > (select sum(salary) / count(*) from employees);
2️⃣
(select avg(salary) as avg_salary from employees)
select e.*
from avg_sal a
join employees e on e.salary > a.avg_salary;
Опубликуйте свое решение в чатике с тегом #решение5 💬
#задача #sql #марафон
Канал Oracle Developer | Чатик 💬
Вот и закончился наш SQL-марафон 👯♀️
Победителя оглашу в пятницу. Так что у вас есть время догнать и перегнать 🏆
Напомню, засчитываются оригинальные решения:
🔸 не те, что скрываются под спойлером;
🔸 не те, которые опубликовали ДО вас.
Добавляйте в ответ тег #решениеN.
Приз - 5000 рублей или эквивалент в крипте (USDT) 😁
Все таки, основная цель марафона не заработать денег, а порешать задачки, которые могут встретиться на собеседованиях на Junior, Middle- позиции🎓
Если формат зайдет, будем периодически проводить такое 👍
По моим ощущениям, 5 запросиков в 1 день многовато. Что думаете?
Обсудить в чатике 💬
#марафон
Канал Oracle Developer | Чатик 💬
Победителя оглашу в пятницу. Так что у вас есть время догнать и перегнать 🏆
Напомню, засчитываются оригинальные решения:
🔸 не те, что скрываются под спойлером;
🔸 не те, которые опубликовали ДО вас.
Добавляйте в ответ тег #решениеN.
Приз - 5000 рублей или эквивалент в крипте (USDT) 😁
Все таки, основная цель марафона не заработать денег, а порешать задачки, которые могут встретиться на собеседованиях на Junior, Middle- позиции🎓
Если формат зайдет, будем периодически проводить такое 👍
По моим ощущениям, 5 запросиков в 1 день многовато. Что думаете?
Обсудить в чатике 💬
#марафон
Канал Oracle Developer | Чатик 💬
Друзья, всем привет )
Сегодня пятница, а значит пора выдать награду за участие в марафоне 🏆
Приз - 5000 рублей или эквивалент в крипте (USDT) 😁
Посидел, проанализировал решения... Есть прям очень оригинальные, есть модификации +- того, что уже и так опубликовали. Поэтому, чтоб никого не обидеть, решил наградить первых 5 человек, кто набрал больше всего ответов 💪🏻
Список ребят: Александр, Городецкий Олег, Konstantin Danilov, Dmitry Bykov, Abdulmutalib
Каждому по 1К руб или эквиваленту в USDT. На пятничный пивас или кефир, кому что нравится. Напишите мне плиз.
Всем остальным спасибо за участие, был интересно посмотреть на полет фантазии🔥👍
Все таки, основная цель марафона не заработать денег, а порешать задачки, которые могут встретиться на собеседованиях на Junior, Middle- позиции🎓
Следующий раз, задачки будут разделены по дням. Кажется, что тяжеловато в течение рабочего дня решать с интервалом в 1.5 часа 🤷🏻♂️
Хорошей пятницы 👯♀️
Обсудить в чатике 💬
#марафон
Канал Oracle Developer | Чатик 💬
Сегодня пятница, а значит пора выдать награду за участие в марафоне 🏆
Приз - 5000 рублей или эквивалент в крипте (USDT) 😁
Посидел, проанализировал решения... Есть прям очень оригинальные, есть модификации +- того, что уже и так опубликовали. Поэтому, чтоб никого не обидеть, решил наградить первых 5 человек, кто набрал больше всего ответов 💪🏻
Список ребят: Александр, Городецкий Олег, Konstantin Danilov, Dmitry Bykov, Abdulmutalib
Каждому по 1К руб или эквиваленту в USDT. На пятничный пивас или кефир, кому что нравится. Напишите мне плиз.
Всем остальным спасибо за участие, был интересно посмотреть на полет фантазии🔥👍
Все таки, основная цель марафона не заработать денег, а порешать задачки, которые могут встретиться на собеседованиях на Junior, Middle- позиции🎓
Следующий раз, задачки будут разделены по дням. Кажется, что тяжеловато в течение рабочего дня решать с интервалом в 1.5 часа 🤷🏻♂️
Хорошей пятницы 👯♀️
Обсудить в чатике 💬
#марафон
Канал Oracle Developer | Чатик 💬
Задача с PL/SQL-коллекциями
Коллеги, всем привет!
Давно у нас не было PL/SQL. В запасниках откопал одну из задачек с реального собеса (DataArt).
Вариант 1 - мой доработанный, вариант 2 - с подковыркой, как был на собесе.
Вопрос: что будет выведено в буфер?
⚠️ Рекомендую не жульничать, а попытаться решить в уме.
Разбор задачи в четверг 🎓
Обсудить в чатике 💬
#задача
Oracle Developer
Коллеги, всем привет!
Давно у нас не было PL/SQL. В запасниках откопал одну из задачек с реального собеса (DataArt).
Вариант 1 - мой доработанный, вариант 2 - с подковыркой, как был на собесе.
-- Вариант 1
declare
type t_arr is table of varchar2(128) index by pls_integer;
a1 t_arr;
a2 t_arr;
begin
a1(0) := 'zero';
a2 := a1;
a1(0) := 'empty';
dbms_output.put_line(a1(0) || ' | ' || a2(0));
end;
/
-- Вариант 2
declare
type t_arr is table of varchar2(128) index by pls_integer;
type t_arr2 is table of varchar2(128) index by pls_integer;
a1 t_arr;
a2 t_arr2;
begin
a1(0) := 'zero';
a2 := a1;
a1(0) := 'empty';
dbms_output.put_line(a1(0) || ' | ' || a2(0));
end;
/
Вопрос: что будет выведено в буфер?
⚠️ Рекомендую не жульничать, а попытаться решить в уме.
Разбор задачи в четверг 🎓
Обсудить в чатике 💬
#задача
Oracle Developer
Задача с PL/SQL-коллекциями. Решение
Постановка в посте вторника.
Решение и анализ
1️⃣й вариант
🔹 t_arr - это ассоциативный массив, объявлен как локальный тип в анонимном PL/SQL-блоке. Ключ - числа, значение - varchar2(128).
🔹 a1 и a2 - это две переменных = два массива.
🔹 Инициализация асоциативного массива не требуется. Поэтому, когда происходит присвоение значения к a1(0) ошибки не будет. “0” - это ключ для значения ‘zero’.
🔹 a2 := a1; - значения первой коллекции копируются во вторую. Если бы это была Java, то мы бы присвоили ссылку a2 на а1.
🔹 a1(0) := 'empty'; - присваивается новое значение в старой коллекции, при этом значение в a2 не меняется (привет вопросам на собесе по Java).
Ответ: empty | zero
2️⃣й вариант
Я бы сказал, рассчитан на внимательность. Честно говоря, не очень люблю такие задачки. Особенно они популярны на Oracle-сертификации.
🔹t_arr и t_arr2 - два локальных типа ассоциативного массива. Да, по сути они одинаковы, но все же это разные типы.
🔹эта строка a2 := a1; вызовет глубокое недоумение у СУБД. Как объекты с разным типом могут быть присвоены друг другу? никак.
Ответ: Тут вообще, произойдет ошибка. Блок не выполнится. Ничего не будет выведено.
Палец вверх, если понравилось 👍
Обсудить в чатике 💬
#решениезадачи
Oracle Developer
Постановка в посте вторника.
Решение и анализ
1️⃣й вариант
🔹 t_arr - это ассоциативный массив, объявлен как локальный тип в анонимном PL/SQL-блоке. Ключ - числа, значение - varchar2(128).
🔹 a1 и a2 - это две переменных = два массива.
🔹 Инициализация асоциативного массива не требуется. Поэтому, когда происходит присвоение значения к a1(0) ошибки не будет. “0” - это ключ для значения ‘zero’.
🔹 a2 := a1; - значения первой коллекции копируются во вторую. Если бы это была Java, то мы бы присвоили ссылку a2 на а1.
🔹 a1(0) := 'empty'; - присваивается новое значение в старой коллекции, при этом значение в a2 не меняется (привет вопросам на собесе по Java).
Ответ: empty | zero
2️⃣й вариант
Я бы сказал, рассчитан на внимательность. Честно говоря, не очень люблю такие задачки. Особенно они популярны на Oracle-сертификации.
🔹t_arr и t_arr2 - два локальных типа ассоциативного массива. Да, по сути они одинаковы, но все же это разные типы.
🔹эта строка a2 := a1; вызовет глубокое недоумение у СУБД. Как объекты с разным типом могут быть присвоены друг другу? никак.
Ответ: Тут вообще, произойдет ошибка. Блок не выполнится. Ничего не будет выведено.
Палец вверх, если понравилось 👍
Обсудить в чатике 💬
#решениезадачи
Oracle Developer
Задача. Спроектировать отношение между таблицами.
Дано: таблицы - “клиенты” и “адреса”
У одного клиента может быть более одного адреса, и у адреса может быть более одного клиента.
Как вы опишите в коде эту взаимосвязь? Что для этого потребуется?
Подумайте над ключами, индексами и т.д.
Результат выполнения: набор DDL-команд.
Разбор задачи в четверг 🎓
Обсудить в чатике 💬
#задача
Oracle Developer
Дано: таблицы - “клиенты” и “адреса”
create table client(
id number(38) not null primary key,
other fields
);
create table address(
id number(38) not null primary key,
other fields
);
У одного клиента может быть более одного адреса, и у адреса может быть более одного клиента.
Как вы опишите в коде эту взаимосвязь? Что для этого потребуется?
Подумайте над ключами, индексами и т.д.
Результат выполнения: набор DDL-команд.
Разбор задачи в четверг 🎓
Обсудить в чатике 💬
#задача
Oracle Developer
Решение задачи. Спроектировать отношение между таблицами.
Постановка в посте вторника.
Решение
1️⃣ Поскольку, у нас отношение многие-ко-многим, придется создать таблицу связки/маппинга, в которой будет храниться отношение сущностей к друг другу.
2️⃣ Как минимум три столбца:
id - уникальный ID в таблице
client_id - уникальный ID в таблице “клиенты”
address_id - уникальный ID в таблице “адреса”
Может возникнуть вопрос, зачем нам ID? ведь можно использовать пару столбцов для PK.
Генерация и хранение ID практически ничего не стоят. Как минимум, различного рода репликации, переливки ооочень любят ID, а еще б какую-нибудь временную метку.
С ID однозначно идентифицирующую строку - работать проще. В некоторых компаниях, явно прописывается наличие суррогантного ID в любой таблице.
3️⃣ Связка должна быть уникальна, поэтому будет уникальный ключ на пару столбцов - client_id/address_id.
За кадром, Oracle создаст уникальный индекс, который будет поддерживать уникальность на физическом уровне. При наличии этого индекса, мы легко сможем искать по client_id (лидирующий столбец).
4️⃣ Также необходим еще один индекс по address_id.
Почему? Велком на курс по Оптимизации 🎓
5️⃣ Не забудем про foreign keys на таблицы client и address, которые будут контролировать целостность данных.
Итого
Задачка на архитектуру - довольно простая и короткая, но очень показательная.
Бывает так, что ставит в тупик крепкого мидла или сеньера (по их версии). Лично мне она попадалась в Сбер-банке.
Я люблю её спрашивать на Mock-собеседованиях. Это такие тренировочные собеседования, симуляции. Можно без страха, попробовать, подсветить свои пробелы и т.д.
Например, перед тем как пробоваться на позицию Java-разработчика, я прошел парочку Mock-собеседований. Это хороший прогрев перед поиском. Если, вдруг, интересно попробовать - пишите в личку.
Да, тут много чего можно еще навертеть. Чем ребята в чатике успешно занимались 😉👍
Обсудить в чате 💬
#решениезадачи #архитектура
Канал Oracle Developer | Чатик 💬
Постановка в посте вторника.
Решение
1️⃣ Поскольку, у нас отношение многие-ко-многим, придется создать таблицу связки/маппинга, в которой будет храниться отношение сущностей к друг другу.
2️⃣ Как минимум три столбца:
id - уникальный ID в таблице
client_id - уникальный ID в таблице “клиенты”
address_id - уникальный ID в таблице “адреса”
Может возникнуть вопрос, зачем нам ID? ведь можно использовать пару столбцов для PK.
Генерация и хранение ID практически ничего не стоят. Как минимум, различного рода репликации, переливки ооочень любят ID, а еще б какую-нибудь временную метку.
С ID однозначно идентифицирующую строку - работать проще. В некоторых компаниях, явно прописывается наличие суррогантного ID в любой таблице.
3️⃣ Связка должна быть уникальна, поэтому будет уникальный ключ на пару столбцов - client_id/address_id.
За кадром, Oracle создаст уникальный индекс, который будет поддерживать уникальность на физическом уровне. При наличии этого индекса, мы легко сможем искать по client_id (лидирующий столбец).
4️⃣ Также необходим еще один индекс по address_id.
Почему? Велком на курс по Оптимизации 🎓
5️⃣ Не забудем про foreign keys на таблицы client и address, которые будут контролировать целостность данных.
Итого
create table client_address
(
id number(38) not null,
client_id number(38) not null,
address_id number(38) not null
);
alter table client_address add constraint client_address_pk primary key (id);
alter table client_address add constraint client_address_cl_ad_uq unique (client_id, address_id);
create index client_address_address_i on client_address (address_id);
alter table client_address add constraint client_address_address_fk foreign key (address_id)
references address (id);
alter table client_address add constraint client_address_client_fk foreign key (client_id)
references client (id);
Задачка на архитектуру - довольно простая и короткая, но очень показательная.
Бывает так, что ставит в тупик крепкого мидла или сеньера (по их версии). Лично мне она попадалась в Сбер-банке.
Я люблю её спрашивать на Mock-собеседованиях. Это такие тренировочные собеседования, симуляции. Можно без страха, попробовать, подсветить свои пробелы и т.д.
Например, перед тем как пробоваться на позицию Java-разработчика, я прошел парочку Mock-собеседований. Это хороший прогрев перед поиском. Если, вдруг, интересно попробовать - пишите в личку.
Да, тут много чего можно еще навертеть. Чем ребята в чатике успешно занимались 😉👍
Обсудить в чате 💬
#решениезадачи #архитектура
Канал Oracle Developer | Чатик 💬