powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Внутренняя работа Oracle при выполнении оператора Insert
7 сообщений из 7, страница 1 из 1
Внутренняя работа Oracle при выполнении оператора Insert
    #40102500
feagor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Хотелось бы получить максимально полное и при этом понятное представление о том какие серверные процессы взаимодействуют друг с другом при выполнении insertа одной записи с первичным ключом.
В особенности хотелось бы детально понять роль процессов LGWR,DBWR а так же того, кто и когда пишет Undo, в какой момент могут появляться ожидания типа enq tx index contention
...
Рейтинг: 0 / 0
Внутренняя работа Oracle при выполнении оператора Insert
    #40102514
igaraev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
feagor,

У меня есть книга и там много механизмов описаны.

Ядро Oracle
Внутреннее устройство
для администраторов
и разработчиков
баз данных.

Могу вам скинуть на почту.
...
Рейтинг: 0 / 0
Внутренняя работа Oracle при выполнении оператора Insert
    #40102523
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читайте Database Concepts
Oracle Instance Architecture
...
Рейтинг: 0 / 0
Внутренняя работа Oracle при выполнении оператора Insert
    #40103159
feagor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SQL*Plus,
Нахапал с разных источников.
Получилось примерно вот такое. Не уверен в порядке, в котором информация записывается в UNDO и кто вообще пишет её в UNDO. Вроде отдельных процессов не видел, поэтому предполагаю, что сама сессия пишет туда данные.
Просьба подсказать какие-то косяки. Плюс прошу дать дополнения, комментарии. Плюс хотелось бы расширить этот пример и описать что происходит, когда вставка идёт вместе с первичным ключом

1. Пользователь запрашивает соединение с сервером Oracle через Oracle Net Services .
2. Пока происходит авторизация и валидация запроса, сервер открывает выделенный серверный процесс для пользователя( Сессия ).
3. Пользователь выполняет Insert новой записи в таблицу.
4. В сессии Oracle проверяет права пользователя на возможность вставки. Если информации о правах пользователя еще нет в library cache(SGA) , она будет зачитана с диска в этот кеш.
5. В сессии Если у пользователя есть необходимые права, то Oracle проверяет, есть ли выполняемый запрос в shared poole(SGA) . Если есть, Oracle выполняет эту версию SQL; Другими словами Oracle парсит и выполняет SQL запрос пользователя. Затем Oracle создает частную область SQL в PGA для сессии.
6. В сессии Oracle проверяет есть ли блоки данных, в которые будет происходить запись в buffer cache(SGA) . Если блоков нет, то он зачитывает пустые блоки из соответствующего файла и пишет их в buffer cache(SGA) . Так же происходит запись
7. В сессии Oracle так же скопирует адреса фактических блоков данных файлов в блоки UNDO/ ROLLBACK .
8. В сессии Oracle немедленно выставляет блокировки на уровне строк, где это необходимо, чтобы предотвратить попытки других процессов одновременно изменить одни и те же данные.
9. В сессии Oracle запишет изменения в redo log buffer(SGA) . Процесс LGWR после этого записывает данные из буфера в ONLINE REDO LOG FILES .
10. В сессии Oracle запишет изменения (inserts новой строки) в buffer cache(SGA) .
11. В сессии пользователь выполняет commit транзакции, делая вставку постоянной. После чего процесс снимает выставленные блокировки строк.
12. Вставка, сделанная сессией может быть записана на диск не сразу. Процесс DBWR записывает изменения пакетами, поэтому может пройти некоторое время, прежде чем вставленная информация будет фактически и навсегда записана в файлы базы данных на диске.
...
Рейтинг: 0 / 0
Внутренняя работа Oracle при выполнении оператора Insert
    #40103181
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
От конкретной версии oracle может зависеть.
По шагам у тебя порядок напутан и частично смешан, частично не раскрыт.
Для старых версий (к 11-й ещё применимо было) погугли Джонатан Льюис "Ядро Oracle" - см. главу 2 для начала и в целом читай всю книжку.

По твоему списку: сначала 7 (вектор отмены = UNDO), потом 9 (первая часть), потом механизм повтора наката не отражённый тобой, потом механизм суммирования всех изменений (REDO) по данной строке в рамках транзакции (тоже не отражён тобой), потом уже 8 (совмещена с твоим 6 - вычитка блоков в кэш, помечает их залоченными для других изменений), потом 9 (вторая часть) и дальше

это примерно по памяти. забыл уже всё.
...
Рейтинг: 0 / 0
Внутренняя работа Oracle при выполнении оператора Insert
    #40103908
Alexander Anokhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если вопрос в том какие процессы что делают, то в целом да - серверный процесс с сессией, которой нужен блок, проверяет есть ли блок в буферном кэше, если нет в кэше, читает блок(и) с диска, когда надо изменить данные - меняет, изменяя буферы данных в буферном кэше и сохраняя старые значения в буферах undo в буферном кэше, записывает redo данные в redo log buffer. DBWR в фоне пишет измененные блоки буферного кэша на диск. LGWR в фоне пишет содержимое redo буфера в redo log files. Когда сессия выполняет commit, то ждёт ответа от LGWR, что содержимое redo buffer успешно записано.

автор6. В сессии Oracle проверяет есть ли блоки данных, в которые будет происходить запись в buffer cache(SGA). Если блоков нет, то он зачитывает пустые блоки из соответствующего файла и пишет их в buffer cache(SGA). Так же происходит запись
Читаются не "пустые блоки", а нужные блоки. Для чтобы найти блоки, куда insert будет вставлять данные процесс прочитает в заголовке сегмента карту свободного пространства, там он узнает какой блок можно использовать и если его нет в кэше, прочитает его с диска в кэш.

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

...
11. В сессии пользователь выполняет commit транзакции, делая вставку постоянной. После чего процесс снимает выставленные блокировки строк.

У Оракл блокировки на уровне строк в блоках данных, не в памяти. В блоке данных записано какая транзакция изменила строку. В таком виде блоки могут быть записаны на диск. Если после этого другой процесс прочитает блок (скажем другой insert несколькими днями позже), и видит эту информацию о транцакции, этот другой процесс проверяет актуальна ли информация, и строка по прежнему заблокирована или транзакции уже не существует, и строка не заблокирована.


Возможно тебе стоит понять как работает план выполнения и рассмотреть простой update, а не insert values. Не смотря на то, что там будет больше шестерёнок, там понятнее станет как SQL вообще выполняется, и взаимосвязь процессов.
...
Рейтинг: 0 / 0
Внутренняя работа Oracle при выполнении оператора Insert
    #40104182
Фотография stdio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
feagor
Добрый день.
Хотелось бы получить максимально полное и при этом понятное представление о том какие серверные процессы взаимодействуют друг с другом при выполнении insertа одной записи с первичным ключом.
В особенности хотелось бы детально понять роль процессов LGWR,DBWR а так же того, кто и когда пишет Undo, в какой момент могут появляться ожидания типа enq tx index contention
И это все нужно чтобы узнать откуда "enq tx index contention"?
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Внутренняя работа Oracle при выполнении оператора Insert
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]