es
Feedback
Oracle Developer👨🏻‍💻

Oracle Developer👨🏻‍💻

Ir al canal en Telegram

🔝 канал о разработке в СУБД Oracle: SQL, PL/SQL, оптимизация, архитектура и другое... Backend-pro.ru - обучение по различным программам, связанных с backend-разработкой для ФЛ и ЮЛ. Основатель: @denis_dbd Кивилёв Денис Менеджер: @love_flowerrr Влада

Mostrar más
3 427
Suscriptores
Sin datos24 horas
-17 días
+530 días
Atraer Suscriptores
oct '26
octubre '26
+5
en 0 canales
septiembre '26
+37
en 0 canales
Get PRO
agosto '26
+52
en 0 canales
Get PRO
julio '26
+101
en 0 canales
Get PRO
junio '26
+55
en 0 canales
Get PRO
mayo '26
+41
en 0 canales
Get PRO
abril '26
+45
en 0 canales
Get PRO
marzo '26
+49
en 0 canales
Get PRO
febrero '26
+72
en 0 canales
Get PRO
enero '26
+32
en 2 canales
Get PRO
diciembre '25
+42
en 0 canales
Get PRO
noviembre '25
+84
en 0 canales
Get PRO
octubre '25
+50
en 0 canales
Get PRO
septiembre '25
+49
en 1 canales
Get PRO
agosto '25
+42
en 0 canales
Get PRO
julio '25
+42
en 0 canales
Get PRO
junio '25
+97
en 0 canales
Get PRO
mayo '25
+45
en 0 canales
Get PRO
abril '25
+48
en 0 canales
Get PRO
marzo '25
+46
en 0 canales
Get PRO
febrero '25
+77
en 1 canales
Get PRO
enero '25
+55
en 0 canales
Get PRO
diciembre '24
+48
en 0 canales
Get PRO
noviembre '24
+78
en 0 canales
Get PRO
octubre '24
+77
en 0 canales
Get PRO
septiembre '24
+70
en 1 canales
Get PRO
agosto '24
+58
en 1 canales
Get PRO
julio '24
+45
en 1 canales
Get PRO
junio '24
+63
en 0 canales
Get PRO
mayo '24
+59
en 0 canales
Get PRO
abril '24
+78
en 0 canales
Get PRO
marzo '24
+58
en 0 canales
Get PRO
febrero '24
+73
en 0 canales
Get PRO
enero '24
+72
en 0 canales
Get PRO
diciembre '23
+54
en 0 canales
Get PRO
noviembre '23
+67
en 0 canales
Get PRO
octubre '23
+90
en 0 canales
Get PRO
septiembre '23
+86
en 0 canales
Get PRO
agosto '23
+96
en 0 canales
Get PRO
julio '23
+68
en 0 canales
Get PRO
junio '23
+54
en 0 canales
Get PRO
mayo '23
+59
en 0 canales
Get PRO
abril '23
+76
en 0 canales
Get PRO
marzo '23
+59
en 0 canales
Get PRO
febrero '23
+68
en 0 canales
Get PRO
enero '23
+74
en 0 canales
Get PRO
diciembre '22
+66
en 0 canales
Get PRO
noviembre '22
+81
en 0 canales
Get PRO
octubre '22
+70
en 0 canales
Get PRO
septiembre '22
+72
en 0 canales
Get PRO
agosto '22
+74
en 0 canales
Get PRO
julio '22
+90
en 0 canales
Get PRO
junio '22
+83
en 0 canales
Get PRO
mayo '22
+73
en 0 canales
Get PRO
abril '22
+82
en 0 canales
Get PRO
marzo '22
+112
en 0 canales
Get PRO
febrero '22
+79
en 0 canales
Get PRO
enero '22
+96
en 0 canales
Get PRO
diciembre '21
+102
en 0 canales
Get PRO
noviembre '21
+140
en 0 canales
Get PRO
octubre '21
+73
en 0 canales
Get PRO
septiembre '21
+51
en 0 canales
Get PRO
agosto '21
+124
en 0 canales
Get PRO
julio '21
+144
en 0 canales
Get PRO
junio '21
+150
en 0 canales
Get PRO
mayo '21
+36
en 0 canales
Get PRO
abril '21
+48
en 0 canales
Get PRO
marzo '21
+159
en 0 canales
Get PRO
febrero '21
+51
en 0 canales
Get PRO
enero '21
+30
en 0 canales
Get PRO
diciembre '20
+1 173
en 0 canales
Fecha
Crecimiento de Suscriptores
Menciones
Canales
06 octubre+1
05 octubre+1
04 octubre+1
03 octubre+1
02 octubre+1
01 octubre0
Publicaciones del Canal
Один запрос - пять SQL_ID 🤷🏻‍♂️ Коллеги, всем привет! 👋 На связи Денис. Под постом про SQL_ID o1ga спросила: почему Oracle
Один запрос - пять SQL_ID 🤷🏻‍♂️ Коллеги, всем привет! 👋 На связи Денис. Под постом про SQL_ID o1ga спросила: почему Oracle не нормализует текст перед хэшированием? Обсуждали полдня, разбираю. Проверяем Берём запрос:
select count(*) from hr.employees where department_id = 50;
И пишем его пятью способами: капсом, с лишним пробелом, с комментарием и с другим литералом (60 вместо 50):
вариант                      sql_id         план
select count(*) ... = 50     0t6zm0g0cb5jf  2271004725
SELECT COUNT(*) ... = 50     9vq3m92g68wf1  2271004725
лишний пробел                cr05nbnshfn1a  2271004725
select /* report */ ...      ag1rnuz6z28yj  2271004725
тот же, но = 60              70cp0jaa5knrt  2271004725
Пять SQL_ID, пять курсоров, пять hard parse. А план один и тот же. Это к версии Александра: план совпал, но курсоры всё равно разные. Почему так По документации всё просто: текст хэшируется, хэш ищется в shared pool, потом текст сравнивается символ в символ, включая пробелы, регистр и комментарии. Почему не нормализуют (моё мнение): 🔹 Хэш от байтов - копейки, а делается он на каждый parse call. Нормализация - это уже разбор текста. 🔹 Регистр в литерале 'Abc' трогать нельзя, комментарий-хинт /*+ ... */ выкидывать тоже нельзя. Простой upper + trim сломал бы запросы. 🔹 Одинаковый текст - ещё не один курсор. В той же доке один SQL_ID в схемах OE и SH, а курсоры-потомки разные: таблицы-то разные. А нормализовать Oracle умеет В V$SQL есть EXACT_MATCHING_SIGNATURE - сигнатура по нормализованному тексту: без лишних пробелов и в верхнем регистре всё, кроме литералов. Есть ещё FORCE_MATCHING_SIGNATURE - та же сигнатура, но литералы заменены на bind. Смотрим на те же пять вариантов (одинаковая буква - одинаковая сигнатура):
вариант                  exact  force
select count(*) ... = 50   A      X
SELECT COUNT(*) ... = 50   A      X
лишний пробел              A      X
select /* report */ ...    B      Y
тот же, но = 60            C      X
Регистр и пробелы exact-сигнатура прощает, комментарий и литерал - нет. Force-сигнатура прощает ещё и литерал. Короче говоря, нормализация есть, просто не для SQL_ID. Статический SQL в PL/SQL Кирилл подсказал: PL/SQL приводит статический SQL к единому виду сам. Проверил:
declare l number; begin select count(*) into l from hr.employees where department_id = 50; end;
DECLARE L NUMBER; BEGIN SELECT   COUNT(*) INTO L FROM HR.EMPLOYEES   WHERE DEPARTMENT_ID = 50; END;
В V$SQL одна строка и 2 выполнения:
9vq3m92g68wf1  SELECT COUNT(*) FROM HR.EMPLOYEES WHERE DEPARTMENT_ID = 50
Верхний регистр, по одному пробелу, INTO выкинут, комментарии вырезаны, переменные стали :B1. Литерал 50 остался литералом. И SQL_ID совпал с моим запросом капсом из SQL*Plus 😄 Где это применить 🔹 Литералы против bind. 10 000 запросов where salary = <i> на 18c: с литералами 10 044 hard parse и 6.89 с, с bind - 1 hard parse и 0.36 с. 🔹 Один запрос в трёх стилях в коде приложения - три курсора в shared pool. Единый стиль SQL в команде - не только про красоту. 🔹 Ищете в V$SQL одинаковые запросы с разными литералами - группируйте по FORCE_MATCHING_SIGNATURE. 🔹 cursor_sharing = force заменяет литералы на :"SYS_B_0", но регистр не трогает: select и SELECT остались двумя SQL_ID. Проверял на 11g, 18c и 26ai: всё совпало. Итог SQL_ID - хэш от текста байт в байт, и это by design. Нормализацию за вас сделает PL/SQL, а в приложении - bind-переменные и единый стиль. А у вас в команде есть единый стиль SQL или каждый пишет как привык? Пишите в чатик 💬 С вами был Денис. Всем хорошего дня 🤝 #oracle #sql #sql_id #plsql #оптимизация #performance #фишки #Denis_Kivilev Канал Oracle Developer | Чатик 💬 Мини-курс Оптимизация: Быстрый старт 🚀 📱 YouTube 📱 ВКонтакте 📱 LinkedIn 📱Threads RUTUBE

2
Семья - самое главное ✅ Друзья всем привет! Сегодня будет воскресный щитпостинг 😊 Не нравится - не читай. В понедельник буду
Семья - самое главное ✅ Друзья всем привет! Сегодня будет воскресный щитпостинг 😊 Не нравится - не читай. В понедельник будут новые технические посты. Накопилось уйма дел, мыслей, всяких моментов, которые нужно решать, но мы рванули с семейством в 3х дневный отпуск. Я решил забить на всё и совершить детокс и побыть вместе с детками. Тем более, что еще в июле перед отъездом обещал старшей дочере свозить их в аквапарк. Пока был в поезде уж очень соскучился. Не могу уже без троих мелких засранцев. Тем более, время летит невероятно быстро. Так оглянуться не успеешь и все вырастут и скажут "пока, папа" и встречи будут редки, да что там встречи - просто телефонные звонки. Короче, пока мелкие надо быть вместе. Не хочу потом жалеть, что отдавался только работе, а с детьми проводил мало времени. Иногда представлю себе, что мне сейчас 80 лет и у меня есть возможность на один день оказаться в прошлом. И я оказываюсь именно в то время, когда детки маленькие сладенькие ❤️ Потом открываю глаза, а мне 43 и они пока маханькие и это реально. В общем, стоит бывать больше с семьей. Иногда стоит выныривать из рутины, суеты и повседневных дел и просто пожить здесь и сейчас, потому что потом это уже не повторить. А работа... она никуда не убежит. Всем хорошего дня! Написал спонтанно пост, пусть на 3+ из 5, но лучше такой опубликованный чем вообще никакой. #oracle #sql #plsql #dbms_sql_translator #оптимизация #фишки #Denis_Kivilev Канал Oracle Developer | Чатик 💬 Мини-курс Оптимизация: Быстрый старт 🚀 📱 YouTube 📱 ВКонтакте 📱 LinkedIn 📱Threads RUTUBE
550
3
Как Oracle считает SQL_ID: разбираем по символам 🔍 Коллеги, всем привет! 👋 На связи Денис. В курсе у меня была ссылка на ст
Как Oracle считает SQL_ID: разбираем по символам 🔍 Коллеги, всем привет! 👋 На связи Денис. В курсе у меня была ссылка на статью о том, как формируется SQL_ID. И она протухла - так бывает 🤷🏻‍♂️ Полез разбираться заново и по ходу пьесы наткнулся на DBMS_SQL_TRANSLATOR (прошлый пост). Обещал рассказать про его функцию SQL_ID - рассказываю. SQL_ID без выполнения запроса select dbms_sql_translator.sql_id('select * from dual') sql_id, dbms_sql_translator.sql_hash('select * from dual') hash_value from dual; SQL_ID HASH_VALUE ------------- ---------- a5ks9fhw2v9s1 942515969 Выполняем сам запрос - в V$SQL ровно те же a5ks9fhw2v9s1 и 942515969. Запрос никуда не отправляли, а SQL_ID уже знаем. Как он считается Oracle нигде это не документирует, но давно раскопано (Tanel Poder, Carlos Sierra). Tanel даже выложил скрипт, а я повторил руками: 1️⃣ MD5 от текста запроса + chr(0) в конце. 2️⃣ Берём последние 8 байт и переворачиваем каждые 4 байта. 3️⃣ Получилось 64-битное число - пишем его в base32 с алфавитом 0123456789abcdfghjkmnpqrstuvwxyz (без e, i, l, o). 4️⃣ HASH_VALUE - это младшие 32 бита того же числа. md5 = 02FC540D4440ADB2 7409CBA2 01A72D38 8 байт: 74 09 CB A2 | 01 A7 2D 38 переворот: A2CB0974 | 382DA701 base32(A2CB0974382DA701) = a5ks9fhw2v9s1 0x382DA701 = 942515969 = HASH_VALUE Что значит каждый символ 13 символов × 5 бит = 65 бит, а число 64-битное. Поэтому: a5ks9fhw2v9s1 символ 1 - 4 бита: только 0-9,a,b,c,d,f,g символы 2-6 - старшая половина символ 7 - 3 бита старшей + 2 бита HASH_VALUE символы 8-13 - 30 младших бит HASH_VALUE Проверил по 700+ курсорам в V$SQL: первый символ ни разу не вышел за 0-g. А HASH_VALUE по SQL_ID восстанавливается однозначно: dbms_utility.sqlid_to_sqlhash('a5ks9fhw2v9s1') = 942515969. Обратно - нет, половина бит теряется. Подводные камни 🔹 Текст байт в байт. SELECT * FROM dual - уже 3vjxpmhhzngu4. 🔹 Точка с запятой: select * from dual; даст 143pd7y3v0tyz. SQL*Plus её отрезает, функция - нет. 🔹 Текст берите из SQL_FULLTEXT, а не из SQL_TEXT: в SQL_TEXT переводы строк заменены пробелами, и SQL_ID не сойдётся. 🔹 Хозяйке на заметку: для пары курсоров вида BEGIN dbms_output.enable(NULL); END; SQL_ID не сходился. Оказалось, клиент прислал текст с лишним chr(0) в конце, которого в V$SQL не видно 😄 🔹 Под профилем трансляции в V$SQL свой SQL_ID у переведённого текста, а в USER_SQL_TRANSLATIONS.SQL_ID - у исходного. Проверял на Oracle 26ai (23.26), 18c и 11g: SQL_ID одного текста везде одинаковый. Только в 11g самой DBMS_SQL_TRANSLATOR нет (она с 12c), там - ORA-00904. Итог SQL_ID - это просто кусок MD5 от текста в base32, ничего магического. Знаешь текст - знаешь SQL_ID, хоть на тесте, хоть на проде. Кстати, как получить SQL_ID сразу после выполнения, я рассказывал в посте про set feedback on SQL_ID. А вы знали, что последние символы SQL_ID - это почти HASH_VALUE? Пишите в чатик 💬 С вами был Денис. Всем хорошей пятницы 🤝 #oracle #sql #sql_id #dbms_sql_translator #оптимизация #performance #фишки #Denis_Kivilev Канал Oracle Developer | Чатик 💬 Мини-курс Оптимизация: Быстрый старт 🚀 📱 YouTube 📱 ВКонтакте 📱 LinkedIn 📱Threads RUTUBE
635
4
DBMS_SQL_TRANSLATOR: подменяем запрос, не трогая код 🔍 Коллеги, всем привет! 👋 На связи Денис. Копался тут, как Oracle счит
DBMS_SQL_TRANSLATOR: подменяем запрос, не трогая код 🔍 Коллеги, всем привет! 👋 На связи Денис. Копался тут, как Oracle считает SQL_ID, и по ходу пьесы наткнулся на интересный пакет - DBMS_SQL_TRANSLATOR (есть с 12c). Кстати, в нём есть функция SQL_ID - про неё в следующем посте. А сам пакет умеет на лету подменять текст запроса: приложение шлёт одно, а база выполняет другое. Честно скажу: в своей практике я ни разу не видел, чтобы его использовали. Если кто-то применял на проде - поделитесь в комментах, очень интересно 🙏 По мне, это тёмная магия Oracle 🧙‍♂️ Знает про неё узкий круг специалистов, а используют её очень редко. Сделаете на ней что-то - коллеги просто не поймут, что происходит, и запутаются: в коде один запрос, а в базе выполняется другой. Как это работает Создаём профиль трансляции, регистрируем пару «исходный SQL -> SQL на замену» и включаем профиль в сессии. begin dbms_sql_translator.create_profile('APP_FIX'); -- переводить и обычный оракловый SQL, а не только "чужой" dbms_sql_translator.set_attribute('APP_FIX', dbms_sql_translator.attr_foreign_sql_syntax, dbms_sql_translator.attr_value_false); dbms_sql_translator.register_sql_translation('APP_FIX', 'select count(*) from orders where status = :b1', 'select /*+ full(o) */ count(*) from orders o where status = :b1'); end; / alter session set sql_translation_profile = APP_FIX; select count(*) from orders where status = :b1; Без профиля план был INDEX RANGE SCAN, с профилем - TABLE ACCESS FULL, DBMS_XPLAN показывает текст уже с хинтом. Проверил на Oracle 26ai (23.26) и 18c, ведёт себя одинаково. А если атрибут не ставить? По умолчанию FOREIGN_SQL_SYNTAX = TRUE, и запросы из SQL*Plus не переводятся. Нужен ещё alter session set events = '10601 trace name context forever, level 32', а для него - привилегия ALTER SESSION. Приложению профиль включают logon-триггером или через атрибут сервиса (DBMS_SERVICE). Подсмотрел в интернете, как его используют 🔹 Чинят тормозящий запрос вендорского софта без релиза: находят SQL_ID в shared pool, регистрируют замену, вешают logon-триггер (пошаговый гайд). А в Panorama скрипт подмены генерится по SQL_ID. 🔹 Миграция с Sybase и SQL Server: транслятор переводит чужой диалект в оракловый, приложение почти не трогают. Под это пакет изначально и делали. 🔹 Обходят неправильные результаты - подменяют запрос на исправленный (Kerry Osborne). 🔹 Фокусы на конференциях 😄 - один и тот же запрос «магически» становится быстрым, а на деле его тихо перенаправили на другую таблицу (Julian Dontcheff). Подводные камни 🔸 Текст должен совпасть один в один. Проверил: другой регистр, лишний пробел, перенос строки или бинд :b2 вместо :b1 - и подмены нет. 🔸 SQL внутри PL/SQL (и статический, и execute immediate) не переводится, только то, что шлёт клиент. 🔸 Права. Владельцу - CREATE SQL TRANSLATION PROFILE. Чтобы профиль работал у другого юзера: grant use on sql translation profile ему (иначе ORA-24252) и grant translate sql on user app владельцу (иначе ORA-01031). 🔸 Отключить подмену - enable_sql_translation(..., false). Процедуры DISABLE_SQL_TRANSLATION нет. 🔸 REGISTER_ERROR_TRANSLATION в SQL*Plus код ошибки не подменил - это для драйверов при миграции. Итог Чтобы просто подсунуть хинт, есть штатные SQL Patch и SQL Plan Baseline. А если надо переписать сам запрос, а код не ваш - DBMS_SQL_TRANSLATOR рабочий вариант. Но раз уж применили тёмную магию - обязательно документируйте и передавайте знание команде. Иначе через полгода никто не вспомнит, почему прод выполняет не тот запрос, что в коде, и кто-то потратит неделю на расследование 🕵️ А вы встречали его в бою? Пишите в чатик 💬 С вами был Денис. Всем предсказуемых запросов 🤝 #oracle #sql #plsql #dbms_sql_translator #оптимизация #фишки #Denis_Kivilev Канал Oracle Developer | Чатик 💬 Мини-курс Оптимизация: Быстрый старт 🚀 📱 YouTube 📱 ВКонтакте 📱 LinkedIn 📱Threads RUTUBE
683
5
Sin texto...
1
6
Mensaje de video
700
7
with function и pragma udf: обещали быстрее, проверяем 🔍 Коллеги, всем привет! 👋 На связи Денис. В посте про функции в SQL я вскользь написал: «С 12c: pragma udf или with function - дешевле переключение контекста». Юрий в комментах: «вот это интересно, примеров бы». Держите. С замером 😄 with function Функция объявляется прямо в запросе, без create: with function get_vat(p_sum number) return number is begin return round(p_sum * 0.2, 2); end; select salary, get_vat(salary) vat from employees / Когда удобно: разовый скрипт, нет прав на create, логика нужна только этому запросу. Александр в комментах поделился кейсом: через with function собирает трейс-файл из v$diag_trace_file_contents в CLOB. Прям в одном запросе, без объектов в схеме 👍🏻 Нюансы: 🔹 Если with function не в top-level select (вложенный запрос, insert/update/merge) - нужен хинт /*+ with_plsql */, иначе ORA-32034: unsupported use of WITH clause. Хинт не оптимизаторский, без него запрос просто не разберется. insert /*+ with_plsql */ into t_vat with function get_vat(p_sum number) return number is begin return round(p_sum * 0.2, 2); end; select salary, get_vat(salary) from employees / 🔹 В SQL*Plus/SQLcl запрос заканчивается /, а не ; - внутри же PL/SQL. 🔹 Имя из with перекрывает одноименную функцию схемы. pragma udf Хранимая функция с пометкой «меня вызывают из SQL»: create or replace function get_vat(p_sum number) return number is pragma udf; begin return round(p_sum * 0.2, 2); end; / В документации скромно: «might improve its performance». Might. Ну ок, проверяем. Замер sum(f(id)) по таблице на 1 млн строк, функция mod(p, 7) * 2, среднее из 5 прогонов, секунды. Docker на ноутбуке, так что смотрим на порядок, а не на сотые. вариант 26ai 18c обычная функция 4.83 2.11 pragma udf 1.10 1.53 with function 1.38 1.00 with function + udf 1.11 1.15 чистый SQL 0.59 0.42 Что видно: 🔹 pragma udf ускорила хранимую функцию: на 26ai в 4 раза, на 18c скромнее, в 1.4. И вывела ее на уровень with function. 🔹 udf внутри with function компилируется и работает, но выигрыша не дает. Тут Александр прав: «pragma udf не пашет с inline-функциями» - в смысле эффекта, не ошибки. 🔹 Цена udf: при вызове из PL/SQL функция чуть медленнее (цикл на 1 млн вызовов: 0.59 против 0.67 с на 26ai). Если функцию дергают в основном из PL/SQL - udf не нужна. 🔹 Чистый SQL быстрее лучшего варианта с функцией еще в 2 раза. Хозяйке на заметку 🤷🏻‍♂️ Итог Функция нужна в SQL и живет в схеме - ставьте pragma udf. Нужна одному запросу - with function. Можно без функции - пишите на SQL. А вы with function в проде используете или только в скриптах? Пишите в чатик 💬 С вами был Денис. Всем хорошей недели 🤝 #oracle #sql #plsql #оптимизация #performance #функции #фишки #Denis_Kivilev Канал Oracle Developer | Чатик 💬 Мини-курс Оптимизация: Быстрый старт 🚀 📱 YouTube 📱 ВКонтакте 📱 LinkedIn 📱Threads RUTUBE
759
8
Функция в SQL-запросе: можно, но есть нюансы 🔍 Коллеги, всем привет! 👋 На связи Денис. Можно ли вызвать свою PL/SQL-функцию
Функция в SQL-запросе: можно, но есть нюансы 🔍 Коллеги, всем привет! 👋 На связи Денис. Можно ли вызвать свою PL/SQL-функцию прямо в select? Можно. Но за этим «можно» прячется пачка ограничений и пара граблей по производительности. Давайте пройдёмся. Как это выглядит create or replace function get_vat(p_sum number) return number is begin return round(p_sum * 0.2, 2); end; / select id, amount, get_vat(amount) vat from orders where get_vat(amount) > 100; Функция может жить на уровне схемы или в пакете (тогда она должна быть в спецификации). Вызывать можно в select-листе, where, order by, group by, в values у insert и set у update. Ограничения 🔹 Из запроса (select) функция не может менять данные. Вставили insert внутрь - получите ORA-14551. 🔹 Никаких commit, rollback и DDL внутри - ORA-14552. 🔹 Если функция вызвана из insert/update/delete/merge, она не может читать или менять таблицу, которую этот оператор модифицирует - ORA-04091 (mutating table). 🔹 Параметры только IN. Типы параметров и результата - SQL-типы: никаких PL/SQL-записей и ассоциативных массивов. BOOLEAN в SQL появился только в 23ai. Да, ORA-14551 обходится через pragma autonomous_transaction. Но это костыль: отдельная транзакция на каждую строку. Хозяйке на заметку - так лучше не делать 🤷🏻‍♂️ Подводные камни 🔸 Переключение контекста SQL ↔️ PL/SQL на каждый вызов. На миллионе строк это уже заметно. 🔸 Количество вызовов не гарантировано. Oracle может вызвать функцию больше раз, чем строк в выборке. Не завязывайте логику на побочные эффекты. 🔸 Согласованность чтения. Если функция сама делает select, каждый такой запрос видит данные на момент своего вызова, а не на момент старта основного запроса. На долгом запросе можно получить «несогласованный» результат. Как ускорить -- кэширование скалярного подзапроса select id, (select get_vat(amount) from dual) vat from orders; 🔹 Скалярный подзапрос, как выше: Oracle кэширует результат для одинаковых входных значений, и функция вызывается реже. Как устроен этот кэш и почему на него нельзя слепо полагаться - тема для отдельного поста. Интересно? Ставьте 👍🏻 или пишите в комментах - напишу. 🔹 deterministic - подсказка, что для одних и тех же входных данных результат одинаковый. Нужна и для функционального индекса. 🔹 С 12c: pragma udf в функции или with function прямо в запросе - дешевле переключение контекста. 🔹 А лучше всего - если логику можно написать на чистом SQL, пишите на SQL. Итог Функции в SQL - нормальный инструмент. Но это не бесплатно и не безгранично. Прежде чем тащить функцию в запрос на миллионы строк, подумайте, нельзя ли обойтись без неё. А вы используете функции в запросах или бьёте за это по рукам на ревью? Пишите в чатик 💬 С вами был Денис. Всем быстрых запросов и без мутирующих таблиц 🤝 #oracle #sql #plsql #оптимизация #функции #фишки #Denis_Kivilev Канал Oracle Developer | Чатик 💬 Мини-курс Оптимизация: Быстрый старт 🚀 📱 YouTube 📱 ВКонтакте 📱 LinkedIn 📱Threads RUTUBE
956
9
DUAL: что под капотом у самой популярной таблицы Oracle Коллеги, всем привет! 👋 На связи Денис. Пожалуй, самая популярная та
DUAL: что под капотом у самой популярной таблицы Oracle Коллеги, всем привет! 👋 На связи Денис. Пожалуй, самая популярная таблица в мире Oracle. Каждый из нас писал select sysdate from dual сотни/тысячи раз. А вы когда-нибудь задумывались, что у неё под капотом? Давайте разберёмся. Что такое DUAL 🔹 Обычная таблица, владелец - SYS. Всем доступна через публичный синоним DUAL. 🔹 Одна колонка DUMMY типа VARCHAR2(1). 🔹 Одна строка со значением 'X'. Нужна она для одного: в Oracle SELECT без FROM был невозможен. А посчитать выражение, вызвать функцию или взять NEXTVAL из последовательности хочется. Вот и берём «таблицу-пустышку», где гарантированно одна строка. Кстати, почему DUAL, если строка одна? По известной байке, изначально в ней было две строки и её использовали, чтобы «удваивать» строки через декартово соединение. Потом строку оставили одну, а название прилипло 😄 Что происходит при выполнении Сравните два плана: explain plan for select sysdate from dual; -- FAST DUAL explain plan for select * from dual; -- TABLE ACCESS FULL | DUAL 🔸 Если колонку DUMMY не трогаем, оптимизатор (с 10g) использует операцию FAST DUAL: в таблицу вообще не ходит, логических чтений ноль. 🔸 Если выбираем * или DUMMY, Oracle честно читает таблицу полным сканом. Мелочь, но в цикле на миллион итераций уже не мелочь. Вывод простой: select * from dual без нужды не пишите. Oracle 23ai: DUAL больше не обязателен В 23ai FROM стал необязательным, наконец-то как в PostgreSQL: select sysdate; select 2 * 2; select my_seq.nextval; Старый вариант с from dual тоже работает, ничего переписывать не нужно. Но в новом коде можно смело писать короче. А вы уже пишете SELECT без FROM на 23ai или всё ещё сидите на 19c? Поделитесь в чатике 💬 С вами был Денис. Всем лёгких запросов и одной строки в DUAL 🤝 #oracle #sql #dual #oracle23ai #оптимизация #фишки #Denis_Kivilev Канал Oracle Developer | Чатик 💬 Мини-курс Оптимизация: Быстрый старт 🚀 📱 YouTube 📱 ВКонтакте 📱 LinkedIn 📱Threads RUTUBE
948
10
🤝 Преемственность потоков: до этой идеи мы дошли не сразу Коллеги, всем привет! 👋 На связи Денис. Интересная ситуация случи
🤝 Преемственность потоков: до этой идеи мы дошли не сразу Коллеги, всем привет! 👋 На связи Денис. Интересная ситуация случилась на 8м потоке курса по оптимизации. Мне написал Саша С., студент 7 потока, довольно активный участник, который и раньше что-то предлагал. И закинул идею: а что, если кто-то из 7 потока придет и поприветствует 8? Такая преемственность. Даже кандидатуру предложил. Я подумал: блин, а ведь классная идея. Как мы раньше не сообразили? Кстати, к слову сказать, это лишний раз показывает, что обратная связь нужна везде: в обучении, в управлении и так далее. С ее помощью можно улучшать свои процессы. Но философствовать на эту тему сейчас не буду. Так вот. Я попросил Олега, одного из лучших студентов 7 потока, прийти и сказать пару слов ребятам. Мне кажется, получилось довольно круто. Небольшой фрагмент можете посмотреть в видосе ⬆️ Мне на самом деле очень приятно, что в нашем сообществе есть люди, которые готовы помогать. Олег выделил свое время. Пусть это всего 5-10 минут, но прийти в пятницу вечером и сказать пару слов - это прям очень приятно. Что я для себя отметил 🔹 обратную связь от студентов стоит слушать, из нее рождаются хорошие идеи; 🔹 комьюнити - это люди, которые готовы помогать просто так, от души; 🔹 преемственность потоков, похоже, станет доброй традицией. Вот такой субботний щитпостинг получился, не обессудьте ) С вами был Денис. Всем позитивного настроя и хороших выходных 🤝 #обучение #комьюнити #обратная_связь #oracle #sql #оптимизация #Denis_Kivilev Канал Oracle Developer | Чатик 💬 Мини-курс Оптимизация: Быстрый старт 🚀 📱 YouTube 📱 ВКонтакте 📱 LinkedIn 📱Threads RUTUBE
1 142
11
Первая встреча уже сегодня 🔥 Коллеги, всем привет! 👋 Сегодня вечером стартует первая встреча потока по оптимизации Oracle S
Первая встреча уже сегодня 🔥 Коллеги, всем привет! 👋  Сегодня вечером стартует первая встреча потока по оптимизации Oracle SQL. Те, кто уже внутри, начинают прямо сейчас строить себе защиту от увольнения. А вы? Подумайте честно: что произойдет, когда прод ляжет из-за вашего неоптимального запроса? Это не страшилка и не теория. Я видел этот сценарий на реальных проектах - он разворачивается в командах каждую неделю. Медленный SQL - это не просто “страничка долго грузится”. Это таймауты, простой системы, потерянные деньги бизнеса. А когда бизнес теряет деньги, он быстро ищет виноватого. Находит… и  так же быстро прощается. Дальше начинаются собесы, где вас прямо гоняют по планам выполнения запросов. И если вы не можете объяснить, почему оптимизатор выбрал именно этот индекс или почему тут Full Table Scan вместо Index Range Scan - вы просто не проходите дальше. Вот и всё. И это не паранойя - это реальность рынка прямо сейчас. Что дают три месяца в потоке: 🔹 Читать планы выполнения - видеть проблему за 5 минут, а не гадать сутками. 🔹 Находить узкие места и устранять их до того, как они положат прод. 🔹 Работать с индексами правильно - включая случаи, когда они только вредят. 🔹 Знать типичные ошибки, которые убивают производительность на больших объемах. 🔹 Разбирать реальные кейсы с боевых проектов, а не академические примеры из учебников. Если вы всё еще откладываете, ответьте себе честно: что вы будете делать, когда следующий проблемный запрос окажется вашим? Лучше укреплять позицию заранее, чем учиться под давлением после инцидента. Залетайте к нам на обучение, записаться можно у моей помощницы Влады Всем стабильного прода и уверенности в своем коде! 🤝 #oracle #оптимизация_sql #базы_данных #обучение #производительность #собеседование #карьера_в_IT Канал Oracle Developer | Чатик 💬 Мини-курс Оптимизация: Быстрый старт 🚀 📱 YouTube 📱 ВКонтакте 📱 LinkedIn 📱Threads RUTUBE
1 000
12
Mensaje de video
969
13
“У меня на тесте всё летает!” или Главная иллюзия разработчика 🚀 Коллеги, всем привет! 👋 Знаете, что вы чаще всего можете у
“У меня на тесте всё летает!” или Главная иллюзия разработчика 🚀 Коллеги, всем привет! 👋  Знаете, что вы чаще всего можете услышать во время разбора инцидента по тормозящему запросу на продакшене? “Да у меня на тесте всё работает за 50 миллисекунд, я проверял!” Ну да, конечно работает. В тестовой базе 1000 строк, а на проде - 50 миллионов. На тесте один пользователь, а на проде - 500 одновременных сессий. И вот этот красивый запрос, который у вас “летал”, начинает разваливаться. Высокая конкуренция, ожидания => красный мониторинг => тикет в жире => ж.па в мыле. А дальше - классика жанра. Разработчик начинает всовывать dbms_output в код (это еще если повезет), добавлять индексы наугад и т.д. Может сработает? А может и хуже сделает, потому что оптимизатор Oracle всё равно выберет Full Table Scan. Обычная история. Проблема в одном: большинство разработчиков работают с базой вслепую. Они не видят, как Oracle на самом деле собирается выполнять их запрос. Они пишут код, надеются на лучшее и молятся, “авось пронесет”. Не пронесёт. 🔹 Разница между “кодером” и инженером, которого ценят, - в понимании, того что он делает. 🔹 Такой специалист заранее знает, где запрос споткнется на объемах прода. 🔹 Он не “гадает на индексах” - он управляет поведением базы осознанно. Послезавтра, 18 сентября, у нас будет уже первая онлайн встреча на 8м потоке по Оптимизации Oracle SQL. Мы будем учиться не угадывать, а понимать - что происходит внутри базы, почему запрос тормозит и как это исправить до того, как тим лид выклюет вам мозг. Еще есть время. Велком к нам, записаться можно у моей помощницы Влады. 👉 Написать Владе 👈 Всем хорошего дня 🤝 #oracle #оптимизация_sql #базы_данных #карьера_в_IT #performance #sql #plan_execution Канал Oracle Developer | Чатик 💬 Мини-курс Оптимизация: Быстрый старт 🚀 📱 YouTube 📱 ВКонтакте 📱 LinkedIn 📱Threads RUTUBE
1 031
14
Mensaje de video
928
15
Mensaje de video
1 119
16
Пробный период обучения, хорошая возможность погрузиться в процесс за 990 рублей 💻 Коллеги, всем привет! 👋 Сегодня стартова
Пробный период обучения, хорошая возможность погрузиться в процесс за 990 рублей  💻 Коллеги, всем привет! 👋 Сегодня стартовал подготовительный этап нашего 8-го потока  обучения Оптимизации Oracle SQL. Поэтому хочу рассказать про формат, который помогает принять взвешенное решение об обучении - пробный период. Это не демо-урок на час, а полноценное погружение в процесс, которое позволяет понять, подходит ли вам методика, темп и подача материала, прежде чем вкладывать деньги и время. Что дает пробный период? 🔹 Проверка на практике - вы сразу понимаете, насколько материал применим к вашим задачам. 🔹 Оценка формата и темпа - одним комфортно учиться интенсивно, другим нужно время на осмысление. Пробный период покажет, вписывается ли обучение в ваш график и ритм жизни. 🔹 Знакомство с преподавателями - в технических темах критически важно, чтобы человек говорил из реального опыта, а не пересказывал документацию. За пробный период это становится очевидно. 🔹 Минимальные риски - вместо того чтобы сразу платить полную стоимость курса (которая может быть весьма ощутимой), вы инвестируете символическую сумму и получаете честный срез того, что вас ждет дальше. Стоимость - 990 рублей. Сумма чисто символическая, идет на поддержку инфраструктуры (тестовые базы, окружения и прочее). Это реальная возможность погрузиться в процесс, поработать с материалом и принять осознанное решение.  ❕❕Ограничение - 10 мест      потому что формат предполагает обратную связь и работу с каждым участником, а не поток из сотен человек, где вы остаетесь один на один с записями. Обучаетесь с 14 по 28 сентября. Достаточно, что бы понять - ваше или нет. Хватит тормозить, пиши моей помощнице Владе, мест всего 10. 👉 Написать Владе Вместо традиционных пожеланий хорошего дня, фраза Джорджа оБернарда Шоу на подумать: “Он не упустил ни одной возможности упустить возможность”. #обучение #базы_данных #оптимизация #карьера_в_IT #производительность #SQL #развитие_в_IT Канал Oracle Developer | Чатик 💬 Мини-курс Оптимизация: Быстрый старт 🚀 📱 YouTube 📱 ВКонтакте 📱 LinkedIn 📱Threads RUTUBE
1 048
17
Размышления после поездки в Россию и ситуация в целом Коллеги, всем привет ) С вами Денис. И это субботне-воскресный щитпости
Размышления после поездки в Россию и ситуация в целом Коллеги, всем привет ) С вами Денис. И это субботне-воскресный щитпостинг. Кому не нравится - пролистываем. 21го июля я стартанул из Бразилии через Казахстан в РФ. В КЗ были кое-какие дела по легализации - рассчитывал на три дня, но в итоге протусил неделю. Потом был три недели в Мск, с кем-то удалось встретиться с кем-то нет. Москва удивила своей стабильностью (а шо с ней станет) и ценами. Об этом в видосе. После того как все необходимые дела были сделаны, поехали с женой и мелким детенышем в Новосибирск, навестить родственников и друзей. Дальше наши пути разошлись. Жена улетела обратно в Бразилию, ибо там оставались наши две девочки с няней. Кстати, за этот почти месяц поменяли двух нянь. Первая через три недели заявила, что она больше не может быть с нашими детьми (ага, а мы вот уже 7 лет мучаемся 😂). Пришлось срочно искать вторую. А я рванул в Ташкент. Один из местных банков пригласил к ним в команду в качестве консультанта. Цель: взглянуть на текущие процессы свежим взглядом и улучшить их. Переговоры мы вели с конца июня, процесс не быстрый, но смогли договориться. Вышел в офис впервые с 2020 года. 6 лет на удаленки 🤦🏻‍♂️ И вы знаете, мне понравилось. Т.е. ты целиком погружен в процесс, без отвлечение типа "Денис, помой попу мелкому" 😁 Я почувствовал давно забытое чувство общности, командности, живого общения, решения проблем на прямую. И знаете что? Я сейчас прям кайфую. Мне хочется идти на работу. Это вот когда ты приходишь с утра и херрррракс... уже пора домой идти. Как день прошел? Да хер знает. Просто пролетел, потому что было интересно, ты решал какие-то задачи, закрывал проблемы и т.п. И тебе это нравится. Ты вовлечен на все 100%. Помню когда только перешел в Магнит в 2016м, я реально первые пол-года считал буквально минуты и на работу шел как на каторгу, и прям ждал когда же наступит пятница и люто ненавидел понедельники. Собственно, нахожусь в Узбекистане до конца сентября. Все таки надеюсь, что у нас получится собрать оффлайн встречу с местными ребятами. Короче, посмотрим. 📹 В видосе рассказал про мои впечатления после 2х лет отсутствия в РФ, про цены, про покупательскую способность, про ташкентскую команду куда нанимают и как нанимают и др. Если есть чего прокоментить особенно цены и зарплаты - велком в чат 💬 Всем хорошего дня! #Denis_Kivilev #путешествие #узбекистан #россия #щитпостинг Канал Oracle Developer | Чатик 💬 Мини-курс Оптимизация: Быстрый старт 🚀 📱 YouTube 📱 ВКонтакте 📱 LinkedIn 📱Threads RUTUBE
944
18
Среда - маленькая пятница, а пятница - пятница, тут без комментариев 😎 Коллеги, всем привет! Сегодня пятница, а это значит м
Среда - маленькая пятница, а пятница - пятница, тут без комментариев 😎 Коллеги, всем привет! Сегодня пятница, а это значит можно немного расслабиться и отвлечься от всех проблем. Разбавляем нашу ленту юмором, ставьте реакции 😄👍 Всем хороших выходных! #юмор #пятница #выходные Канал Oracle Developer | Чатик 💬 Мини-курс Оптимизация: Быстрый старт 🚀 📱 YouTube 📱 ВКонтакте 📱 LinkedIn 📱Threads RUTUBE
929
19
Техсобес на зарубежке ⚙️ Друзья, всем привет! 👋 С вами Костя Андронов. В прошлом посте я рассказал, как искал работу вне Рос
Техсобес на зарубежке ⚙️ Друзья, всем привет! 👋 С вами Костя Андронов. В прошлом посте я рассказал, как искал работу вне России. Сегодня техническая сторона: что реально спрашивают на собеседованиях. Предложение пройти собес застало меня прям в поездке, пришлось проходить его прямо в гостинице. Времени на подготовку не было вообще. И прошёл. Почему? Потому что спрашивали то, с чем я работаю каждый день. К такому не готовятся за ночь: это либо есть в голове, либо нет. Собеседовался я параллельно в две компании. Ключевым для меня стало то, что в первой очень понравился собеседующий: полтора часа интервью пролетели незаметно, я бы ещё поговорил, но собес закончился. Это и стало одним из главных факторов, почему я потом принял оффер. Во второй компании собеседующий мне не понравился, да и я ему, видимо, тоже: он сразу сказал, что будет ещё один этап, но на него меня уже не позвали. (И такое бывает, это нормально, что мы проходим не все собеседования) Так что, недолго думая, я согласился на оффер из первой: он отвечает всем моим требованиям, и я не пожалел. 🧩 Что спрашивали Собеседование шло больше полутора часов. Крупными блоками: 🔹 транзакции и внутренняя механика БД; 🔹 большая секция по оптимизации: индексы, методы доступа, методы соединения, чтение планов выполнения; 🔹 практика: несколько сложных задач на SQL, по факту из реальной работы. ⚙️ Ядро техсобеса: оптимизация Основная часть технического собеседования крутится вокруг оптимизации. На senior-позицию её спрашивают всегда, это не «будет плюсом», а базовое требование. Бывает и написание PL/SQL-кода, но костяк всё равно оптимизация. Причём практика почти никогда не выглядит как учебная задача. Тебе дают таблицу или запрос и смотрят не на знание синтаксиса, а на то, как ты думаешь: как читаешь план, почему оптимизатор выбрал такой доступ, где узкое место. 📌 Почему без этого шансов почти нет Просто написать код или SQL-запрос сейчас, в век AI, уже не проблема: нужную конструкцию и синтаксис всегда подскажет искусственный интеллект. А вот понять, оптимально решение или нет может только человек на основе своих знаний и опыта. Тут ценится не знание синтаксиса, а практики, приёмы, архитектура: что отработает быстро, а что ляжет под нагрузкой. Типовые вопросы можно вызубрить, но на практической части это не спасает: сразу видно, работал ты с планами по-настоящему или нет. Если оптимизация в голове, ты спокойно проходишь собес хоть из гостиницы без подготовки. Если нет - сыпешься именно там, где решается оффер. Так что если метишь в сильную международную компанию, прокачка оптимизации не «когда-нибудь потом», а то, что напрямую конвертируется в оффер. 🎓 Куда за этим идти Как раз этому мы учим на курсе «Оптимизация Oracle SQL» - я там преподаю. Разбираем планы выполнения, методы доступа и соединения, статистику и реальные кейсы, в том числе, которые приносят наши студенты. Уже на следующей недели стартует 8й поток по Оптимизации. Записаться и задать вопросы можно в анкете предзаписи или напишите Владе. Буду всех рад видеть на наших занятиях и с удовольствием поделюсь своей экспертизой 🎓 А что на ваших собеседованиях спрашивали чаще? Делитесь в Чатике 💬 С вами был Костя Андронов. Хорошего дня и быстрых запросов! 🚀 Вставка от Дениса: Давай поставим Косте 🔥 за то что он поделился своей историей. Понятно, что он не хочет на паблик рассказывать сильно много подробностей. Но думаю, за какими-то конкретными вопросами вполне можно сходить к нему в личку. #карьера #собеседование #Konstantin_Andronov Канал Oracle Developer | Чатик 💬 Мини-курс Оптимизация: Быстрый старт 🚀 📱 YouTube 📱 ВКонтакте 📱 LinkedIn 📱Threads RUTUBE
995
20
Про реальную ситуацию и ответственность за себя и семью Коллеги, всем привет! С вами Денис. Сегодня не будет розовых соплей.
Про реальную ситуацию и ответственность за себя и семью Коллеги, всем привет! С вами Денис. Сегодня не будет розовых соплей. Не хочу никого пугать, но сейчас реально жестковато. И дело даже не в Оракле, а в целом в тенденции в ИТ-индустрии. Джуны на хер никому не нужны. Мидлы ещё пока нужны, но уже с натяжкой. Сейчас рынок сеньоров. Я уже неоднократно пытался донести, что сеньор - это не про выслугу лет (15-20 лет опыта можно засунуть далеко). А сеньор - тот, кто имеет экспертизу, может закрывать проблемы бизнеса, приносит пользу, шарит свою экспертизу, менторит, принимает решения, коммуницирует, не замыкается только в техническом стеке и одном слое, кто гибок. Одной из жопоболей при работе с Ораклом является что? Правильно - оптимизация. К счастью, Оракл всё ещё бажит, и оптимизатор всё ещё ошибается. А это значит, что в самый неподходящий момент может возникнуть проблема, которую мы с вами можем успешно преодолеть и заработать +1 в перформанс-ревью. Т.е. принести пользу бизнесу. При условии, что решить можешь. Если не можешь - давай до свидания. На хрена ты такой работничек-сеньор тут нужен? За забором с десяток ораклистов ждут получше, помоложе, продвинутей, которые знают Python, умеют в ИИ, system design и т.п. Это касалось «усидеть на месте», потому что это одна из стратегий, которая сейчас работает. Теперь про поиск работы - вторая стратегия. Я сейчас консультирую один из банков Узбекистана. И вчера у нас с техлидом состоялся разговор по поводу собесов. И знаете что? Банк готов платить хорошие деньги за специалиста. Только вот из тех кандидатов, которые приходили (я смотрел стату), оооочень маленький процент смогли пройти отбор. И как вы думаете, какие вопросы основные на эту позицию? 3..2..1. Оптимизация! Вот неожиданность, правда? Мы вместе посмотрели вопросы. Они не сложные, но они на понимание. Если у тебя нет фундаментальных знаний по оптимизации - шансов нет совсем. Если ты не можешь ответить на простые вопросы, как ты собираешься работать и решать проблемы? Техлид за тебя будет их решать? На хрена ты тогда такой работничек нужен? Вот такой интересный парадокс - вакансии в банки есть, зарплата хорошая, а вот кандидаты не могут ответить на простые вопросы. Кто тут мудак? Рынок? Банк? Оракл? Ответить можете сами. Для усиления эффекта привожу кусочек с одного из собесов на Оракл-разработчика. Посмотрите и честно для себя признайтесь: вы готовы соответствовать уровню? Сможете ответить? Без ээ, бээ, мэээ? Вы готовы побороться за вакансию, чтобы и дальше было на что платить ипотеку, кредит за китайца, оплачивать детям садик и кружки, и ездить в отпуск раз в год? Тогда начни уже херачить и вкладываться в себя. И начало этому в личке у Влады. На следующей недели стартует уже 8й поток по Оптимизации. Подумай и не прое... шанс в очередной раз что-то изменить в своей жизни. До конца года как раз успеешь. #oracle #sql #базы_данных #оптимизация_sql #разработка #аналитика #обучение #Denis_Kivilev Канал Oracle Developer | Чатик 💬 Мини-курс Оптимизация: Быстрый старт 🚀 📱 YouTube 📱 ВКонтакте 📱 LinkedIn 📱Threads RUTUBE
931