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

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

Отец-основатель: @denis_dbd Кивилёв Денис
Download Telegram
Все же, зачем нужна условная компиляция?

На днях прилетает вопрос от подписчика:
“Рассуждал с коллегой, чем условная компиляция отличается от заключения кода в простые if-else? Защиты тут нет, source в итоге можно смотреть, да и скорее всего сами пакеты. Просто что в памяти получается этого кода не будет, не захламлять лишней логикой?”

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

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

Рассмотрим простейший примера, показанные на рисунке. Процедура Proc1 отсутствует. flag = false.

1) Обычное условие - будет ошибка, т.к. компилятор доберется при компиляции до строки с Proc1, увидет, что её нет, и откажется компилировать код.

2) Условная компиляция - ошибки не будет, т.к. в код для компиляции вызов этой функции просто не попадет.

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

Всем хороших выходных! 👯‍♀️

#компиляция
Всем привет!
Это будет заключительный пост в этом году. Впереди предновогодняя суета и времени, для написания постов, не будет.

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

Подведу итоги с точки зрения канала. Он был создан 27-го февраля. Изначально, я думал о нем как источнике информации для своих студентов. Но вскоре понял, что темы могут быть полезны для более широкого круга специалистов.
В целом, цифра ~1200 подписчиков говорит мне, о том, что я был прав.

Конечно, формат коротких постов, а их ~200, не может охватить все темы и все тонкости, связанные с ними. Некоторые темы я освещаю на своем youtube-канале. Вышло уже 15 видео. Тем не менее, этого все равно недостаточно.

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

Спасибо за ваши сообщения со словами благодарности и поддержки. Для меня это очень важно 🔥

От себя хочу пожелать в новом году, осуществить задуманное, развиваться в профессиональном плане, делать, пусть маленькие, но шаги к осуществлению желаемого. Пусть следующий год будь проще. Спасибо, что остаетесь на канале 🤝

С наступающим новым годом! 🎄
Друзья, всем привет!
Это первый пост в этом году. Хочу немного рассказать о себе.
Может быть, кому-то будет интересно, что за чувак ведет канал 😄

Зовут меня Кивилёв Денис. Родом я из Новосибирска, окончил местный технический университет (НГТУ). Работал в разных компаниях - гос, коммерческие. Была коммерческая разработка и внутренняя продуктовая. Разные масштабы, разные классы систем. Начинал с версии 9i в 2005м. Много воды утекло...

По ходу трудовой деятельности сертифицировался на:
* Oracle PL/SQL Developer Certified Associate
* Oracle Database SQL Certified Expert
* Oracle Advanced PL/SQL Developer Certified Professional
* Oracle Certified Associate Java SE 8 Programmer
Не то чтобы без них нельзя жить или иметь хорошую работу. Для меня это было подведением промежуточных итогов. Кстати, говорят, западные компании очень любят такие вещи 😉

На текущий момент стараюсь развиваться в направление Java/Kotlin. Спасибо моей компании, которая дает это делать 👍

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

Я знаю ребят настоящих Оракловых фанатиков 🤖 Я не такой, имеются кое-какие белые пятна. Тем более, что Oracle настолько огромная область, что невозможно знать всё. Помните про принцип Парето - 80/20? Как раз этот случай.
Тем более, кроме работы есть еще много других интересных вещей. И нужно находить баланс.

По мере возможности и сил обещаю делиться знаниями и опытом.
Спасибо, что остаетесь на канале. Впереди много нового и интересного о разработке в СУБД Oracle!

P.S. На всякий случай, кинул ссылку на резюме. Если кому-то хочется погрузиться в детали моей трудовой биографии 👇
Друзья, привет!
Сегодня пост обратной связи 🤜🏻🤛🏻

Примерно раз в месяц, мне пишут различные HR-специалисты с просьбой разместить в канале вакансию, связанную с разработкой в СУБД Oracle.
Об условиях и качестве вакансии, известности конторы и т.п. говорить сложно, каждый сам решает, интересно это ему или нет.

Мне хочется спросить ваше мнение, стоит ли публиковать такие вакансии в канале? будет ли вам это интересно?
Секционирование/партиционирование таблиц. Введение

Всем привет!
Третье видео, за которое вы проголосовали 👍

Это вводный урок по секционированию таблиц. В нем я расскажу, что это такое, зачем оно нужно, какие виды бывают, разберу некоторые виды на примерах.
Тема достаточно большая, чтобы объять её в одном маленьком видосе.

Кстати, многие привыкли к термину “партиционирование”, однако, официальный русский перевод - “секционирование”. Ваше право, какой термин использовать. Я лично привык к “партиционированию” 😌

На праздниках обзавелся новым микрофоном, изменил оформление видосов.
Далеко до идеала, но потихоньку двигаюсь в этом направлении ⬆️

Приятного просмотра!

🎥 Смотреть видео - 11 мин

#видео #секционирование
Про рекламу на канале

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

Опять немного не про Оракл.
Этот канал, я веду один, продвигаю его по мере сил и возможностей.
Однако, для меня это не бесплатно 😏

В свою очередь, чтоб хоть как-то компенсировать затраты, я буду иногда размещать рекламу. Её будет мало.

Прошу отнестись с пониманием, прежде всего, это нужно для развития канала ↗️
Не донаты же собирать 😉

Например, сегодня будет пост. Купите ли вы по нему что-то или нет, это сугубо ваше дело, я ничего не прошу. Оплата идет за публикацию в канале.
Интенсив по Docker для разработчиков без «капитанской теории». Отправляемся 25 февраля.

На 2 дня оставим за бортом всё то, о чём и так все знают и погрузимся в глубины крутейшей практики. Вы запустите сайт в контейнере, соберёте несколько контейнеров в рабочую систему, запустите готовый pipeline в Gitlab, рассмотрите подводные камни использования stateful и Docker и научитесь обходить ограничения DockerHub. Помимо этого расскажем об особенностях использования контейнеров с ruby, php, python, go, java, c#, c++ и работе Docker в облаках.

Интересно? А ведь это ещё не всё! Почитать всю программу (там много вкусного) и посмотреть реальные примеры практических заданий можно на сайте.

Йо-хо-хо, морские волки! На абордаж!
Пакет dbms_application_info

В Oracle существует очень много встроенных пакетов с различным функционалом. Хочу рассказать вам, о довольно, полезном пакете dbms_application_info.

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

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

Установка значений дает некоторые плюсы:
1. Вы всегда безошибочно найдете в списке сессий ваши приложения/модули и будете иметь представление, что они делают в данный момент.
2. В трейс-файлы будут попадать эти установленные значения, что также удобно.
3. ДБА смогут безошибочно находить владельца определенной сессии.
4. Сразу, облегчается диагностика проблем.

В следующих постах остановлюсь подробней как использовать.

#пакеты #dbms_application_info
Использование dbms_application_info

Рассмотрим приложение относящееся к некой платежной системе.
1. Приложение называется - wallet-app.
2. Модуль, в котором была создана сессия, относится к проведению платежей - payment-processing.
3. Конкретное выполняющееся действие “приватный платеж p2p” - processing private payment.

Как установить эти значения?

Название приложения:
begin
dbms_application_info.set_client_info('wallet-app');
end;
Можно задать сразу после создания сессии.

Название модуля и действия:
begin
dbms_application_info.set_module('payment-processing', 'processing private payment');
end;

Вызываем с разными значениями походу выполнения.

Где посмотреть выставленные значения ?

В системном представлении:
select t.client_info, t.module, t.action, t.*
from v$session t;

или непосредственно в сессии:
dbms_application_info.read_module
dbms_application_info.read_client_info

#пакеты #dbms_application_info
Прогресс для длительных операций

Знакома ли вам такая ситуация? Запускается какой-то тяжелый процесс (джоб, скрипт) и вы понятия не имеете на каком этапе находится выполнение, сколько осталось до конца, сколько прошло? А очень хотелось бы 🔮

Это как скачивание файла. В браузере можно посмотреть прогресс.
Так бы взять и перенести это в Oracle 🧙🏻‍♀️

Однако, в Oracle уже есть встроенный механизм, которые это делает для тяжелых SQL-запросов.
Мы его можем переиспользовать под свои нужны - для отображения прогресса выполнения в PL/SQL-программах.

Используется для этого наш старый знакомый пакет dbms_application_info и процедура - set_session_longops.

Первый вызов инициализирует условный “прогресс бар”, последующие вызовы его инкрементируют.

Сам “прогресс бар” доступен в системном представлении - v$session_longops.

В четверг будет видео на эту тему со всеми подробностями и примерами. Не пропустите 🎥

#пакеты #dbms_application_info
Учебные схемы

На днях, смотрел репозиторий Oracle на github. Наткнулся на репу содержащую копию образцов схем Oracle Database, которые устанавливаются вместе с Oracle Database Enterprise Edition. Эти схемы используются в документации Oracle для демонстрации концепций языка SQL и других функций базы данных.

Схемы в репозитории:
- HR: Human Resources
- OE: Order Entry
- PM: Product Media
- IX: Information Exchange
- SH: Sales History
- BI: Business Intelligence

Не все DBD знают как вытаскивать данные с github-репозиториев.
Кратко, два способа:
1. Скачать архив с содержимым репы (на скрине).
2. Воспользоваться git-клиентом. Если он у вас уже стоит, значит вы уже знаете, что делать с репозиториями :)

Напомню, что в сервисе Oracle Live SQL можно легко накатить любую из схем на вашу временную схему. Видос по теме.

#hr #ссылки
Задача: Как получить записи с четными id?
Для примера, возьмем таблицу employees схемы HR.

select * from hr.employees t 
where … ?

Смотрите готовый SQL запрос в решении в посте в четверг 🎓

#sql #задача
Скрипты для DBA и не только

Всем привет!

Опять же, на прошлой недели копался в репозиториях на github. Случайно наткнулся на репу Tim Hall. Автора сайта https://oracle-base.com/, он же DBA, DBD, тренер и т.д. Известная личность в Oracle-сообществе. На его сайте, достаточно, много интересных статей.

Так вот, в репозитории у него сборка полезных скриптов как для DBA, так и для DBD. Рассортированы по версиям Oracle, с понятными названиями.
Вполне могут пригодиться в работе, особенно для Middle/Senior DBD. Лично для себя нашел кое-что интересное.

Добавляйте в закладки, вдруг пригодится 😉

#ссылки
Задача: Как получить записи с четными id?
Для примера, возьмем таблицу employees схемы HR.

Принцип решения:
Классическая задача. Нужно взять остаток от деления на два, если оно равно нулю, то это четное число.

Запрос:
select * 
from employees t
where mod(t.employee_id, 2) = 0;

В SQL-запросах такая задача встречается довольно редко, зато в PL/SQL очень часто. Формулировка только немного другая. Каждые N записей (например, 500) выполнять commit.

if mod(v_counter, 500) = 0 then
commit;
end if;

Надеюсь, вам понравилась задачка 😉

#sql #решениезадачи #mod
Обработка SQL-запроса

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

Обработка состоит из нескольких стадий (см рисунок):
- парсинг или разбор (parsing)
- оптимизация (optimization)
- генерация плана (row source generation)
- выполнение (execution).

В зависимости от запроса, база данных может опустить некоторые из стадий.
Если запрос не найден в общей области памяти (shared pool), т.е. ни разу не разбирался, то будет выполнен ресурсоемкий жесткий разбор (hard parse), иначе мягкий разбор (soft parse).

Стадии парсинга (parse):
- проверка синтаксиса (syntax check)
- семантическая проверка (semantic check)
- проверка на наличие такого же запроса в разделяемой области памяти (shared pool check).
- и некоторые другие проверки.

В следующих постах будут подробности о стадиях, в т.ч. парсинге.

#архитектура #оптимизация #parsing
1
Задача:
Два запроса. Результат выполнения один и тот же. Таблица одна и та же и т.д. Разница только в текстах.

1. select * from employees;
2. select * FROM employees;

Одинаковые ли запросы с точки зрения базы данных?
Объясните для себя почему вы выбрали именно этот вариант.

Как всегда, объяснение в четверг 😉

#задача
Parsing (Разбор)

Запрос разделяется на части и помещается в специальную структуру для работы с ним.

Далее происходит следующее:
1. Синтаксическая и семантическая проверки.
2. Проверка прав доступа к объектам.
3. Выделение места в Private SQL Area (приватная область в памяти сессии) под запрос.
4. Поиск в библиотечном кэше разделяемой области памяти (shared pool) такого запроса. Если запрос найден (library cache hit), то происходит его немедленное выполнение (soft parse). Если не найден (library cache miss), то происходит его обработка и помещение в shared pool (hard parse). Поиск происходит по sql_id.

sql_id - уникальное хэш-значение текста запроса (см. представление v$sql).

Синтаксический анализ не может отловить все ошибки (дублирование значения в PK и др). Эти ошибки возникнут только на этапе выполнения.

Поскольку, hard parse трудоемкая операция необходимо стараться снижать количество жестких разборов. Например, использовать связные переменные (bind variables).

#архитектура #оптимизация #parsing
Задача: Одинаковые ли запросы?

1. select * from employees;
2. select * FROM employees;

Решение задачи:
С точки зрения базы данных это разные запросы,т.к. Sql_id у них разный. Это легко проверить, выполнив сначала эти запросы, затем запросив инфу из системного представления v$sql. Тем не менее, планы (plan_hash_value) и нормализованное представление одинаковые (exact_matching_signature).

select t.sql_id
,t.plan_hash_value
,t.exact_matching_signature
,t.sql_text
,t.*
from v$sql t
where lower(t.sql_text) like 'select * from employees%'
order by t.sql_text;

Любое изменение в запросе (пробел, перевод строки, разница в регистрах и т.д.) порождает новую версию запроса в разделяемой памяти (shared pool).

exact_matching_signature - рассчитывается по нормализованному тексту SQL. Нормализация включает удаление пробелов, приведение к верхнему регистру всех не литеральных строк.

#решениезадачи #архитектура #оптимизация