Oracle ROWID как параметр функции / процедуры - PullRequest
3 голосов
/ 02 февраля 2011

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

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

Например:

FUNCTION get_row(p_rowid IN ROWID) RETURN TABLE%ROWTYPE IS...

1 Ответ

14 голосов
/ 02 февраля 2011

Из концептуального руководства :

Физические строки обеспечивают максимально быстрый доступ к строке данной таблицы. Они содержат физический адрес строки (вплоть до определенного блока) и позволяют извлекать строку в единый блок доступа. Oracle гарантирует, что пока строка существует, ее rowid не изменится.

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

  • Стол перестроен (ALTER TABLE MOVE ...)
  • Экспорт / Импорт очевидно
  • Таблица разделов с включенным перемещением строк

Первичный ключ идентифицирует строку логически , вы всегда найдете правильную строку, даже после удаления + вставки. ROWID идентифицирует строку физически и не является таким же постоянным, как первичный ключ.

Вы можете безопасно использовать ROWID в одном операторе SQL, поскольку Oracle гарантирует, что результат будет согласованным, например, для удаления дубликатов в таблице. Чтобы быть в безопасности, я бы посоветовал вам использовать ROWID accross операторов , когда у вас есть блокировка строки (SELECT ... FOR UPDATE).

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

...