DB developers channel
803 subscribers
2 photos
46 files
102 links
💡 Канал для разработчиков баз данных: Oracle, PostgreSQL
📌 Интересные задачи, фрагменты кода, лучшие практики, архитектура, оптимизация
🔄 Присоединяйся к сообществу — развивайся вместе с нами!
#SQL #Oracle #PostgreSQL #PL/SQL #PL/pgSQL #DB
Download Telegram
DB developers channel
🎵 «Для меня деньги — бумага Для тебя — свобода На американскую мечту сегодня мода К этой мечте стремишься ты Работать роботом ради бумажной мечты» — Ленинград 🎸 📌 Задача из собеса в ЦБ (2020 год). В самом первом посту канала (в прикреплённом файлике) — 3…
📌 Разбор задачи из ЦБ (2020 год)
select 
t1.ogrn,
t2.ds,
t2.de,
o.kod,
o.name,
o.ver
from T2
join T1 on t1.id = t2.id
left join T_okved o on o.id = t2.okved_id
where sysdate between t1.ds and t1.de
and sysdate between t2.ds and t2.de;

Проблема: при выполнении возникает ошибка — нехватка табличного пространства TEMP.
Нужно оптимизировать запрос, чтобы он успешно выполнился.

💡 Решение
Основная причина переполнения TEMP — использование hash join, который строит большие промежуточные таблицы.
Чтобы этого избежать, можно подсказать оптимизатору использовать nested loop.

🔹 Оптимизированный запрос:
SELECT  --+ LEADING(T1 T2 o) USE_NL(T2 o)
t1.OGRN,
t2.DS,
t2.DE,
o.KOD,
o.NAME,
o.VER
FROM T1
JOIN T2 on (t1.id = t2.id)
left join T_okved o on o.id = t2.okved_id
WHERE sysdate between t1.ds and t1.de
and sysdate between t2.ds and t2.de;

Идея решения:

USE_NL → переключаем соединение на nested loop, чтобы уменьшить нагрузку на TEMP.
Таким образом, запрос выполнится без переполнения TEMP.

UPDATES: под справедливой критикой коллег, запрос и пост изменил

⚠️ Хотите проверить скрипты, но нет базы под рукой - онлайн-песочница
💎 Поддержка канала⁉️

📝 Как Вы бы решили?👇
#️⃣ #RealInterviewTasks #SQL #Oracle #PLSQL
🤡5👍3👎1
«Мы почитаем всех нулями,
А единицами — себя» - А.С. Пушкин

📌 Разбор задачи: Перемещение нулей

🧩 Условие:
Дан массив чисел. Нужно переместить все нули в его конец, сохраняя относительный порядок ненулевых элементов.

⚙️ Алгоритм (кратко):
1️⃣ Создаём новый массив той же длины.
2️⃣ Ведём два указателя:
🔹 firstNotNullIndex — куда класть ненулевые элементы.
🔹 lastNullIndex — куда класть нули с конца.
3️⃣ Проходим по массиву:
👉 если элемент ненулевой — кладём его в начало.
👉 если элемент равен нулю — отправляем его в конец.

💻 Решение (PL/SQL):
DECLARE
TYPE set_tab IS TABLE OF NUMBER;
"set" set_tab := set_tab(0,1,0,0,2,3,4,0,0,5,6,7,8,0,9,0);

newSet set_tab := set_tab ();
firstNotNullIndex INTEGER := 1;
lastNullIndex INTEGER := "set".COUNT;
BEGIN
newSet.extend("set".COUNT);

FOR i IN 1.."set".COUNT LOOP
IF "set"(i) = 0 THEN
newSet(lastNullIndex) := 0;
lastNullIndex := lastNullIndex - 1;
ELSE
newSet(firstNotNullIndex) := "set"(i);
firstNotNullIndex := firstNotNullIndex + 1;
END IF;
END LOOP;

<<print_set>>
DECLARE
str VARCHAR2(100);
BEGIN
FOR i IN 1..newSet.COUNT LOOP
str := str || TO_CHAR(newSet(i));
END LOOP;
DBMS_OUTPUT.put_line(str);
END;
END;

📊 Для массива:
0,1,0,0,2,3,4,0,0,5,6,7,8,0,9,0

👉 результат будет:
1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0


👍 Пальцы вверх — продолжаем разбирать алгоритмы на PL/SQL.
👎 Пальцы вниз — значит, тема надоела.

⚠️ Хотите проверить скрипты, но нет базы под рукой - онлайн-песочница
💎 Поддержка канала⁉️

💬 Есть что сказать!? Не сдерживаете себя 👇
#️⃣ #SQL #Oracle #PLSQL
👍13🤡6👎1
«Сидит Кай, раскладывает льдинки.
Изо всех комбинаций вместо „Вечность“ снова выходит „ЖОПА“.
Герда смотрит и говорит:
— Кай, да у тебя просто талант программиста!» – анекдот 😅

🏛 Продолжаем тему: Архитектура кода

Наконец, я собрался с силами и написал несколько букв «правильного» кода, демонстрирующего подход к архитектуре 🚀

📌 Сразу оговорюсь: код упрощён и создан для демонстрации.
Многие вещи в реальности делаются сложнее и эффективнее, но нельзя объять необъятное в одном посте.
Тут важна не конкретика, как именно манипулировать данными пользователей (сам код для этого не годится), а как универсальный архитектурный принцип 🧩
Я специально оставил несколько «жуков» 🐞 — внимательный глаз их заметит 👀

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

Это результат коллективного труда, моя доля в нём не велика,
но я считаю, что такая архитектура оптимальна

🔹 Краткое описание:

1️⃣ Таблицы:
users — основные поля пользователей
users_live — расчётные поля

2️⃣ Пакеты для хранения констант:
GLOBAL_CONSTANTS — глобальные константы
USERS_CONSTANTS — константы для работы с пользователями

3️⃣ Пакеты для работы с одной строкой:
USERS_LIB — методы уровня таблицы users
USERS_LIVE_LIB — методы уровня таблицы users_live

4️⃣ Пакеты бизнес-уровня:
AUTH_LVL1_PROC — установка контекста
USERS_LVL1_PROC — операции над пользователями
USERS_LVL2_PROC — парсинг входящих данных (XML/JSON)

5️⃣ API-уровень:
APPLICATION_API — методы для вызова пользователем
APPLICATION_SRV — методы для джобов/сервисов без контекста

⚠️ Обратите внимание:
1.В коде нет операторов управления транзакциями. Он пассивен.
COMMIT или ROLLBACK выполняет вызывающая сторона 🔄
2. Такая архитектура может быть выполнена и на PostgreSQL.
Но в пакетном виде ORACLE, она выглядит намного симпатичнее.

Всё! Гештальт закрыт. Теперь можно и донаты «клянчить» без стыда 💸

👍 — если зашло
👎 — если нет

⚠️ Хотите проверить скрипты, но нет базы под рукой - онлайн-песочница
💎 Поддержка канала⁉️

А также пишите в комменты вопросы, радость, гнев и прочие чувства 🙌
#CodeArchitecture
👍6🤡6👎3🖕1