Использование ROWID в запросах
Интересует как я могу использовать ROWID в запросах? Я нашел, что он применяется для быстрого удаление дубликатов записей в таблице:
DELETE FROM your_table WHERE rowid not in (SELECT MIN(rowid) FROM your_table GROUP BY column1, column2, column3);
Подскажите, как еще можно использовать это свойство? Или это больше не практическое, а теорическое свойство для понимания устройства БД?
Отслеживать
51.6k 203 203 золотых знака 65 65 серебряных знаков 250 250 бронзовых знаков
задан 22 июл 2015 в 15:28
503 1 1 золотой знак 9 9 серебряных знаков 17 17 бронзовых знаков
По идее, использовать ROWID в голом виде это тыкать пальцем в БД, не зная, куда именно. Правильно использовать поля структуры таблицы для работы с БД, иначе можно поломать её целостность вплоть до необходимости поднимать из бэкапа и выплачивать отступные.
22 июл 2015 в 15:41
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
ROWID — это физический адрес строки, поэтому доступ к строке по ее ROWID является наиболее быстрым способом.
ROWID уникален для каждой строки, поэтому его можно использовать в качестве суррогатного первичного ключа в различных запросах. Oracle гарантирует, что пока строка существует ее ROWID не изменится.
Но, постоянно полагаться на ROWID в качестве первичного ключа опасно.
Во-первых, строка может перемещаться (delete+insert) в результате различных действий (импорт\экспорт, перемещение строки в секционированной таблице при изменении значения ее колонок входящих в ключ секционирования, перемещение таблицы (alter table move), сжатии таблицы (alter table shrink) и т.п.).
Во-вторых, после удаления строки ее ROWID может быть переприсвоен какой-либо новой строке.
Отслеживать
ответ дан 23 июл 2015 в 8:29
3,809 1 1 золотой знак 18 18 серебряных знаков 27 27 бронзовых знаков
ROWID — это псевдоколонка. Она имеет одноимённый тип данных, их не следует путать.
В SQL запросе эта псевдоколонка возвращает адрес записи, служащий для её локализации.
Основные применения значений псевдоколонки ROWID :
- Обеспечивают самый быстрый путь доступа к записи.
- Дают информацию о месте хранении записи (см. описание пакета DBMS_ROWID)
- Они уникальны для каждой записи в таблице (см. пример в вопросе).
Для чего эти значения не следует использовать:
You should not use ROWID as the primary key of a table.
Значения ROWID актуальны только в текущий момент времени, но нет гарантии их неизменности. Их не следует использовать для первичных ключей, или хранить в БД для каких то других целей.
Важное замечание об уникальности значений псевдоколонки ROWID :
Usually, a rowid value uniquely identifies a row in the database. However, rows in different tables that are stored together in the same cluster can have the same rowid.
Они уникальны для таблицы, но не для БД в целом.
Практическое применение в SQL запросе относительно не частое.
В PL/SQL коде напротив — повседневно. Например, чтобы избежать повторного поиска записи в последующих статических запросах (быстрый доступ к уже найденной записи).
Так для явного указания в запросе:
create table t1 (id integer primary key, memo varchar2 (96)); insert into t1 select rownum, 'memo '||rownum from xmlTable ('1 to 9'); declare type ridarr is table of rowid; r ridarr; cur sys_refcursor; begin open cur for select rowid from t1 where id in (3,6); fetch cur bulk collect into r; forall ix in indices of r update t1 set memo = memo||'*' where rowid = r(ix); end;
А так неявно в предикате CURRENT OF , который определяет текущую запись по ROWID :
declare m t1.memo%type; cursor cur is select memo from t1 where id in (3,6) for update; begin open cur; loop fetch cur into m; exit when cur%notfound; update t1 set memo = m||'#' where current of cur; end loop; end;
Что такое rowid в oracle
For each row in the database, the ROWID pseudocolumn returns the address of the row. Oracle Database rowid values contain information necessary to locate a row:
- The data object number of the object
- The data block in the datafile in which the row resides
- The position of the row in the data block (first row is 0)
- The datafile in which the row resides (first file is 1). The file number is relative to the tablespace.
Usually, a rowid value uniquely identifies a row in the database. However, rows in different tables that are stored together in the same cluster can have the same rowid.
Values of the ROWID pseudocolumn have the datatype ROWID or UROWID . Please refer to «ROWID Datatype » and «UROWID Datatype » for more information.
Rowid values have several important uses:
- They are the fastest way to access a single row.
- They can show you how the rows in a table are stored.
- They are unique identifiers for rows in a table.
You should not use ROWID as the primary key of a table. If you delete and reinsert a row with the Import and Export utilities, for example, then its rowid may change. If you delete a row, then Oracle may reassign its rowid to a new row inserted later.
Although you can use the ROWID pseudocolumn in the SELECT and WHERE clause of a query, these pseudocolumn values are not actually stored in the database. You cannot insert, update, or delete a value of the ROWID pseudocolumn.
Example
This statement selects the address of all rows that contain data for employees in department 20:
SELECT ROWID, last_name FROM employees WHERE department_id = 20;
Индексы ROWID в Oracle
Индексы ROWID — это объекты базы данных, обеспечивающие отображение всех значений столбца таблицы, а также идентификаторов ROWID всех строк таблицы, в которых содержатся значения столбца.
ROWID — это псевдостолбец, который является уникальным идентификатором строки в таблице и фактически описывает точное физическое расположение данной конкретной строки. На основе этой информации Oracle впоследствии может найти данные, связанные со строкой таблицы. При каждом перемещении, экспорте, импорте строки, а также при выполнении любых других операций, которые приводят к изменению ее местонахождения, изменяется ROWID строки, поскольку она занимает другое физическое положение. Для хранения данных ROWID требуется 80 бит (10 байт). Идентификаторы ROWID состоят из четырех компонентов: номера объекта (32 бита), относительного номера файла (10 бит), номера блока (22 бита) и номера строки (16 бит). Эти идентификаторы отображаются как 18-символьные последовательности, указывающие местонахождение данных в БД, причем каждый символ представлен в формате base-64, состоящем из символов A-Z, a-z, 0-9, + и /. Первые шесть символов – это номер объекта данных, следующие три – относительный номер файла, следующие шесть – номер блока, последние три – номер строки.
Пример:
SELECT fam, ROWID FROM student;
FAM ROWID
——————————————
ИВАНОВ AAAA3kAAGAAAAGsAAA
ПЕТРОВ AAAA3kAAGAAAAGsAAB
В базе данных Oracle индексы используются для разных целей: для обеспечения уникальности значений в базе данных, для повышения производительности поиска записей в таблице и др. Производительность повышается благодаря тому, что в критерии поиска данных в таблице включается ссылка на индексированный столбец или столбцы. В Oracle индексы можно создавать по любому столбцу таблицы, кроме столбцов типа LONG. Индексы проводят различие между приложениями, для которых скорость не важна, и интенсивно функционирующими приложениями, что особенно касается работы с большими таблицами. Однако, прежде чем принять решение о создании индекса, необходимо взвесить все «за» и «против» в отношении производительности системы. Производительность не повысится, если просто ввести индекс и забыть о нем.
Рекомендации по созданию индексов ROWID:
Хотя наибольшее повышение производительности достигается созданием индекса по столбцу, все значения которого уникальны, похожий результат можно получить и для столбцов, содержащих одинаковые значения или NULL-значения. Для создания индекса совсем не обязательно, чтобы значения столбца были уникальны. Приведем ряд рекомендаций, обеспечивающих нужное повышение производительности при использовании стандартного индекса, а также рассмотрим вопросы, связанные с балансом между производительностью и расходованием дискового пространства при создании индекса.
Использование индексов для поиска информации в таблицах может дать значительное повышение производительности по сравнению с просмотром таблиц, столбцы которых неиндексированы. Однако выбрать правильный индекс совсем непросто. Конечно, для индексирования с помощью индекса В-дерева предпочтителен столбец, все значения которого уникальны, но и столбец, не отвечающий этим требованиям,— неплохой кандидат, если только одинаковые значения содержатся примерно в 10% его строк и никак не более. Столбцы-«переключатели», или «флаги», например те в которых хранятся сведения о поле человека, для индексов В-дерева не годятся Не подходят и те столбцы, которые используются для хранения небольшого числа «достоверных значений», а также хранящие какие-то признаки, например «достоверность» или «недостоверность», «активность» или «неактивность», «да» или «нет» и т. д, и т. п. Наконец, индексы с обратными ключами применяются, как правило, там, где установлен и функционирует Oracle Parallel Server и нужно до максимума повысить уровень параллельности в базе данных.
ROWID Pseudocolumn
For each row in the database, the ROWID pseudocolumn returns the address of the row. Oracle Database rowid values contain information necessary to locate a row:
- The data object number of the object
- The data block in the datafile in which the row resides
- The position of the row in the data block (first row is 0)
- The datafile in which the row resides (first file is 1). The file number is relative to the tablespace.
Usually, a rowid value uniquely identifies a row in the database. However, rows in different tables that are stored together in the same cluster can have the same rowid.
Values of the ROWID pseudocolumn have the datatype ROWID or UROWID . Please refer to «ROWID Datatype» and «UROWID Datatype» for more information.
Rowid values have several important uses:
- They are the fastest way to access a single row.
- They can show you how the rows in a table are stored.
- They are unique identifiers for rows in a table.
You should not use ROWID as the primary key of a table. If you delete and reinsert a row with the Import and Export utilities, for example, then its rowid may change. If you delete a row, then Oracle may reassign its rowid to a new row inserted later.
Although you can use the ROWID pseudocolumn in the SELECT and WHERE clause of a query, these pseudocolumn values are not actually stored in the database. You cannot insert, update, or delete a value of the ROWID pseudocolumn.
Example This statement selects the address of all rows that contain data for employees in department 20:
SELECT ROWID, last_name FROM employees WHERE department_id = 20;