|
Внутренняя работа Oracle при выполнении оператора Insert
|
|||
---|---|---|---|
#18+
Добрый день. Хотелось бы получить максимально полное и при этом понятное представление о том какие серверные процессы взаимодействуют друг с другом при выполнении insertа одной записи с первичным ключом. В особенности хотелось бы детально понять роль процессов LGWR,DBWR а так же того, кто и когда пишет Undo, в какой момент могут появляться ожидания типа enq tx index contention ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2021, 02:09 |
|
Внутренняя работа Oracle при выполнении оператора Insert
|
|||
---|---|---|---|
#18+
feagor, У меня есть книга и там много механизмов описаны. Ядро Oracle Внутреннее устройство для администраторов и разработчиков баз данных. Могу вам скинуть на почту. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2021, 07:33 |
|
Внутренняя работа Oracle при выполнении оператора Insert
|
|||
---|---|---|---|
#18+
Читайте Database Concepts Oracle Instance Architecture ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2021, 08:09 |
|
Внутренняя работа Oracle при выполнении оператора Insert
|
|||
---|---|---|---|
#18+
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 записывает изменения пакетами, поэтому может пройти некоторое время, прежде чем вставленная информация будет фактически и навсегда записана в файлы базы данных на диске. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2021, 18:56 |
|
Внутренняя работа Oracle при выполнении оператора Insert
|
|||
---|---|---|---|
#18+
От конкретной версии oracle может зависеть. По шагам у тебя порядок напутан и частично смешан, частично не раскрыт. Для старых версий (к 11-й ещё применимо было) погугли Джонатан Льюис "Ядро Oracle" - см. главу 2 для начала и в целом читай всю книжку. По твоему списку: сначала 7 (вектор отмены = UNDO), потом 9 (первая часть), потом механизм повтора наката не отражённый тобой, потом механизм суммирования всех изменений (REDO) по данной строке в рамках транзакции (тоже не отражён тобой), потом уже 8 (совмещена с твоим 6 - вычитка блоков в кэш, помечает их залоченными для других изменений), потом 9 (вторая часть) и дальше это примерно по памяти. забыл уже всё. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2021, 21:11 |
|
Внутренняя работа Oracle при выполнении оператора Insert
|
|||
---|---|---|---|
#18+
Если вопрос в том какие процессы что делают, то в целом да - серверный процесс с сессией, которой нужен блок, проверяет есть ли блок в буферном кэше, если нет в кэше, читает блок(и) с диска, когда надо изменить данные - меняет, изменяя буферы данных в буферном кэше и сохраняя старые значения в буферах 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 вообще выполняется, и взаимосвязь процессов. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2021, 19:42 |
|
Внутренняя работа Oracle при выполнении оператора Insert
|
|||
---|---|---|---|
#18+
feagor Добрый день. Хотелось бы получить максимально полное и при этом понятное представление о том какие серверные процессы взаимодействуют друг с другом при выполнении insertа одной записи с первичным ключом. В особенности хотелось бы детально понять роль процессов LGWR,DBWR а так же того, кто и когда пишет Undo, в какой момент могут появляться ожидания типа enq tx index contention ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2021, 17:25 |
|
|
start [/forum/topic.php?fid=52&gotonew=1&tid=1879825]: |
0ms |
get settings: |
25ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
48ms |
get topic data: |
13ms |
get first new msg: |
8ms |
get forum data: |
3ms |
get page messages: |
192ms |
get tp. blocked users: |
2ms |
others: | 2287ms |
total: | 2601ms |
0 / 0 |