ROWID - уникальный адрес/идентификатор строки
Самый быстрый доступ к строке. Никакие primary key/unique key не способы дать такой быстрый доступ.
Oracle достаточно получить физический адрес, чтобы адресоваться до нужной ячейки на диске.
Выглядит он примерно так: 000000FFFBBBBBBRRR
Соответственно, 0000000 - это номер объекта, FFF - это номер файла, BBBBBB - номер блока, RRR - номер строки.
Хранить и запоминать его в долговренное хранилище не стоит, т.к. он может измениться. Но вот использовать в наших алгоритмах очень даже можно.
———-
Приведу пример.
#теория #архитектура #rowid
Самый быстрый доступ к строке. Никакие primary key/unique key не способы дать такой быстрый доступ.
Oracle достаточно получить физический адрес, чтобы адресоваться до нужной ячейки на диске.
Выглядит он примерно так: 000000FFFBBBBBBRRR
Соответственно, 0000000 - это номер объекта, FFF - это номер файла, BBBBBB - номер блока, RRR - номер строки.
Хранить и запоминать его в долговренное хранилище не стоит, т.к. он может измениться. Но вот использовать в наших алгоритмах очень даже можно.
———-
Приведу пример.
declareНа первом шаге мы выбрали по каким-то критериям искомую строку, произвели какие-то манипуляции и хотим её изменить (например, статус). Используя rowid в условии where мы можем максимально быстро получить к ней доступ.
v_rowid rowid;
begin
select rowid from my_tab where ... for update;
... что-то делаем ...
update my_tab t
set t.поле = новое_значение
where t.rowid = v_rowid;
end;
/
#теория #архитектура #rowid
👍6
Пакет DBMS_ROWID
Пакет интересен с точки зрения получения информация о ROWID (#rowid):
номер блока, номер объекта, номер файла и другие части составляющие rowid.
А зачем нам вся эта информация?
Бывает, полезно понимать какому объекту принадлежит строка. Осуществить это можно с использованием функции
Например, секционированная таблица - это логический объект. Физически, данные хранятся в секциях/подсекциях. Запросом ниже, мы сможем понять к какому конкретно физическому объекту относится строка.
Это бывает необходимо при манипуляциях с секциями (очистка, обмен и т.п.).
Кстати, пока есть места в интенсиве по секционированию. Хотите знать больше? Записывайтесь.
#архитектура #rowid #dbms_rowid #секционирование
Пакет интересен с точки зрения получения информация о ROWID (#rowid):
номер блока, номер объекта, номер файла и другие части составляющие rowid.
А зачем нам вся эта информация?
Бывает, полезно понимать какому объекту принадлежит строка. Осуществить это можно с использованием функции
dbms_rowid.rowid_object.Например, секционированная таблица - это логический объект. Физически, данные хранятся в секциях/подсекциях. Запросом ниже, мы сможем понять к какому конкретно физическому объекту относится строка.
select s.*, t.subobject_name
from секционированная_табл s
join user_objects t on t.object_id = dbms_rowid.rowid_object(s.rowid);
Это бывает необходимо при манипуляциях с секциями (очистка, обмен и т.п.).
Кстати, пока есть места в интенсиве по секционированию. Хотите знать больше? Записывайтесь.
#архитектура #rowid #dbms_rowid #секционирование
Dbms_rowid интересный пакет, который может пригодится
Друзья, всем привет! 👋
С вами Денис.
В нашем канале разного уровня специалисты, этот пост зайдет Middle- и Senior-ребятам, но и Junior могут почерпнуть полезное.
Итак, каждый разработчик Oracle хотя бы раз сталкивался с ROWID — уникальным идентификатором строки в базе. Cодержит информацию о типе ROWID, идентификаторе объекта, относительном номере файла (relative file number), номере блока и номере строки в блоке.
Но как разобрать его на части или создать искусственно? Здесь на помощь приходит пакет DBMS_ROWID. Это не просто утилита, а мощный инструмент для глубокого анализа и манипуляций с данными на уровне блоков. В реальной жизни он спасает при отладке, миграциях или оптимизации хранения. Без него сложно понять, где именно лежит ваша запись в файлах данных.
Пакет DBMS_ROWID появился в Oracle для работы с ROWID из PL/SQL и SQL. Он позволяет извлекать информацию о блоках данных, файлах, объектах и даже создавать тестовые ROWID.
Ключевые функции пакета
DBMS_ROWID.ROWID_CREATE — создает ROWID для тестирования. Полезно, когда нужно симулировать запись без реальной БД.
DBMS_ROWID.ROWID_INFO — разбирает существующий ROWID на компоненты: тип, номер объекта, файл, блок и строку.
Другие полезные модули
ROWID_BLOCK_NUMBER возвращает номер блока,
ROWID_OBJECT — номер объекта,
ROWID_RELATIVE_FNO — относительный номер файла,
ROWID_ROW_NUMBER — номер строки в блоке,
ROWID_TO_ABSOLUTE_FNO — абсолютный номер файла,
ROWID_TO_EXTENDED и ROWID_TO_RESTRICTED для конвертации типов,
ROWID_TYPE для проверки типа,
ROWID_VERIFY для валидации.
Для чего использовать DBMS_ROWID
🔸 Диагностика инцидентов — быстро найти физическое местоположение проблемной строки по ROWID из alert.log/trace.
🔸 Анализ ошибок — определить повреждённый блок, файл и объект.
🔸 Контроль миграций/восстановлений — сверка фактического физического размещения строк между средами.
🔸 Анализ распределения данных — понять плотность блоков, выявить горячие сегменты или неэффективную кластеризацию.
🔸 Работа с партиционированием — определить точный партишен/subpartition, где находится строка.
🔸 Точечный доступ к данным — выборка строк по известным физическим координатам без сложных JOIN.
🔸 Служебное логирование — фиксировать ROWID проблемных записей для последующей диагностики.
🔸 Создание воспроизводимых тестов — моделирование ситуаций с повреждёнными или смещёнными строками.
Используете ли вы DBMS_ROWID в проектах? Поделитесь кейсами, когда он выручил, в комментариях 💬
Всем продуктивного дня и удачных запросов! 🌟
#oracle #dbms_rowid #rowid #plsql #oracledev #базыданных #sql
Канал Oracle Developer | Чатик 💬
Мини-курс Оптимизация: Быстрый старт 🚀
Анкета предзаписи на 7 поток "Оптимизация Oracle SQL"
📱 Facebook 📱 YouTube 📱 ВКонтакте 📱 LinkedIn 📱 Threads RUTUBE
Друзья, всем привет! 👋
С вами Денис.
В нашем канале разного уровня специалисты, этот пост зайдет Middle- и Senior-ребятам, но и Junior могут почерпнуть полезное.
Итак, каждый разработчик Oracle хотя бы раз сталкивался с ROWID — уникальным идентификатором строки в базе. Cодержит информацию о типе ROWID, идентификаторе объекта, относительном номере файла (relative file number), номере блока и номере строки в блоке.
Но как разобрать его на части или создать искусственно? Здесь на помощь приходит пакет DBMS_ROWID. Это не просто утилита, а мощный инструмент для глубокого анализа и манипуляций с данными на уровне блоков. В реальной жизни он спасает при отладке, миграциях или оптимизации хранения. Без него сложно понять, где именно лежит ваша запись в файлах данных.
Пакет DBMS_ROWID появился в Oracle для работы с ROWID из PL/SQL и SQL. Он позволяет извлекать информацию о блоках данных, файлах, объектах и даже создавать тестовые ROWID.
Ключевые функции пакета
DBMS_ROWID.ROWID_CREATE — создает ROWID для тестирования. Полезно, когда нужно симулировать запись без реальной БД.
DECLARE
v_rowid ROWID;
BEGIN
v_rowid := DBMS_ROWID.ROWID_CREATE(
rowid_type => sys.dbms_rowid.rowid_type_extended,
object_number => 12345,
relative_fno => 1,
block_number => 100,
row_number => 5
);
DBMS_OUTPUT.PUT_LINE(v_rowid);
END;
DBMS_ROWID.ROWID_INFO — разбирает существующий ROWID на компоненты: тип, номер объекта, файл, блок и строку.
DECLARE
v_rowid ROWID := 'AAAAAAAABAAAALaAAA';
v_type NUMBER;
v_object NUMBER;
v_file NUMBER;
v_block NUMBER;
v_row NUMBER;
BEGIN
DBMS_ROWID.ROWID_INFO(
rowid_in => v_rowid,
rowid_type => v_type,
object_number => v_object,
relative_fno => v_file,
block_number => v_block,
row_number => v_row
);
DBMS_OUTPUT.PUT_LINE('Объект: ' || v_object || ', Блок: ' || v_block);
END;
Другие полезные модули
ROWID_BLOCK_NUMBER возвращает номер блока,
ROWID_OBJECT — номер объекта,
ROWID_RELATIVE_FNO — относительный номер файла,
ROWID_ROW_NUMBER — номер строки в блоке,
ROWID_TO_ABSOLUTE_FNO — абсолютный номер файла,
ROWID_TO_EXTENDED и ROWID_TO_RESTRICTED для конвертации типов,
ROWID_TYPE для проверки типа,
ROWID_VERIFY для валидации.
Для чего использовать DBMS_ROWID
🔸 Диагностика инцидентов — быстро найти физическое местоположение проблемной строки по ROWID из alert.log/trace.
🔸 Анализ ошибок — определить повреждённый блок, файл и объект.
🔸 Контроль миграций/восстановлений — сверка фактического физического размещения строк между средами.
🔸 Анализ распределения данных — понять плотность блоков, выявить горячие сегменты или неэффективную кластеризацию.
🔸 Работа с партиционированием — определить точный партишен/subpartition, где находится строка.
🔸 Точечный доступ к данным — выборка строк по известным физическим координатам без сложных JOIN.
🔸 Служебное логирование — фиксировать ROWID проблемных записей для последующей диагностики.
🔸 Создание воспроизводимых тестов — моделирование ситуаций с повреждёнными или смещёнными строками.
Пост был навеян лекцией в субботу. Показывал ребятам свой код с Магнита, написанный в 17м году. И наткнулся на dbms_rowid.rowid_object(v_rowid). На скрине выше ⬆️
Используете ли вы DBMS_ROWID в проектах? Поделитесь кейсами, когда он выручил, в комментариях 💬
Всем продуктивного дня и удачных запросов! 🌟
#oracle #dbms_rowid #rowid #plsql #oracledev #базыданных #sql
Канал Oracle Developer | Чатик 💬
Мини-курс Оптимизация: Быстрый старт 🚀
Анкета предзаписи на 7 поток "Оптимизация Oracle SQL"
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤1