У меня есть вопрос о том, как Oracle выполняет действие INSERT
, и о причинах.
Я прочитал, что когда пользователь выполняет некоторые INSERT
- процессу Oracle нужно получить данные таблицы.
Я могу понять, что когда пользователь выполняет какой-то запрос на выборку, процесс экземпляра должен извлечь эти данные из памяти или с диска (если их нет в памяти).
Это также имеет смысл с операцией UPDATE
, поскольку старые данные должны быть обновлены, поэтому мы должны прочитать эти данные.
Но когда пользователь выполняет команду INSERT
- нужно ли ему читать какие-либо данные из памяти или файлов на диске?
Нужны ли эти данные для создания "before image"
из redo log files
?
Какие данные Oracle получит для команды вставки?
Я использую Oracle 11gR2.
Это текст из книги:
На следующем простом примере вставляемой строки показано, как
Oracle обрабатывает транзакции:
- Пользователь запрашивает соединение с сервером Oracle через 3-уровневый или n-уровневый веб-клиент с использованием Oracle Net Services.
- После проверки запроса сервер запускает новый выделенный серверный процесс для этого пользователя.
- Пользователь выполняет инструкцию для вставки новой строки в таблицу.
- Oracle проверяет привилегии пользователя, чтобы убедиться, что у пользователя есть необходимые права для выполнения вставки. Если пользовательская привилегия
информация не находится в кэше библиотеки, она должна быть
читать с диска в этот кеш.
- Если у пользователя есть необходимые привилегии, Oracle проверяет, похож ли ранее выполненный оператор SQL на тот, который был выполнен пользователем
только что выданный уже находится в общем пуле. Если есть, Oracle
выполняет эту версию SQL; в противном случае Oracle анализирует и выполняет
оператор SQL пользователя. Затем Oracle создает частную область SQL в
PGA сеанса пользователя.
- Oracle сначала проверяет, есть ли необходимые данные в буфере данных. Если нет, то серверный процесс читает необходимые
данные таблицы из файлов данных на диске.
- Oracle немедленно применяет блокировки на уровне строк, где это необходимо, чтобы другие процессы не пытались изменить те же данные
одновременно.
- Сервер записывает векторы изменений в буфер журнала повторов.
- Сервер изменяет данные таблицы (вставляет новую строку) в кэш буфера данных.
- Пользователь совершает транзакцию, делая вставку постоянной. Oracle снимает блокировку строк после выполнения коммита.
- Процесс записи журнала немедленно записывает измененные данные в буферах журнала повторов в оперативный файл журнала повторов.
- Серверный процесс отправляет клиентскому процессу сообщение, указывающее на успешное завершение операции INSERT.
в этом случае сообщение будет «COMMIT COMPLETE». (Если это не могло
успешно завершить запрос, он отправляет сообщение с указанием
сбой операции.)
- Изменения, внесенные в таблицу путем вставки, могут быть не сразу записаны на диск. Процесс записи базы данных записывает изменения в
пакетами, поэтому может пройти некоторое время, прежде чем вставленная информация
фактически постоянно записывается в файлы базы данных на диске.