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

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

Отец-основатель: @denis_dbd Кивилёв Денис
Download Telegram
Задача: поиск количества вхождений определенного символа в строку.

Решение:
Было очень интересно посмотреть разнообразие вариантов.
Спасибо всем, кто потратил своё время. Респект 🔥

В целом, можно выделить три группы решений:

1️⃣ Использование стандартных функций работы со строками - length, replace, translate и др.

2️⃣ Различные комбинации использования функция работы с регулярными выражениями - regexp_count, regexp_replace и др.

3️⃣ Иерархические запросы - connect by.

Всем рекомендую залезть в комментарии под постом вторника и заценить замысловатые решения коллег 💡

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

#решениезадачи
Задача

Представьте, что каждый день к вам на сервер СУБД записывают в виде файлов - данные о клиентах.
Эти данные нужно прочитать, обогатить из других источников и, например, отправить email каждому клиенту.
🔸 строк/клиентов - 10М
🔸 начать отправку нужно как можно быстрей, желательно сразу после чтения первой строки из файла.
🔸 нельзя бахнуть сразу 10М писем одномоментно.

Как бы вы решили такую задачу? Что бы вы использовали?
Код писать не надо.
Если есть предположения как можно решить такую задачу пишите в комментариях.

P.S. В современном мире, это задача среднего слоя.

#задача
Pipelined(конвейерные) - функции

Друзья, всем привет!
У меня для вас свежее видео 🎥

В этот раз копнул в сторону pipelined или конвейерных PL/SQL-функций.
Что это такое? Когда использовать? Как можно ускорить выполнение ваших программ и сделать их более эффективными?
Ответы на эти вопросы смотрите в уроке.

Тема может показаться не простой. Поэтому я постарался сопроводить урок обилием примеров. Надеюсь, понравится.

Приятного просмотра - 15 минут.

#видео #plsql #функции #pipelined
Задача: чтение данных с диска и отправка email с соблюдением некоторых условий.

Пожалуй, не один из постов не вызывал столь бурную реакцию нашего мини-сообщества 🔥 Досталось и мне, за отсутствие точного ТЗ, и порочной концепции реализации функционала в БД.
"Чувствую, что автор просто совета просит)) " - это запомнилось особенно.
Ну и хорошо, юмор помогает жить 😉

Решение:
Как я уже много раз писал, любую задачу можно решить разными способами.
Особо прозорливые подписчики уже догадались, что задачка была не просто так задана. Да, одним из способов её решения являются как раз те самые конвейерные или pipelined-функции.
Кратко: по ходу обработки каждой строки по конвейеру мы можем выполнять различные манипуляции и отправлять "условный email", не ожидая загрузки всего объема входных данных из 10М. Подробное объяснение, смотрите в видео-уроке из прошлого поста.

Многообразие систем, решений и Legacy-кода огромно. Возможно, на очередном месте работы вы встретитесь именно с таким методом работы с данными и внешними системами.

Все больше занимаясь разработкой на среднем слое, я лично для себя понял, что такого рода задачи должны решаться именно в приложениях среднего слоя. Подход с жирной серверной логикой в БД, взаимодействие с внешним миром из БД - устаревает. Тема холиварная ))

Кстати, в сентябре будет запуск курса “Oracle PL/SQL.Основы”. Материал готов 🎓 Скоро будет анонс. Кому интересно - ничего не планируйте на сентябрь-ноябрь 😉

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

#решениезадачи #функции #pipelined
Друзья, всем привет!

Вчера занимался некоторыми изысканиями. Это меня привело на страничку с продажей лицензий СУБД Oracle.

Я всегда знал, что стоимость, мягко говоря, заоблачная. Но тут на глаза попались цифры 😳
Для калькуляции возьму стоимость процессорных лицензий. На мой взгляд, наиболее распространенный тип лицензирования.

Oracle 12 EE - 1 CPU лицензия - 4.2М рублей или 57К$ 🔥

В одной из организаций, которую я не буду называть, был сервер с 512 CPU.
Умножим: 512 * 4.2M = 2 150 400 000 руб = 28 000 000 $ в год.

Это один prod сервер. А есть другие БД и среды.

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

Оговорюсь, что расчет приблизительный. Есть скидки, коэффициенты и т.д., влияющие на конечную стоимость.

Продолжение ⬇️
С одной стороны, это не забота разработчика, из кровавого энтерпрайза, думать о лицензиях и стоимости. С другой стороны, было бы неплохо представлять, в какую "копейку" все это обходится.
Сразу становится понятно, почему стартапы/игроки поменьше выбирают бесплатный PostgreSQL. И я, даже, не рассматриваю вопрос об импортозамещении.

С учетом этого, прикиньте, кто может позволить себе купить лицензию на Oracle, и где вам придется работать 😉
Банки, крупные страховые, платежные системы, ритейловые сети, опсосы и т.п.
Написано ооочень много PL/SQL-кода, который нужно поддерживать и развивать. Без работы не останетесь 💰

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

На этой позитивной ноте, желаю всем хорошей трудовой недели! 👍
Долгое выполнение count в пустой таблице

На этот раз обойдемся без email’ов 😉
Эту задачу дают почти на каждом собеседовании на Senior Oracle DBD.
—--
Вы выполняете запрос:
select count(*) from some_table;

Спустя 5 минут вам возвращается результат. Он равен “0”.

В чем причина долгого выполнения?
—-

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

Ответ, как всегда, в четверг 🙋🏻‍♂️

#задача
Задача: долгое выполнение select count из пустой таблицы. см пост вторника.

Судя по опросу, этот вопрос задают не так уж и часто. Может мне везло 🙂

Решение:
Как может на пустой таблице долго выполняться запрос select count(*) ведь строк в ней нет? Собственно, чего считать то?

Такой эффект возможен, когда до этого таблица была большой и затем из нее были удалены все строки. Причем командой delete.

При подсчете count (full table scan) СУБД обязательно должна дойти до HWM (high water mark) сегмента = объекта.

Попытаюсь на примере наводнения объяснить:
1. Представьте дом до наводнения - это аналогия с пустой таблицей.
2. Во время наводнения уровень воды поднимается на сколько то метров от земли - это таблица заполненная данными.
3. После того как наводнение ушло, на доме осталась отметка максимального уровня воды как на картинке (HWM) - аналогия с удалением данных из таблицы командой delete.

Продолжение ⬇️
2
Команда delete не сбрасывает HWM до нуля. HWM остается на прежнем уровне.
Получается, что в таблице нет данных, но HWM находится "на 3х метрах от земли". И СУБД нужно дойти именно до неё при full table scan.
Относительно нашего примера, как будто в таблице все еще оооочень много строк.

Наверное, немного сумбурное объяснение получилось.

Далее, интервьюер обычно задает вопросы:
1. Как нужно удалять данные, чтобы избежать этой ситуации?
Для полного удаления данных используется DDL-команда truncate (усечение), она как раз сбрасывает hwm на “уровень земли”. При этом молниеносно удаляет данные.

2. Как можно сбросить HWM?
Способов несколько. Тот же truncate, если данных нет. Через пересоздание таблицы - CTAS. Через команды перестроения таблицы/управления местом - shrink, move.

В комментариях @ex_electric таки запостил ответ на задачку 😉

Порой, непросто объяснить сложную вещь в одном посте. Дайте, пожалуйста, обратную связь 📊

#решениезадачи #truncate #hwm
Друзья, всем привет!
Сорян за тишину, я тут приболел…

На следующей неделе, я представлю мой авторский онлайн курс “Oracle PL/SQL.Основы” 🔥

Что стоит за его подготовкой?
130 страниц сценария для видео, 184 слайда, 23 видео-лекции и 20 видео с практикой, тысячи строк кода для примеров и домашних заданий, более 30 часов лекций по этой теме для сотрудников, и наконец, 1.5 года личной жизни.

Зачем я написал эти цифры? Что бы вы понимали, что это не сырой полуфабрикат инфо цыган, который был сляпан вечерком в кальянной.
В него я вложил свою душу, опыт, знания и время.

Помните преподов в универе или на официальных оракловых курсах?

Тот подход совсем не по мне. Я старался сделать курс таким, чтобы любой человек смог въехать в тему разработки на PL/SQL. И мне, в отличии от тех преподов, не всё равно разберетесь вы или нет.

Моя основная задача: чтобы вы могли читать чужой и писать свой PL/SQL-код начального уровня. И это вполне достижимо! 👍

В понедельник будет более подробная информация 😉
Всем хороших выходных!
Друзья, всем привет!

Для меня сегодня очень радостный день. Я наконец-то, выношу на свет моё детище - курс “Oracle PL/SQL.Основы” 🔥

Это уникальная возможность стартануть в разработке на Oracle PL/SQL с опытным наставником.

Кому может быть полезен курс: QA-инженерам, разработчикам, аналитикам и всем, кто хочет начать программировать на PL/SQL.

При написании курса я ставил перед собой грандиозную задачу:
По окончанию курса студент должен уметь читать чужой и писать свой PL/SQL-код начального/среднего уровней.

В течении курса, вы шаг за шагом будете создавать API на PL/SQL для платежной системы KiviWallet. Здесь можно посмотреть пример. Думаете нереально? Еще как реально!

Вместе мы пройдем этот путь. Помимо закрытого ТГ-канала будет еще и еженедельный созвон в Zoom, где можно будет задавать вопросы.

Старт: 13 сентября
Окончание: 1 декабря

Подробности, программу, отзывы вы можете посмотреть на промо-странице курса.

Не стесняйтесь задавать вопросы в личку.

Всем хорошей недели!

#обучение #plsql
Задача:
Дана функция is_xxx_has. Функционал простой. Возвращает:
“true” - если в таблице xxx_tab есть заданное в параметре p_count_rows количество строк.
“false” - если строк не хватает.

create or replace function is_xxx_has(p_count_rows number) return boolean is
v_cnt number;
begin
select count(*) cnt into v_cnt
from xxx_tab;

if v_cnt >= p_count_rows then
return true;
else
return false;
end if;
end;
/

Можно ли как то её переписать? Сделать более оптимальной и лаконичной?

Если основная часть задачи показалось простой, то вот доп условие:
таблица xxx_tab - меняется редко.

Как всегда разбор решения в четерг.

#задача
Задача: смотрите пост вторника.

Решение:

1. Добавим в запрос условие rownum <= p_count_rows.
Сократит итоговый набор строк получаемых запросом с ”всех что есть в таблице”, до "меньше либо равно p_count_rows". Этого вполне хватит, чтобы понять, есть ли в таблице требуемое количество или его нет.

2. Сократим “портянку” с if. Вернем сразу результат условия. Такие мелкие “хитрости” я буду показывать в своем курсе “Oracle PL/SQL.Основы”

В итоге получится:
create or replace function is_xxx_has(p_count_rows number) return boolean is
v_cnt number;
begin
select count(*) cnt into v_cnt
from xxx_tab t
where rownum <= p_count_rows;

return v_cnt = p_count_rows;
end;
/

Дополнительное условие:
Данная функция, при условии не частого изменения таблицы xxx_tab, отличный кандидат на кэширование результата (result_cache). О подобного рода функциях я уже делал видос.

Если задача понравилась - 👍

#решениезадачи #plsql #result_cache
1👍1
This media is not supported in your browser
VIEW IN TELEGRAM
Задача:
Расскажите про код ниже, в том числе для чего он применяется, чего здесь не хватает, что бы вы изменили.

declare
v_date date;
v_query varchar2(1024);
begin
v_date := sysdate;

v_query := 'select *
from all_users
where created = ''' || v_date || '''';
end;

Любителям пожаловаться на “не точные/малоинформативные задания”,
Эта задача с одного из собеседований. Передаю в точности так же как она была задана мне когда-то 😉

Подробности, как всегда, в четверг 🎓

#задача
Друзья, всем привет!
Сегодня день знаний.
В некоторой степени, это тоже наш профессиональный праздник.

Работая в IT, нельзя в один прекрасный день сказать “всё, я теперь всё знаю. Больше не чему учиться”.
Для нас это постоянный процесс. Как только перестанешь учиться со временем знания “прокиснут”, станут не актуальными. Для профессионала это путь в никуда ☠️

Без преувеличения могу сказать, что после выпуска из университета не было периода, чтобы я чему-то не обучался. Я 16 лет работаю с Oracle и до сих пор есть моменты, которые для меня темный лес. А есть еще Java/Kotlin с кучей фреймворков и подходов. Не знать чего-то - это нормально. Не нормально, когда человек не развивается, застряв на своих предыдущих достижениях.

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

Всех с праздником! Не останавливайтесь 🎓
Задача: см пост вторника.

Решение:
Это больше задача “на поговорить”. Интервьювер хочет понять уровень ваших знаний в динамическом SQL.

Правило: если можно избежать использование динамического SQL, то лучше это сделать ☝🏻
В большинстве случаев, это реально.

Если же использовать динамический SQL все же приходится, то необходимо помнить про переменные подстановки (bind variables), задействовав эту возможность при написании кода.

Для данного примера:
1. Этот запрос легко выполнится без динамического SQL. Он тут не нужен.
2. Допустим, все же, применим динамику. Стоит изменить запрос - убрать конкатенацию, добавить в запрос переменную подстановки. Следующей строкой будет команда execute immediate в которой и надо будет передавать эту переменную. Результат выполнения нужно поместить в коллекцию.

Спасибо всем кто порассуждал под постом 😉

Как готовить динамический SQL, плюсы и минусы и т.п. я рассказываю на курсе “Oracle PL/SQL.Основы”. Если задачка вызвала вопросы, то самое время записаться на курс 🎓

#решениезадачи
1
Друзья, всем привет!

Информация для вновь прибывших в канал 😉

13 сентября начнется первый поток обучения на трехмесячном курсе “Oracle PL/SQL.Основы”.

Курс подойдет, если вы хотите начать читать чужие или создавать свои программы на PL/SQL.

Кратко о курсе
🔸 22 лекции с теорией около 10 минут;
🔸 20 видео с практикой около 5 минут;
🔸 практические задания, выполняя которые, вы к концу курса, получите один большой связный проект;
🔸 еженедельные встречи в Zoom;
🔸 закрытый Tg-канал с поддержкой и многое другое.

Вам понадобятся базовые знания SQL (select, DML) и хоть какая-то практика написания программ, пусть даже в университете на любом из языков.

Последний день, когда можно будет записаться - 10.09.

Не упустите свой шанс начать обучение в этом году.

Если есть сомнения? Пройдите первые три урока бесплатно и оцените качество курса.

Всем хорошей трудовой недели 👍

#обучение #plsql
Задача:
Опять вопрос на поговорить.
Расскажите про код ниже.

declare
...
begin
select count(id) into v_cnt
from my_data
where id_type = v_id_type;
exception
when no_data_found then
v_cnt := 0;
end;

Не удивляйтесь, это вопрос с реального собеседования.

#задача