Вопрос

Мое понимание состоит в том, что ROWID - это уникальное значение для каждой строки в результате, возвращаемой запросом.

Почему нам нужна эта ROWID? У Oracle уже есть рождение.

У кого-нибудь используется ROWID в запросе SQL?

Это было полезно?

Решение

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

Oracle Select ... Для синтаксиса обновления неявно использует ROWID, когда мы обновляем заблокированную строку, используя где ток. Также таблица исключений (ссылаясь на применении ограничений с исключениями в пункте), имеет столбец ROW_ID. Это позволяет нам быстро идентифицировать строки, которые нарушают наше ограничение.

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

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

редактировать

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

Другие советы

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

Предположим, у вас есть таблица без основных клавиш. Таким образом, эта таблица может иметь дубликаты строки. Как бы вы удалили дубликаты строки, но держите ровно один из такого рода?

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

Пример

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.

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

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

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

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

  • Обид уникальный идентификатор объекта.
  • Филино относительное количество данных в табличном пространстве.
  • Blockno Относительный номер блока в DataFile после файла файла.
  • Роуплем относительный рост в блоке.

Вы можете легко сломать ROWID в его составные поля (objid, fileno, blockno, rownum) с помощью функции rowiDtoChar () SQL или использования:

    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

Обратите внимание, что полевая плавание (или строка в вышеуказанном запросе) нет Такое же жжение, что и в SQL Pseudo Column Reponum, который вы используете в Select Query, который является просто динамически сгенерированным вращевом ряда в наборе результатов.

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

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

Больше информации:

Видеть: DBMS Notes на формате ROWID

Примечание:

Если у вас есть небольшое понимание файлов базы данных и блоков базы данных Oracle структуры, и знают некоторые программирование C, вы вполне легко можете сделать программу, которая отображает содержимое блока, заданного ROWID (8K, или любой размер блока используется в База данных, блокировка, которая начинается с файлопользователями + Blockno * Block_size. Блок содержит заголовок блока и после этого (при условии, что таблица не кластеризована) rowdir, который для каждой строки дает относительное смещение в блоке для каждой строки. Так, например, В положение 0 в ROWDIR является относительное смещение 0-го ряд в блоке, в положении 1 в ROWDIR относительное положение рядной строки 1-й и т. Д. Количество сама строк хранится где-то в заголовке блока. (См. Orale Documentation на блоке макета).

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top