Задача о хранении объекта и его свойств
Постановка: см. пост вторника
Решение:
Для хранения технических полей используем основную таблицу сущности:
1️⃣ горизонтальное хранение;
2️⃣ вертикальное хранение (EAV);
3️⃣ другие более экзотические.
Постараюсь объяснить “на пальцах”. Допустим нам надо хранить всего 4е свойства: ФИО + ДР. Причем, отчество не обязательно.
1️⃣ Горизонтальное
Все свойства объекта располагаются в одной строке. Одно свойство = одному столбцу.
Классика 😊
Постановка: см. пост вторника
Решение:
Для хранения технических полей используем основную таблицу сущности:
create table client(Какие есть варианты хранение бизнесовых свойств объекта:
client_id number(38) not null,
is_active number(1) not null,
status number(10) not null,
create_dtime date not null
);
1️⃣ горизонтальное хранение;
2️⃣ вертикальное хранение (EAV);
3️⃣ другие более экзотические.
Постараюсь объяснить “на пальцах”. Допустим нам надо хранить всего 4е свойства: ФИО + ДР. Причем, отчество не обязательно.
1️⃣ Горизонтальное
Все свойства объекта располагаются в одной строке. Одно свойство = одному столбцу.
create table client_data_h(
client_id number(38) not null,
first_name varchar2(200 char) not null,
last_name varchar2(200 char) not null,
middle_name varchar2(200 char),
birth_day date not null
);
insert into client_data_h values(777, 'Иван', 'Иванов', null, date'1984-01-21');
Для поиска - индексируется поле(я).Классика 😊
2️⃣ Вертикальное (EAV)
Каждое свойство - это одна строка. Строка содержит: ссылку на родительскую сущность, ссылку на бизнесовый тип поля и само значение.
Если нужен поиск по нескольким свойствам, придется писать join для каждого критерия.
Например поиск по last_name + др:
Надеюсь, принцип понятен. Подробней в ссылке ниже.
3️⃣ Другие варианты
Я думаю, можно насобирать еще с десяток вариантов. Зависит от конкретных нужд системы.
Например, хранить часть свойств горизонтально, часть в json в одном поле. Как предложил Филип в этом видео.
⚠️ Каждый из вариантов имеет свои плюсы и минусы. Формат поста не позволяет рассмотреть их все.
——
Вернемся к задаче.
1️⃣ Требования: частое добавление новых свойств, нагруженная OLTP система.
🔸 Горизонтальное - нужно добавить новый столбец в таблицу client_data_h. Что выйдет? Скорее всего, ничего, т.к. система под нагрузкой - таблица заблокирована на изменение структуры.
🔸 Вертикальное - все сведется к вставке новой строки в client_data_field. После этого уже можно хранить свойство в client_data_v.
2️⃣ Требования: поиск по id клиента и бизнесовым свойствам.
С поиском по id клиента - проблем нет в любом варианте. По нему мы без проблем можем достать технические и бизнесовые свойства вне зависимости от объема данных.
🔸 Горизонтальное - PK по id клиента
🔸 Вертикальное - PK по комбинации id клиента + fld_id.
А вот с поиском клиентов по бизнесовым свойствам - проблема. Поиск в действительно большом объеме данных + по любому бизнес полю - это не задача OLTP.
Если оператору хочется производить поиск в данных, придется придумывать некие workaround-решения заточенные под поиск (это может быть, параллельно существующая структура для хранения бизнес полей; совсем другая БД и т.п.).
Если же данных не так что бы и много, то можем попробовать обойтись индексами:
🔸 Горизонтальное - нужно добавить новый индекс на новый столбец. С использованием опции online - это не большая проблема.
🔸 Вертикальное - у нас уже должен быть индекс на комбинацию полей (field_value, field_id). Ничего делать не нужно.
В любом случае, стоит дополнительно обговорить с бизнесом, точно ли им нужен поиск, по всем ли полям и т.п.
Выводы: для нашей задачи больше подходит вертикальное хранение свойств.
Понравилась задача? Палец вверх 👍
Тема холиварная - можно обсудить в нашем ламповом чатике 😉
P.S. В определениях таблиц опущены всевозможные ограничения, FK, PK и т.п.
#решениезадачи #проектирование
Oracle Developer
Каждое свойство - это одна строка. Строка содержит: ссылку на родительскую сущность, ссылку на бизнесовый тип поля и само значение.
— справочник типов бизнес-полейДля поиска индексируются поля field_value, field_id.
create table client_data_field(
field_id number(10) not null,
field_name varchar2(100 char) not null
);
insert into client_data_field values(1, 'FIRST_NAME');
insert into client_data_field values(2, 'LAST_NAME');
insert into client_data_field values(3, 'MIDDLE_NAME');
insert into client_data_field values(4, 'BIRTH_DAY');
create table client_data_v(
client_id number(38) not null,
field_id number(10) not null,
field_value varchar2(1000 char) not null
);
insert into client_data_v values(777, 1, 'Иван');
insert into client_data_v values(777, 2, 'Иванов');
insert into client_data_v values(777, 4, to_char(date'1984-01-21','dd.mm.yyyy'));
Если нужен поиск по нескольким свойствам, придется писать join для каждого критерия.
Например поиск по last_name + др:
select ...При возрастании объема данных поиск может быть ооочень долгим.
from client_data bd
join client_data ln on ln.client_id = bd.client_id and ln.field_id = 1 and ln.field_value = ...
where bd.field_id = 4
and bd.field_value = ...;
Надеюсь, принцип понятен. Подробней в ссылке ниже.
3️⃣ Другие варианты
Я думаю, можно насобирать еще с десяток вариантов. Зависит от конкретных нужд системы.
Например, хранить часть свойств горизонтально, часть в json в одном поле. Как предложил Филип в этом видео.
⚠️ Каждый из вариантов имеет свои плюсы и минусы. Формат поста не позволяет рассмотреть их все.
——
Вернемся к задаче.
1️⃣ Требования: частое добавление новых свойств, нагруженная OLTP система.
🔸 Горизонтальное - нужно добавить новый столбец в таблицу client_data_h. Что выйдет? Скорее всего, ничего, т.к. система под нагрузкой - таблица заблокирована на изменение структуры.
🔸 Вертикальное - все сведется к вставке новой строки в client_data_field. После этого уже можно хранить свойство в client_data_v.
2️⃣ Требования: поиск по id клиента и бизнесовым свойствам.
С поиском по id клиента - проблем нет в любом варианте. По нему мы без проблем можем достать технические и бизнесовые свойства вне зависимости от объема данных.
🔸 Горизонтальное - PK по id клиента
🔸 Вертикальное - PK по комбинации id клиента + fld_id.
А вот с поиском клиентов по бизнесовым свойствам - проблема. Поиск в действительно большом объеме данных + по любому бизнес полю - это не задача OLTP.
Если оператору хочется производить поиск в данных, придется придумывать некие workaround-решения заточенные под поиск (это может быть, параллельно существующая структура для хранения бизнес полей; совсем другая БД и т.п.).
Если же данных не так что бы и много, то можем попробовать обойтись индексами:
🔸 Горизонтальное - нужно добавить новый индекс на новый столбец. С использованием опции online - это не большая проблема.
🔸 Вертикальное - у нас уже должен быть индекс на комбинацию полей (field_value, field_id). Ничего делать не нужно.
В любом случае, стоит дополнительно обговорить с бизнесом, точно ли им нужен поиск, по всем ли полям и т.п.
Выводы: для нашей задачи больше подходит вертикальное хранение свойств.
Понравилась задача? Палец вверх 👍
Тема холиварная - можно обсудить в нашем ламповом чатике 😉
P.S. В определениях таблиц опущены всевозможные ограничения, FK, PK и т.п.
#решениезадачи #проектирование
Oracle Developer
👍9
Oracle + Тинькофф. Введение
Друзья всем привет!
В начале этого года я уже публиковал историю моих собеседований в #яндекс. Очередь банка “Тинькофф” 💰
В ноябре на меня вышел HR с вакансией в процессинговый центр “Тинькофф”.
Вакансия: PL/SQL разработчик, готовый развиваться в сторону Java-стека.
Отличная возможность запилить контент в канал, подумал я, и согласился 🙃
Основные задачи:
1️⃣ Поддерживать текущее решение на Oracle 19;
2️⃣ Принимать участие в миграции этого хозяйства в Java-экосистему (Java11-17, PostgreSQL, NoSQL-решения и т.п.).
Перспективы: импортозамещение - тема крайне актуальна для российского рынка. Специалист, умеющий в Oracle + Java и участвовавший в проектах миграции (импортозамещении) в крупном ФинТех будет на вес золото в следующие 5-15 лет.
Я даже не упоминаю про плюшки самой компании + возможность работать удаленно как в РФ, так и в странах ближнего зарубежья.
Про з/п не пишу - тут многое зависит от вас.
продолжение ⬇️
Друзья всем привет!
В начале этого года я уже публиковал историю моих собеседований в #яндекс. Очередь банка “Тинькофф” 💰
В ноябре на меня вышел HR с вакансией в процессинговый центр “Тинькофф”.
Вакансия: PL/SQL разработчик, готовый развиваться в сторону Java-стека.
Отличная возможность запилить контент в канал, подумал я, и согласился 🙃
Основные задачи:
1️⃣ Поддерживать текущее решение на Oracle 19;
2️⃣ Принимать участие в миграции этого хозяйства в Java-экосистему (Java11-17, PostgreSQL, NoSQL-решения и т.п.).
Перспективы: импортозамещение - тема крайне актуальна для российского рынка. Специалист, умеющий в Oracle + Java и участвовавший в проектах миграции (импортозамещении) в крупном ФинТех будет на вес золото в следующие 5-15 лет.
Я даже не упоминаю про плюшки самой компании + возможность работать удаленно как в РФ, так и в странах ближнего зарубежья.
Про з/п не пишу - тут многое зависит от вас.
продолжение ⬇️
👍24
Этапы собеседований
1️⃣ Предварительное общение с HR
Про опыт, про мотивацию и т.п. В том числе, было задано 8 контрольных технических экспресс-вопросов. Если кандидат плавает в них - есть ли смысл переходить к следующим стадиями… Считаю это отличной практикой - экономит время всем участникам процесса.
Время - 30 минут.
Опубликую вопросы - во вторник, ответы - в четверг.
2️⃣ Техническое интервью
Если ваше резюме и общение с HR всех удовлетворило, вы попадете на второй этап. В моем случае это был 1 человек - руководитель одного из направлений. Если в Яндекс упор был на практику (требовалось решить прям в онлайн несколько задач), то в Тинькофф - это теоретическое собеседование + написание запросов (до них дело не дошло). Спектр вопросов охватывал абсолютно разные области.
Время - 1-1.5 часа.
3️⃣ Общение с руководителями групп
Если не осрамились на тех собесе, то попадете на общение с другими руководителями групп. Это возможность задать вопросы, синхронизироваться по ожиданиям, показать ваши софт-скилы.
Не менее важный этап, чем тех собеседование. Вы присматриваетесь друг к другу.
Время - 1 час.
4️⃣ Оффер
Если все ок, то получаете заветный оффер.
Условия в оффере зависят от города/страны места работы.
Продолжение следует...
P.S. Уточню. Это серия постов не про то какой я супер пупер специалист, а про, то как устроены собеседования в одной из Топ-компаний РФ для Oracle-разработчиков. Что стоит ждать, какие вопросы задают и т.п. Возможно, кому-то будет интересно, кто-то взглянет под другим углом на свой процесс найма.
#тинькофф #собеседование
Oracle Developer
1️⃣ Предварительное общение с HR
Про опыт, про мотивацию и т.п. В том числе, было задано 8 контрольных технических экспресс-вопросов. Если кандидат плавает в них - есть ли смысл переходить к следующим стадиями… Считаю это отличной практикой - экономит время всем участникам процесса.
Время - 30 минут.
Опубликую вопросы - во вторник, ответы - в четверг.
2️⃣ Техническое интервью
Если ваше резюме и общение с HR всех удовлетворило, вы попадете на второй этап. В моем случае это был 1 человек - руководитель одного из направлений. Если в Яндекс упор был на практику (требовалось решить прям в онлайн несколько задач), то в Тинькофф - это теоретическое собеседование + написание запросов (до них дело не дошло). Спектр вопросов охватывал абсолютно разные области.
Время - 1-1.5 часа.
3️⃣ Общение с руководителями групп
Если не осрамились на тех собесе, то попадете на общение с другими руководителями групп. Это возможность задать вопросы, синхронизироваться по ожиданиям, показать ваши софт-скилы.
Не менее важный этап, чем тех собеседование. Вы присматриваетесь друг к другу.
Время - 1 час.
4️⃣ Оффер
Если все ок, то получаете заветный оффер.
Условия в оффере зависят от города/страны места работы.
Продолжение следует...
P.S. Уточню. Это серия постов не про то какой я супер пупер специалист, а про, то как устроены собеседования в одной из Топ-компаний РФ для Oracle-разработчиков. Что стоит ждать, какие вопросы задают и т.п. Возможно, кому-то будет интересно, кто-то взглянет под другим углом на свой процесс найма.
#тинькофф #собеседование
Oracle Developer
🔥41👍15❤1
Тинькофф. Вопросы от HR
Экспресс-вопросы от HR
1️⃣ Есть две таблицы t1 и t2. В первой 10 строк, во второй 20.
Что вернет запрос?
select count(*) from t1,t2
2️⃣ Какие виды логического соединения таблиц вы знаете? Напр. inner join, какие еще?
3️⃣ Какие основные ТИПЫ индексов вы знаете?(или виды организации индексов)
4️⃣ Какие виды физического соединения таблиц в плане запроса вы встречали?
5️⃣ Для чего нужен оператор having?
6️⃣ Что такое автономная транзакция?
7️⃣ Какие DDL DML операции знаете?
8️⃣ С помощью каких операторов в запросе можно избавиться от дублирующих значений в поле?
Сказать, что это какой-то эксклюзив от Тинька и я что-то "спалил" нельзя. Обычно, задают примерно такие экспресс-вопросы 🤷♂️
Обсудить в чатике.
Разбор в четверг 🎓
#задача #тинькофф
Oracle Developer
Экспресс-вопросы от HR
1️⃣ Есть две таблицы t1 и t2. В первой 10 строк, во второй 20.
Что вернет запрос?
select count(*) from t1,t2
2️⃣ Какие виды логического соединения таблиц вы знаете? Напр. inner join, какие еще?
3️⃣ Какие основные ТИПЫ индексов вы знаете?(или виды организации индексов)
4️⃣ Какие виды физического соединения таблиц в плане запроса вы встречали?
5️⃣ Для чего нужен оператор having?
6️⃣ Что такое автономная транзакция?
7️⃣ Какие DDL DML операции знаете?
8️⃣ С помощью каких операторов в запросе можно избавиться от дублирующих значений в поле?
Сказать, что это какой-то эксклюзив от Тинька и я что-то "спалил" нельзя. Обычно, задают примерно такие экспресс-вопросы 🤷♂️
Обсудить в чатике.
Разбор в четверг 🎓
#задача #тинькофф
Oracle Developer
👍18
Экспресс-вопросы от HR. Ответы
Список вопросов: см. в посте вторника.
Экспресс-вопросы задает HR, очень желательно давать ответы без “растекания мысли по древу”. У HR записаны четкие ответы, он сверяет их с тем, что вы говорите.
💡 Совет: говорите четко, быстро и по делу.
Ответы:
1️⃣ 200
обычное декартово произведение.
2️⃣ left/right/full outer join, inner join, cross join, natural join.
3️⃣ Уникальные/не уникальные, одностолбцовые/составные (более чем 1 столбец), функциональные (используют deterministic-функцию); реверсивные; с обратной сортировкой; локальные, глобальные;
B-tree индексы, bitmap-индексы; кластерные; прикладные индексы для узких задач.
100% попадете в список ответов у HR 😉
4️⃣ основные - nested loops, merge join, hash join
5️⃣ Having фильтрует получившиеся группы после group by
6️⃣ А.т. - отдельная транзакция порожденная из основной и не оказывающая влияние на основную транзакцию.
7️⃣ DDL - язык определения данных - create, drop, truncate, alter и т.д.
DML - язык манипуляции данными - delete, update, insert, select
8️⃣ distinct, group by, union (более 1 таблицы)
Вопросы довольно простые, уровня junior+-middle-.
Антиспам-вопросы 😊
На следующей неделе расскажу про техническое собеседование 😉
Перетереть в чатике.
#решениезадачи #тинькофф
Oracle Developer
Список вопросов: см. в посте вторника.
Экспресс-вопросы задает HR, очень желательно давать ответы без “растекания мысли по древу”. У HR записаны четкие ответы, он сверяет их с тем, что вы говорите.
💡 Совет: говорите четко, быстро и по делу.
Ответы:
1️⃣ 200
обычное декартово произведение.
2️⃣ left/right/full outer join, inner join, cross join, natural join.
3️⃣ Уникальные/не уникальные, одностолбцовые/составные (более чем 1 столбец), функциональные (используют deterministic-функцию); реверсивные; с обратной сортировкой; локальные, глобальные;
B-tree индексы, bitmap-индексы; кластерные; прикладные индексы для узких задач.
100% попадете в список ответов у HR 😉
4️⃣ основные - nested loops, merge join, hash join
5️⃣ Having фильтрует получившиеся группы после group by
6️⃣ А.т. - отдельная транзакция порожденная из основной и не оказывающая влияние на основную транзакцию.
7️⃣ DDL - язык определения данных - create, drop, truncate, alter и т.д.
DML - язык манипуляции данными - delete, update, insert, select
8️⃣ distinct, group by, union (более 1 таблицы)
Вопросы довольно простые, уровня junior+-middle-.
Антиспам-вопросы 😊
На следующей неделе расскажу про техническое собеседование 😉
Перетереть в чатике.
#решениезадачи #тинькофф
Oracle Developer
👍39🔥4❤3
Тинькоф. Техническое собеседование
Мне важно было пройти техническое собеседование блестяще.
Ведь читателям нужен happy end 😊 А я последний год больше занимаюсь Java-разработкой и кое-какие вещи стали забываться. Пришлось поднять свои же обучающие программы, которые я давал студентам и потратить полчасика на то, чтобы освежить некоторые моменты.
Каких-то конкретных задач с технического собеседования я вам дать не смогу. Ибо практики, лично у меня, не было, но у них есть задания с написанием запросов. Каких? Хз. Я бы погонял по аналитическим функциям 😁
Формат собеседования: созвон в Zoom, общение глаза в глаза 👀
Меня лично собеседовал 1 специалист. Грамотно и очень вежливо. Приятно пообщались 👍
Помню лет 7 назад общался со спецом в Краснодаре в филиале Спортмастера. Имя - Яков. Думаю, некоторые его узнают. Тогда осадок был тяжкий от собеседования. Было не приятно.
Завтра опубликую список тем, которые запомнились 😉
#тинькофф #собеседование
Oracle Developer
Мне важно было пройти техническое собеседование блестяще.
Ведь читателям нужен happy end 😊 А я последний год больше занимаюсь Java-разработкой и кое-какие вещи стали забываться. Пришлось поднять свои же обучающие программы, которые я давал студентам и потратить полчасика на то, чтобы освежить некоторые моменты.
Каких-то конкретных задач с технического собеседования я вам дать не смогу. Ибо практики, лично у меня, не было, но у них есть задания с написанием запросов. Каких? Хз. Я бы погонял по аналитическим функциям 😁
Формат собеседования: созвон в Zoom, общение глаза в глаза 👀
Меня лично собеседовал 1 специалист. Грамотно и очень вежливо. Приятно пообщались 👍
Помню лет 7 назад общался со спецом в Краснодаре в филиале Спортмастера. Имя - Яков. Думаю, некоторые его узнают. Тогда осадок был тяжкий от собеседования. Было не приятно.
Завтра опубликую список тем, которые запомнились 😉
#тинькофф #собеседование
Oracle Developer
👍26❤2
Техническое собеседование в Тинькофф
Формат общения - онлайн, глаза в глаза 👀
Список тем
1️⃣ Секционирование.
виды, индексы, как обеспечивать уникальность и т.п.
2️⃣ Индексы.
виды, как правильно выбирать столбцы для индексирования и т.п.
3️⃣ Вопросы, связанные с механизмом многоверсионности (UNDO).
4️⃣ Блокировки.
виды, особенности
5️⃣ Транзакции.
определение, acid, автономные и т.п.
6️⃣ Многопоточность.
способы реализации
7️⃣ Кэширование.
разные виды, механизмы и т.п.
8️⃣ Оптимизация
что делать если запрос начал тормозить
Темы в основном связаны с архитектурой.
Многие вопросы из этого списка уже так или иначе затрагивались в канале.
⚠️ Предлагаю проголосовать за какую-то из тем. В каком-нибудь из постов остановлюсь на ней подробно.
Разбор как всегда в четверг 🎓
Обсудить в чате.
#задача #тинькофф #собеседование
Oracle Developer
Формат общения - онлайн, глаза в глаза 👀
Список тем
1️⃣ Секционирование.
виды, индексы, как обеспечивать уникальность и т.п.
2️⃣ Индексы.
виды, как правильно выбирать столбцы для индексирования и т.п.
3️⃣ Вопросы, связанные с механизмом многоверсионности (UNDO).
4️⃣ Блокировки.
виды, особенности
5️⃣ Транзакции.
определение, acid, автономные и т.п.
6️⃣ Многопоточность.
способы реализации
7️⃣ Кэширование.
разные виды, механизмы и т.п.
8️⃣ Оптимизация
что делать если запрос начал тормозить
Темы в основном связаны с архитектурой.
Многие вопросы из этого списка уже так или иначе затрагивались в канале.
⚠️ Предлагаю проголосовать за какую-то из тем. В каком-нибудь из постов остановлюсь на ней подробно.
Разбор как всегда в четверг 🎓
Обсудить в чате.
#задача #тинькофф #собеседование
Oracle Developer
👍10❤1
Техническое собеседование в Тинькофф. Ответы
Список вопросов см. в посте вторника.
1️⃣ Секционирование
Одна из базовых тем для разработчика. Знать обязан каждый.
По тегу #секционирование можно найти несколько постов. Видов секционирования больше чем в этом посте. В 2021м я даже проводил обучение. Кстати, если наберется группа из 10 человек проведу еще. Кому интересно пишите в личку.
2️⃣ Индексы
🔹 про виды индексов было в посте на прошлой неделе.
🔹 как правильно выбирать столбцы: зависит от системы olt/dwh -> физической организации индекса B-tree, bitmap. Для B-tree важный критерий уникальность значений (дб максимальна), для bitmap - наоборот (пример, пол). + фишки с лидирующим столбцом. Как раз в курсе оптимизации будем разбирать.
3️⃣ Вопросы связанные с механизмом многоверсионности (UNDO)
🔹 помним, что измененные блоки/строки попадают в UNDO. При выполнении запроса - с UNDO выгребаются данные соответствующие определенным критериям.
🔹 два поста на классические ошибки - пост1, пост2 нужно понимать почему они возникают и как с ними бороться.
4️⃣ Блокировки
select for update + опции, dbms_lock, lock table, стратегии оптимистичная/пессимистичная, защелки в SGA.
5️⃣ Транзакции
вот прям по тегу #транзакции учим наизусть и этого хватит на все собеседования.
6️⃣ Многопоточность
Oracle это все же не Java. Тут нет такого многообразия механизмов. Все ограничивается набором из dbms_job, dbms_scheduler, dbms_parallel, хинт parallel.
7️⃣ Кэширование
Различные виды кэшей - кэши в SGA, #result_cache, #deterministic и самописные решения на основе коллекций + состояние пакета.
8️⃣ Оптимизация
Удивился когда обнаружил 37 постов по тегу #оптимизация В них есть частичный ответ на извечный вопрос “что делать, если запрос начал тормозить”. Опять же не рекламы ради скажу, что будем разбирать подробно это на курсе по оптимизации.
Пост получился длинноват. При том, что я не очень подробно ответил на все вопросы. Каждый можно знатно помусолить. Это, всего лишь, направления.
Не факт, что у вас будут те же вопросы 😉
Палец вверх, если зашло 👍
Обсудить в чатике 🫂
#решениезадачи #тинькофф #собеседование
Oracle Developer
Список вопросов см. в посте вторника.
1️⃣ Секционирование
Одна из базовых тем для разработчика. Знать обязан каждый.
По тегу #секционирование можно найти несколько постов. Видов секционирования больше чем в этом посте. В 2021м я даже проводил обучение. Кстати, если наберется группа из 10 человек проведу еще. Кому интересно пишите в личку.
2️⃣ Индексы
🔹 про виды индексов было в посте на прошлой неделе.
🔹 как правильно выбирать столбцы: зависит от системы olt/dwh -> физической организации индекса B-tree, bitmap. Для B-tree важный критерий уникальность значений (дб максимальна), для bitmap - наоборот (пример, пол). + фишки с лидирующим столбцом. Как раз в курсе оптимизации будем разбирать.
3️⃣ Вопросы связанные с механизмом многоверсионности (UNDO)
🔹 помним, что измененные блоки/строки попадают в UNDO. При выполнении запроса - с UNDO выгребаются данные соответствующие определенным критериям.
🔹 два поста на классические ошибки - пост1, пост2 нужно понимать почему они возникают и как с ними бороться.
4️⃣ Блокировки
select for update + опции, dbms_lock, lock table, стратегии оптимистичная/пессимистичная, защелки в SGA.
5️⃣ Транзакции
вот прям по тегу #транзакции учим наизусть и этого хватит на все собеседования.
6️⃣ Многопоточность
Oracle это все же не Java. Тут нет такого многообразия механизмов. Все ограничивается набором из dbms_job, dbms_scheduler, dbms_parallel, хинт parallel.
7️⃣ Кэширование
Различные виды кэшей - кэши в SGA, #result_cache, #deterministic и самописные решения на основе коллекций + состояние пакета.
8️⃣ Оптимизация
Удивился когда обнаружил 37 постов по тегу #оптимизация В них есть частичный ответ на извечный вопрос “что делать, если запрос начал тормозить”. Опять же не рекламы ради скажу, что будем разбирать подробно это на курсе по оптимизации.
Пост получился длинноват. При том, что я не очень подробно ответил на все вопросы. Каждый можно знатно помусолить. Это, всего лишь, направления.
Не факт, что у вас будут те же вопросы 😉
Палец вверх, если зашло 👍
Обсудить в чатике 🫂
#решениезадачи #тинькофф #собеседование
Oracle Developer
👍47❤1
Oracle + Тинькофф. Заключение
Заканчиваю эпопею с Тиньком.
Еще в 2018м году я прошел собеседование в Тинькофф банк. Тогда я выбирал между ним и Qiwi. Выбрал Qiwi ❤️
В этот раз я не получил оффер 😌
💬HR: "По техническим навыкам вопросов нет. Их смутили софты. Будет сложно влиться в команду, так как не увидели мотивации быть эффективным членом команды. На мотивацию они действительно обращают большое внимание."
Раскусили казачка засланного. Слишком самоуверенный и чутка нагловатый подход на собеседовании не идет на пользу кандидату 😂
Я не буду оценивать простоту или сложность прохождения всех этапов. Очень субъективно. С уверенностью можно сказать, на успех влияет сумма факторов: hard + soft skills. В вашей истории может быть совсем другой итог. Если вы мидл и не ответите на некоторые технические вопросы - это не значит, что вы не пройдете 😉 Пытайтесь.
Еще раз. Тем, чем предстоит заниматься - заманчиво🔥 Это отличный задел на развитие вас как специалиста-технаря (Oracle, Java-стек), так и руководителя в будущем. Тинькофф-банк достойный работодатель с возможностью работать удаленно в РФ и в некоторых странах ближнего зарубежья.
Если интересны реальные истории о прохождении собеседований, можете накинуть идей в чат куда еще стоит отправить резюме 😉
Всем хороших выходных!🌞
#тинькофф #собеседование
Oracle Developer
Заканчиваю эпопею с Тиньком.
Еще в 2018м году я прошел собеседование в Тинькофф банк. Тогда я выбирал между ним и Qiwi. Выбрал Qiwi ❤️
В этот раз я не получил оффер 😌
💬HR: "По техническим навыкам вопросов нет. Их смутили софты. Будет сложно влиться в команду, так как не увидели мотивации быть эффективным членом команды. На мотивацию они действительно обращают большое внимание."
Раскусили казачка засланного. Слишком самоуверенный и чутка нагловатый подход на собеседовании не идет на пользу кандидату 😂
Я не буду оценивать простоту или сложность прохождения всех этапов. Очень субъективно. С уверенностью можно сказать, на успех влияет сумма факторов: hard + soft skills. В вашей истории может быть совсем другой итог. Если вы мидл и не ответите на некоторые технические вопросы - это не значит, что вы не пройдете 😉 Пытайтесь.
Еще раз. Тем, чем предстоит заниматься - заманчиво🔥 Это отличный задел на развитие вас как специалиста-технаря (Oracle, Java-стек), так и руководителя в будущем. Тинькофф-банк достойный работодатель с возможностью работать удаленно в РФ и в некоторых странах ближнего зарубежья.
Если интересны реальные истории о прохождении собеседований, можете накинуть идей в чат куда еще стоит отправить резюме 😉
Всем хороших выходных!🌞
#тинькофф #собеседование
Oracle Developer
👍14🤯2
Друзья, всем привет!
30.11 у коллег закончилось трехмесячное путешествие по миру PL/SQL 🚀
Рад сообщить, о старте уже восьмого потока курса “Oracle PL/SQL.Основы” 🎓
Будет полезен: QA-инженерам, разработчикам, аналитикам.
Цель: научить вас читать чужой и писать свой PL/SQL-код, достаточный для современной разработки и закрытия рабочих задач.
🔹22 видео;
🔹18 практик = единый проект;
🔹13 онлайн встреч в Zoom с разбором вопросов;
🔹закрытый телеграм-канал;
Шаг за шагом, вы будете создавать API для прототипа платежной системы. Начав с анонимных блоков вы закончите своим фреймворком для Unit-тестирования. Пример.
Подробности и программа - здесь. Видео-отзывы - здесь.
Для тех кто заинтересован, но пока не уверен, я создал промо-группу курса, в которой буду размещать подробности, отрывки с занятий, отвечать на вопросы (да вы можете их сразу задавать) и даже встретимся онлайн. Залетайте!
⚠️ Группа 10 человек. Даты проведения: 13.01 - 31.03
Отличное время прокачаться 🎓
#plsql_basic
Oracle Developer
30.11 у коллег закончилось трехмесячное путешествие по миру PL/SQL 🚀
Рад сообщить, о старте уже восьмого потока курса “Oracle PL/SQL.Основы” 🎓
Будет полезен: QA-инженерам, разработчикам, аналитикам.
Цель: научить вас читать чужой и писать свой PL/SQL-код, достаточный для современной разработки и закрытия рабочих задач.
🔹22 видео;
🔹18 практик = единый проект;
🔹13 онлайн встреч в Zoom с разбором вопросов;
🔹закрытый телеграм-канал;
Шаг за шагом, вы будете создавать API для прототипа платежной системы. Начав с анонимных блоков вы закончите своим фреймворком для Unit-тестирования. Пример.
Подробности и программа - здесь. Видео-отзывы - здесь.
Для тех кто заинтересован, но пока не уверен, я создал промо-группу курса, в которой буду размещать подробности, отрывки с занятий, отвечать на вопросы (да вы можете их сразу задавать) и даже встретимся онлайн. Залетайте!
⚠️ Группа 10 человек. Даты проведения: 13.01 - 31.03
Отличное время прокачаться 🎓
#plsql_basic
Oracle Developer
👍6🤩1
Задача. Ревью. Замена домена в email ✉️
Представьте, что вам на код-ревью junior отправил код процедуры (см ниже).
Функционал: замена домена в email’ах некой таблицы broker.
Предполагается, что объем измененных данных будет около 100К строк.
Обсудить в нашем ламповом чатике.
Анализ, как всегда, в четверг 🎓
#задача
Oracle Developer
Представьте, что вам на код-ревью junior отправил код процедуры (см ниже).
Функционал: замена домена в email’ах некой таблицы broker.
Предполагается, что объем измененных данных будет около 100К строк.
create or replace procedure change_domain(p_olddomainname varchar2
,p_newdomainname varchar2) is
cursor c_emailaddress is
select broker_number
,email_address
from broker
where lower(email_address) like '%@' || lower(p_olddomainname);
v_brokernumber broker.broker_number%type;
v_emailaddress broker.email_address%type;
v_localaddress broker.email_address%type;
v_atposition number(2, 0);
begin
open c_emailaddress;
loop
fetch c_emailaddress
into v_brokernumber
,v_emailaddress;
exit when c_emailaddress%notfound;
v_atposition := instr(v_emailaddress, '@');
v_localaddress := substr(v_emailaddress, 1, v_atposition);
update broker
set email_address = v_localaddress || p_newdomainname
where broker_number = v_brokernumber;
end loop;
close c_emailaddress;
end;
/
❓ Пропустите ли вы такой код? Если нет, то почему? Есть ли в нем проблемы? Какие рекомендации дадите разработчику?Обсудить в нашем ламповом чатике.
Анализ, как всегда, в четверг 🎓
#задача
Oracle Developer
👍4
Решение. Ревью. Замена домена в email
Всем привет!
Постановка: в посте вторника.
Анализ
Сразу скажу, у меня такой код не прошел бы ревью. Объясню причины.
1️⃣ Работа с данными выполняется по одной строке, используя курсор.
2️⃣ Работая с пачками, для обновления таблицы broker, стоит использовать forall - оператор множественного связывания.
3️⃣ Код не закрывает корректно курсор, в случае возникновения исключений.
Обычно это выполняется через блок обработки ошибок в конце процедуры.
Главный вопрос - а зачем нам тут курсор и построчная обработка❓
С учетом объема строк (100К), одного обычного update вполне хватит, чтобы решить эту задачу. Обертка в виде процедуры - дело конкретной реализации.
Код получился очень простой и лаконичный.
В задаче не рассмотрен вопрос оптимизации выполнения запроса.
Простое правило: если вы пишете слово cursor в вашем коде, подумайте хорошенько “надо ли”, может можно сделать все проще 🤷♂️
Хотите научиться писать PL/SQL-код, за который не будет стыдно? Знать когда применять курсоры, а когда нет?
Новый набор на 8-й поток курса “Основы PL/SQL” уже начался. Старт занятий - 13 января 🎓
Палец вверх, если задача понравилась 👍 Обсудить в чатике.
#решениезадачи #cursor
Oracle Developer
Всем привет!
Постановка: в посте вторника.
Анализ
Сразу скажу, у меня такой код не прошел бы ревью. Объясню причины.
1️⃣ Работа с данными выполняется по одной строке, используя курсор.
fetch c_emailaddress into v_brokernumber, v_emailaddress;ничего не мешает вычитывать данные пачками, с использованием конструкции limit.
2️⃣ Работая с пачками, для обновления таблицы broker, стоит использовать forall - оператор множественного связывания.
3️⃣ Код не закрывает корректно курсор, в случае возникновения исключений.
Обычно это выполняется через блок обработки ошибок в конце процедуры.
exceptionНо это всё так… мелочи.
when others then
if c_emailaddress%isopen then
close c_emailaddress;
end if;
raise;
end;
Главный вопрос - а зачем нам тут курсор и построчная обработка❓
С учетом объема строк (100К), одного обычного update вполне хватит, чтобы решить эту задачу. Обертка в виде процедуры - дело конкретной реализации.
create or replace procedure change_domain(p_olddomainname varchar2/
,p_newdomainname varchar2) is
update broker
set email_address = ...
where lower(email_address) like '%@' || lower(p_olddomainname);
end;
Код получился очень простой и лаконичный.
В задаче не рассмотрен вопрос оптимизации выполнения запроса.
Простое правило: если вы пишете слово cursor в вашем коде, подумайте хорошенько “надо ли”, может можно сделать все проще 🤷♂️
Хотите научиться писать PL/SQL-код, за который не будет стыдно? Знать когда применять курсоры, а когда нет?
Новый набор на 8-й поток курса “Основы PL/SQL” уже начался. Старт занятий - 13 января 🎓
Палец вверх, если задача понравилась 👍 Обсудить в чатике.
#решениезадачи #cursor
Oracle Developer
👍17🔥1🎉1
Code-review процедуры "Перевод платежа в ошибку"
Всем привет!
Задача в формате код-ревью 👍
Джун отправил код. Процедура в пакете - перевод платежа в статус "ошибка".
Пропустите ли вы такой код? Если нет, то почему? Есть ли в нем проблемы? Какие рекомендации дадите разработчику?
1️⃣ Константы определены в спецификации:
c_active constant payment.status%type := 0; — платеж активный
c_error constant payment.status%type := 2; — платеж в ошибке
c_err_code_status_is_not_active constant number(10) := -20101;
c_err_code_payment_is_not_found constant number(10) := -20102;
2️⃣ Определение таблицы можно посмотреть здесь.
3️⃣ Многосессионная среда, есть конкуренция за данные.
——-
Обсудить в нашем ламповом чатике.
Анализ, как всегда, в четверг 🎓
Для тех кто хочет подтянуться свои знания в PL/SQL, портал возможностей откроется с 13.01 - 8й поток курса Основы PL/SQL. Записывайтесь, пока еще, есть несколько мест 🔥
#задача
Oracle Developer
Всем привет!
Задача в формате код-ревью 👍
Джун отправил код. Процедура в пакете - перевод платежа в статус "ошибка".
Пропустите ли вы такой код? Если нет, то почему? Есть ли в нем проблемы? Какие рекомендации дадите разработчику?
procedure fail_payment(p_payment_id payment.payment_id%typeУточнения (на самом деле, не сильно влияет на анализ задачи):
,p_reason payment.status_change_reason%type)
is
v_status payment.status%type;
e_status_is_not_active exception;
begin
select status
into v_status
from payment
where payment_id = p_payment_id;
if v_status != c_active then
raise e_status_is_not_active;
end if;
update payment
set status = c_error
,status_change_reason = p_reason
where payment_id = p_payment_id;
exception
when e_status_is_not_active then
raise_application_error(c_err_code_status_is_not_active, 'Платеж не активный');
when no_data_found then
raise_application_error(c_err_code_payment_is_not_found, 'Платеж не найден');
end;
/
1️⃣ Константы определены в спецификации:
c_active constant payment.status%type := 0; — платеж активный
c_error constant payment.status%type := 2; — платеж в ошибке
c_err_code_status_is_not_active constant number(10) := -20101;
c_err_code_payment_is_not_found constant number(10) := -20102;
2️⃣ Определение таблицы можно посмотреть здесь.
3️⃣ Многосессионная среда, есть конкуренция за данные.
——-
Обсудить в нашем ламповом чатике.
Анализ, как всегда, в четверг 🎓
Для тех кто хочет подтянуться свои знания в PL/SQL, портал возможностей откроется с 13.01 - 8й поток курса Основы PL/SQL. Записывайтесь, пока еще, есть несколько мест 🔥
#задача
Oracle Developer
👍4
Пишем свой framework для Unit-тестирования на PL/SQL
Друзья всем привет!
Традиционно хотел вас порадовать перед новым годом.
Думал думал и родилась идея 💡
А что если взять прямо в онлайн в зум-конфе при вас написать небольшой фреймворк для организации Unit-тестирования? С нуля с объяснениями?
Заодно про принципы написания Unit-тестов рассказать?
Займет наша кодинг-сессия около часа.
Была бы интересная такая часовая туса в следующий понедельник (26.12) в 19:30(МСК)?
Если пост насобирает хотя бы 1️⃣0️⃣0️⃣ 👍 - проведу.
Обсудить в чатике.
Кстати, примерно тоже самое делают студенты у меня на курсе по PL/SQL. Кто еще думает - идти или нет. 100% идти 😁
——
UPD: Пост набрал 100 👍 - встрече быть 😉
Ссылку на Zoom скину в понедельник.
Oracle Developer
Друзья всем привет!
Традиционно хотел вас порадовать перед новым годом.
Думал думал и родилась идея 💡
А что если взять прямо в онлайн в зум-конфе при вас написать небольшой фреймворк для организации Unit-тестирования? С нуля с объяснениями?
Заодно про принципы написания Unit-тестов рассказать?
Займет наша кодинг-сессия около часа.
Была бы интересная такая часовая туса в следующий понедельник (26.12) в 19:30(МСК)?
Если пост насобирает хотя бы 1️⃣0️⃣0️⃣ 👍 - проведу.
Обсудить в чатике.
Кстати, примерно тоже самое делают студенты у меня на курсе по PL/SQL. Кто еще думает - идти или нет. 100% идти 😁
——
UPD: Пост набрал 100 👍 - встрече быть 😉
Ссылку на Zoom скину в понедельник.
Oracle Developer
👍88
Code-review процедуры "Перевод платежа в ошибку". Анализ
Задача: см пост вторника
Анализ
С первого взгляда, код вполне себе невинен. Отрабатываются основные ситуации:
1️⃣ статус платежа не подходящий для изменений (if v_status != c_active then).
2️⃣ когда платежа нет (when no_data_found then);
Однако в обработке каждой ситуации заложена архитектурная ошибка 🤷♂️
1️⃣ Проверка статуса
БД, в принципе, многосессионная среда. Это API для работы с отдельной сущностью. Подобные обертки в основном реализуются не в DWH, в котором работа с данными выполняется в чуть более свободном режиме.
Соответственно, могут возникать ситуации, когда с одной и той же сущностью работают более чем 1 сессия. Могут возникать race condition.
Если совсем на пальцах: между тем, когда мы считали статус платежа (select status) и тем, когда мы совершаем update payment, статус мог измениться. В многосессионной среде так и будет. Разруливаются подобные проблемы - блокировками.
Первый вариант: добавить for update с опциями, которые соответствуют бизнес-задаче.
2️⃣ Обработка отсутствия платежа.
В текущей реализации - это бомба замедленного действия. Как правильно заметили в комментариях, рано или поздно будет добавлен еще один select и общий NO_DATA_FOUND на весь блок будет отрабатывать не только отсутствие платежа, но и другие запросы.
Как надо бы сделать - обернуть select, возбудить в нем пользовательское исключение и уже в общем блоке его обработать.
—
Продолжая тему: лучше выделить функционал в отдельную процедуру типа try_lock_payment, в которой блокировать платеж, проверять его state и наличие. Т.к. api-процедур по работе с платежом более чем одна.
Подобный код пишут студенты на курсе Основы PL/SQL, в котором мы разбираем не только синтаксис и объекты, но и архитектурные принципы построения API. Старт - 12.01. Записывайтесь, пока еще, есть несколько мест 🔥
#решениезадачи #блокировки #исключения
Oracle Developer
Задача: см пост вторника
Анализ
С первого взгляда, код вполне себе невинен. Отрабатываются основные ситуации:
1️⃣ статус платежа не подходящий для изменений (if v_status != c_active then).
2️⃣ когда платежа нет (when no_data_found then);
Однако в обработке каждой ситуации заложена архитектурная ошибка 🤷♂️
1️⃣ Проверка статуса
БД, в принципе, многосессионная среда. Это API для работы с отдельной сущностью. Подобные обертки в основном реализуются не в DWH, в котором работа с данными выполняется в чуть более свободном режиме.
Соответственно, могут возникать ситуации, когда с одной и той же сущностью работают более чем 1 сессия. Могут возникать race condition.
Если совсем на пальцах: между тем, когда мы считали статус платежа (select status) и тем, когда мы совершаем update payment, статус мог измениться. В многосессионной среде так и будет. Разруливаются подобные проблемы - блокировками.
Первый вариант: добавить for update с опциями, которые соответствуют бизнес-задаче.
select status … for update с опциями;Второй вариант: проверять в update статус. Если строка заблокирована, то выполнение повиснет до освобождения блокировки.
2️⃣ Обработка отсутствия платежа.
В текущей реализации - это бомба замедленного действия. Как правильно заметили в комментариях, рано или поздно будет добавлен еще один select и общий NO_DATA_FOUND на весь блок будет отрабатывать не только отсутствие платежа, но и другие запросы.
Как надо бы сделать - обернуть select, возбудить в нем пользовательское исключение и уже в общем блоке его обработать.
beginИтог: код не прошел code review.
select …
exception
when no_data_found then
raise e_payment_not_found;
end;
—
Продолжая тему: лучше выделить функционал в отдельную процедуру типа try_lock_payment, в которой блокировать платеж, проверять его state и наличие. Т.к. api-процедур по работе с платежом более чем одна.
Подобный код пишут студенты на курсе Основы PL/SQL, в котором мы разбираем не только синтаксис и объекты, но и архитектурные принципы построения API. Старт - 12.01. Записывайтесь, пока еще, есть несколько мест 🔥
#решениезадачи #блокировки #исключения
Oracle Developer
👍9🔥1
Сегодня пятница и немного баянного юмора не помешает😉
Всем хороших выходных 🎊
Перетереть в чатике 💬
#юмор
Oracle Developer
Всем хороших выходных 🎊
Перетереть в чатике 💬
#юмор
Oracle Developer
🔥17👍3🎉2
Пишем свой framework для Unit-тестирования на PL/SQL
Друзья всем привет!
В прошлую среду анонсировал встречу или, как модно говорить, вебинар на тему “Пишем свой framework для Unit-тестирования на PL/SQL”. Исходя из количества лайков, понимаю, что тема интересна.
Что обсудим?
- что такое тестирование;
- что такое unit-тестирование;
- пример написания теста в общем;
- напишем свой простенький фреймворк для Unit-тестирования с нуля;
- чуть затронем фреймворк utPL/SQL;
- отвечу на вопросы, в том числе по курсу Основы PL/SQL.
Продолжительность: 1-1.5 часа как пойдет.
Начало вебинара: 19:30 МСК сегодня.
Подключиться можно будет по зум. Данные для подключения:
https://qiwi.zoom.us/j/99405211225?pwd=eU9YaFpEVjRaYUloTnYxZ2VxWWZXQT09
Идентификатор конференции: 994 0521 1225
Код доступа: 724031
Будет ли запись? Будет.
До встречи ✌🏻
#webinar #видео #подкаст
Oracle Developer
Друзья всем привет!
В прошлую среду анонсировал встречу или, как модно говорить, вебинар на тему “Пишем свой framework для Unit-тестирования на PL/SQL”. Исходя из количества лайков, понимаю, что тема интересна.
Что обсудим?
- что такое тестирование;
- что такое unit-тестирование;
- пример написания теста в общем;
- напишем свой простенький фреймворк для Unit-тестирования с нуля;
- чуть затронем фреймворк utPL/SQL;
- отвечу на вопросы, в том числе по курсу Основы PL/SQL.
Продолжительность: 1-1.5 часа как пойдет.
Начало вебинара: 19:30 МСК сегодня.
Подключиться можно будет по зум. Данные для подключения:
https://qiwi.zoom.us/j/99405211225?pwd=eU9YaFpEVjRaYUloTnYxZ2VxWWZXQT09
Идентификатор конференции: 994 0521 1225
Код доступа: 724031
Будет ли запись? Будет.
До встречи ✌🏻
#webinar #видео #подкаст
Oracle Developer
🔥21👍3