DB developers channel
🎵 «Для меня деньги — бумага Для тебя — свобода На американскую мечту сегодня мода К этой мечте стремишься ты Работать роботом ради бумажной мечты» — Ленинград 🎸 📌 Задача из собеса в ЦБ (2020 год). В самом первом посту канала (в прикреплённом файлике) — 3…
📌 Разбор задачи из ЦБ (2020 год)
❗ Проблема: при выполнении возникает ошибка — нехватка табличного пространства TEMP.
Нужно оптимизировать запрос, чтобы он успешно выполнился.
💡 Решение
Основная причина переполнения TEMP — использование hash join, который строит большие промежуточные таблицы.
Чтобы этого избежать, можно подсказать оптимизатору использовать nested loop.
🔹 Оптимизированный запрос:
⚡ Идея решения:
USE_NL → переключаем соединение на nested loop, чтобы уменьшить нагрузку на TEMP.
Таким образом, запрос выполнится без переполнения TEMP.
UPDATES: под справедливой критикой коллег, запрос и пост изменил
⚠️ Хотите проверить скрипты, но нет базы под рукой - онлайн-песочница
💎 Поддержка канала⁉️
📝 Как Вы бы решили?👇
#️⃣ #RealInterviewTasks #SQL #Oracle #PLSQL
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):
📊 Для массива:
👉 результат будет:
👍 Пальцы вверх — продолжаем разбирать алгоритмы на PL/SQL.
👎 Пальцы вниз — значит, тема надоела.
⚠️ Хотите проверить скрипты, но нет базы под рукой - онлайн-песочница
💎 Поддержка канала⁉️
💬 Есть что сказать!? Не сдерживаете себя 👇
#️⃣ #SQL #Oracle #PLSQL
А единицами — себя» - А.С. Пушкин
📌 Разбор задачи: Перемещение нулей
🧩 Условие:
Дан массив чисел. Нужно переместить все нули в его конец, сохраняя относительный порядок ненулевых элементов.
⚙️ Алгоритм (кратко):
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
Изо всех комбинаций вместо „Вечность“ снова выходит „ЖОПА“.
Герда смотрит и говорит:
— Кай, да у тебя просто талант программиста!» – анекдот 😅
🏛 Продолжаем тему: Архитектура кода
Наконец, я собрался с силами и написал несколько букв «правильного» кода, демонстрирующего подход к архитектуре 🚀
📌 Сразу оговорюсь: код упрощён и создан для демонстрации.
Многие вещи в реальности делаются сложнее и эффективнее, но нельзя объять необъятное в одном посте.
Тут важна не конкретика, как именно манипулировать данными пользователей (сам код для этого не годится), а как универсальный архитектурный принцип 🧩
Я специально оставил несколько «жуков» 🐞 — внимательный глаз их заметит 👀
Для опытного разработчика хватит пары дней на разбор.
Новичку, думаю, и месяца может быть мало ⏳
Это Вам не курсы проходить и книжки читать!!!
Это результат коллективного труда, моя доля в нём не велика,
но я считаю, что такая архитектура оптимальна ⚡
🔹 Краткое описание:
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
🤡6👍1👎1