Oracle Data storage - блоки
Если строка переносится (или цепочка), ее ROWID не изменяется, чтобы отразить новый блок. Почему может быть полезно сохранить старый rowid, даже если он указывает на блок, где строка больше не находится?
1 ответ
Том Кайт ответил на этот вопрос несколько лет назад.
Смотрите: https://asktom.oracle.com/pls/apex/asktom.search?tag=row-migration
Он описывает причины в два раза:
Оракул хочет сохранить
rowid
постоянный во всех возможных случаях, чтобы он не изменился неожиданно и не сломал инструменты, которые на него полагаются.Иногда более эффективно тратить дополнительные операции ввода-вывода для отслеживания переадресации.
rowid
чем "обновить тонны данных индекса", когда происходит миграция.
Лично эта вторая причина никогда не имела смысла для меня. Не ясно, почему поддержание индекса потребует большего, чем удаление исходной записи (как это происходит в DELETE
заявление) и добавление новой записи (как это произошло бы в INSERT
) заявление. Да, это больше работы, но если вы не запросите данные достаточно, чтобы оправдать дополнительную работу, у вас не будет индекса в первую очередь.
Я верю первой причине, хотя. Oracle, кажется, пытается сохранить rowids
неизменным, когда это возможно. Я не знаю, есть ли фундаментальная причина для этого или просто потому, что некоторые из их инструментов (например, Oracle Forms) полагаются на это.