Подтвердить что ты не робот

ROWID (oracle) - любое использование для этого?

Я понимаю, что ROWID является уникальным значением для каждой строки в результате, возвращаемом запросом. зачем нам этот ROWID? (уже ROWNUM есть ORACLE). Кто-нибудь использовал ROWID в sql-запросе?

4b9b3361

Ответ 1

ROWID - физическое расположение строки. Следовательно, это самый быстрый способ найти строку, быстрее, чем поиск первичного ключа. Таким образом, это может быть полезно в некоторых типах транзакций, когда мы выбираем некоторые строки, сохраняем их ROWID, а затем позже используем ROWID в предложениях where для DML для этих же строк.

Синтаксис Oracle SELECT... FOR UPDATE неявно использует ROWID, когда мы обновляем заблокированную строку, используя WHERE CURRENT OF. Кроме того, таблица ИСКЛЮЧЕНИЙ (ссылка на применение ограничений с предложением EXCEPTIONS INTO) имеет столбец ROW_ID. Это позволяет нам быстро идентифицировать строки, которые нарушают наше ограничение.

Этот последний пример указывает на другое общее использование: когда мы пишем некоторый общий фрагмент кода и нуждаемся в механизме для хранения UID без проблем относительно типа данных, составных клавиш и т.д.

ROWNUM, с другой стороны, представляет собой псевдо-столбец, который тегирует строку в заданном наборе результатов. Это не имеет постоянного значения.

изменить

ROWID для данной записи может меняться в течение всего срока службы системы, например, путем перестройки таблицы. Также, если одна запись удалена, новая запись может быть предоставлена, что ROWID. Следовательно, ROWID не подходят для использования в качестве UID в долгосрочной перспективе. Но они достаточно хороши для использования в транзакции.

Ответ 2

Теперь я знаю пример для этого.

Предположим, что у вас есть таблица без первичных ключей. поэтому эта таблица может иметь повторяющиеся строки. Как бы вы удалили повторяющиеся строки, но сохранили один из них?

Oracle предоставляет ROWID как своего рода заменитель первичного ключа. Вы можете написать вложенный запрос с коррелированным типом [(группа по всем столбцам в строке и взять MIN (ROWID) в каждой группе во внутреннем запросе, для каждой группы удалите остальные строки в группе в внешнем вопросе)]

Пример

SQL> select * from employees;

       SSN NAME
---------- ----------
         1 helen
         1 helen
         2 helen
         2 peter
        10 sally
        11 null
        11 null
        12 null

8 rows selected.

SQL> delete from employees where ROWID NOT IN (select min(ROWID) from employees
group by ssn,name);

2 rows deleted.

SQL> select * from employees;

       SSN NAME
---------- ----------
         1 helen
         2 helen
         2 peter
        10 sally
        11 null
        12 null

6 rows selected.

Ответ 3

обратите внимание, что ROWID не сохраняется в цикле EXPORT и IMPORT базы данных. вы никогда не должны хранить rowid в своих таблицах как ключевое значение.

Ответ 4

ROWID уникально идентифицирует строку внутри таблицы. ROWNUM дает номер строки результата для конкретного запроса. Они очень разные и не взаимозаменяемы.

Также есть ROW_NUMBER, который является более современной версией ROWNUM и ведет себя несколько иначе. Проверьте эту статью, которая объясняет разницу.

Ответ 5

ROWID состоит из (но не обязательно в этом порядке, хотя часть ROWNUM является последней частью ROWID, насколько я помню):

  • ObjId Уникальный идентификатор объекта.
  • FILENO Относительное число файла данных в табличном пространстве.
  • БЛОКНО Относительный номер блока в файле данных после файлового менеджера.
  • ROWNUM Относительный rownum внутри блока.

Вы можете легко разбить ROWID на его составные поля (OBJID, FILENO, BLOCKNO, ROWNUM) с помощью SQL-функции ROWIDTOCHAR() или использовать:

    SQL> select DBMS_ROWID.ROWID_OBJECT(rowid) "OBJECT",
    2         DBMS_ROWID.ROWID_RELATIVE_FNO(rowid) "FILE",
    3         DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid) "BLOCK",
    4         DBMS_ROWID.ROWID_ROW_NUMBER(rowid) "ROW"
    5  from dual
    6  /
        OBJECT       FILE      BLOCK        ROW
    ---------- ---------- ---------- ----------
           258          1       2082          0

Обратите внимание, что поле ROWNUM (или ROW в вышеуказанном запросе) является not тем же ROWNUM, что и псевдо-столбец SQL ROWNUM, который вы используете в запросе SELECT, который представляет собой только динамически генерируемый роутинг в строке в результирующем наборе.

Обратите внимание, что из-за этой реализации строки, блоки, экстенты и сегменты не переносятся без нарушения ROWID, что делает недействительными индексы.

ROWID - это самый прямой путь доступа к блоку, в котором находится строка, и однозначно определяет эту строку, поскольку он кодирует уникальный файл и уникальный блок в этом файле и уникальную строку внутри этого блока.

Дополнительная информация:

См. Примечания к СУБД в формате ROWID

Примечание:

Если у вас есть небольшое представление о том, как файлы и блоки базы данных оракула структурированы, и знаете некоторые программирование на С, вы могли бы легко создать программу, которая отображает содержимое блока, заданное ROWID (8k или любой размер блока используется в базе данных, которая начинается с файлаheadersize + BLOCKNO * BLOCK_SIZE. Блок содержит заголовок блока и после этого (при условии, что таблица не кластеризована) rowdir, который для каждой строки дает относительное смещение внутри блока для каждой строки. Так, например, в позиции 0 внутри rowdir есть относительное смещение 0-й строки внутри блока, в позиции 1 внутри rowdir - относительное положение 1-й строки и т.д. Количество самих строк хранится где-то в заголовок блока (см. документацию орале на макете блока).

Имея немного знаний по программированию и просматривая документацию по файлам базы данных оракула, блоки для точной компоновки блоков, вы можете видеть, как строки хранятся на диске и даже восстанавливать все значения, хранящиеся в строке для каждого столбца, Каждая строка содержит метаданные для длины строки и количества столбцов, а для каждого столбца - указание для типа столбца, а также байта и значение therafter. Bytesize 0 означает, что данные столбца пусты (или: NULL).

Ответ 6

ROWID в основном позволяет вам иметь две строки с одинаковыми данными. В то время как вы обычно хотите, чтобы ваш первичный ключ был немного более значимым, чем RowID, это просто простой способ автоматического обеспечения уникальности между строками.