Архитектура вставки Oracle - PullRequest
0 голосов
/ 24 июня 2018

У меня есть вопрос о том, как Oracle выполняет действие INSERT, и о причинах.

Я прочитал, что когда пользователь выполняет некоторые INSERT - процессу Oracle нужно получить данные таблицы.

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

Это также имеет смысл с операцией UPDATE, поскольку старые данные должны быть обновлены, поэтому мы должны прочитать эти данные.

Но когда пользователь выполняет команду INSERT - нужно ли ему читать какие-либо данные из памяти или файлов на диске?

Нужны ли эти данные для создания "before image" из redo log files?

Какие данные Oracle получит для команды вставки?

Я использую Oracle 11gR2.

Это текст из книги:

На следующем простом примере вставляемой строки показано, как Oracle обрабатывает транзакции:

  1. Пользователь запрашивает соединение с сервером Oracle через 3-уровневый или n-уровневый веб-клиент с использованием Oracle Net Services.
  2. После проверки запроса сервер запускает новый выделенный серверный процесс для этого пользователя.
  3. Пользователь выполняет инструкцию для вставки новой строки в таблицу.
  4. Oracle проверяет привилегии пользователя, чтобы убедиться, что у пользователя есть необходимые права для выполнения вставки. Если пользовательская привилегия информация не находится в кэше библиотеки, она должна быть читать с диска в этот кеш.
  5. Если у пользователя есть необходимые привилегии, Oracle проверяет, похож ли ранее выполненный оператор SQL на тот, который был выполнен пользователем только что выданный уже находится в общем пуле. Если есть, Oracle выполняет эту версию SQL; в противном случае Oracle анализирует и выполняет оператор SQL пользователя. Затем Oracle создает частную область SQL в PGA сеанса пользователя.
  6. Oracle сначала проверяет, есть ли необходимые данные в буфере данных. Если нет, то серверный процесс читает необходимые данные таблицы из файлов данных на диске.
  7. Oracle немедленно применяет блокировки на уровне строк, где это необходимо, чтобы другие процессы не пытались изменить те же данные одновременно.
  8. Сервер записывает векторы изменений в буфер журнала повторов.
  9. Сервер изменяет данные таблицы (вставляет новую строку) в кэш буфера данных.
  10. Пользователь совершает транзакцию, делая вставку постоянной. Oracle снимает блокировку строк после выполнения коммита.
  11. Процесс записи журнала немедленно записывает измененные данные в буферах журнала повторов в оперативный файл журнала повторов.
  12. Серверный процесс отправляет клиентскому процессу сообщение, указывающее на успешное завершение операции INSERT. в этом случае сообщение будет «COMMIT COMPLETE». (Если это не могло успешно завершить запрос, он отправляет сообщение с указанием сбой операции.)
  13. Изменения, внесенные в таблицу путем вставки, могут быть не сразу записаны на диск. Процесс записи базы данных записывает изменения в пакетами, поэтому может пройти некоторое время, прежде чем вставленная информация фактически постоянно записывается в файлы базы данных на диске.

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Да, Oracle вполне может потребоваться выполнить одну или несколько операций чтения с диска во время выполнения INSERT.Если для вставляемой таблицы определен первичный ключ (и для всех таблиц должен иметь первичный ключ), базе данных потребуется проверить, что значение столбца (столбцов) первичного ключа, предоставленного как часть вставленногоДанные не соответствуют значению столбцов первичного ключа для любой существующей строки.Возможно, это удастся сделать как часть логики вставки индекса, которая может считывать данные с диска, но если индекс первичного ключа не определен, ему придется выполнить полное сканирование таблицы, чтобы убедиться, что новые значения первичного ключа (ей)еще не существует в таблице.Точно так же, если в таблице есть какие-либо внешние ключи, значения, предоставленные для столбца (-ов) внешнего ключа в таблице, в которую нужно вставить, необходимо проверить по таблицам, на которые ссылаются внешние ключи.Это почти наверняка потребует чтения данных с диска.

0 голосов
/ 24 июня 2018

Я не думаю, что текст из книги очень ясен. Тем не менее, верно, что Oracle необходимо прочитать блоки данных с диска (если только они не находятся в памяти), чтобы вставить данные новой строки.

Чтобы вставить строку, данные должны быть записаны в отформатированный блок данных, принадлежащий таблице. В зависимости от различных факторов, Oracle может вставить новую строку в существующий блок данных - в этом случае, очевидно, ему нужно прочитать этот блок, если он еще не находится в кэше. Если Oracle определит, что необходимо расширить таблицу - добавить новые блоки - это будет сделано в рекурсивной транзакции; В какой-то момент вновь выделенные блоки должны быть считаны в память для завершения вставки.

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

...