【发布时间】:2018-12-03 06:38:51
【问题描述】:
我对 Oracle 执行 INSERT 操作的方式及其原因有疑问。
我已经读到,当用户执行一些INSERT - Oracle 进程需要检索表数据。
我可以理解,当用户执行一些选择查询时,实例的进程需要从内存或磁盘中检索这些数据(如果它不存在于内存中)。
UPDATE 操作也很有意义,因为旧数据需要更新,所以我们必须读取该数据。
但是当用户执行INSERT 命令时,它是否需要从内存或磁盘文件中读取任何数据?
目标是创建redo log files 的"before image" 所需的数据吗?
Oracle 将为插入命令检索哪些数据?
我正在使用 Oracle 11gR2。
这是书中的文字:
以下插入行的简单示例概述了如何 Oracle 处理事务:
- 用户使用 Oracle 网络服务通过 3 层或 n 层基于 Web 的客户端请求与 Oracle 服务器的连接。
- 验证请求后,服务器会为该用户启动一个新的专用服务器进程。
- 用户执行语句将新行插入表中。
- Oracle 检查用户的权限以确保用户具有执行插入的必要权限。如果用户的权限 信息不在库缓存中,它必须是 从磁盘读取到该缓存中。
- 如果用户具有必要的权限,Oracle 会检查之前执行的 SQL 语句是否与用户的相似 刚刚发布的已经在共享池中。如果有,甲骨文 执行此版本的 SQL;否则 Oracle 解析并执行 用户的 SQL 语句。然后 Oracle 在 用户会话的 PGA。
- Oracle 首先检查必要的数据是否已经在数据缓冲区缓存中。如果不是,服务器进程读取必要的 来自磁盘上的数据文件的表数据。
- Oracle 会在需要时立即应用行级锁,以防止其他进程尝试更改相同的数据 同时。
- 服务器将更改向量写入重做日志缓冲区。
- 服务器修改数据缓冲区缓存中的表数据(插入新行)。
- 用户提交事务,使插入永久化。 Oracle 在提交后释放行锁。
- 日志写入进程立即将重做日志缓冲区中的更改数据写入在线重做日志文件。
- 服务器进程向客户端进程发送一条消息,指示INSERT 操作成功完成。这 在这种情况下,消息将是“COMMIT COMPLETE”。 (如果不能 成功完成请求,它会发送一条消息指示 操作失败。)
- 通过插入对表所做的更改可能不会立即写入磁盘。数据库写入进程将更改写入 批次,因此可能需要一段时间才能插入信息 实际上永久写入磁盘上的数据库文件。
【问题讨论】:
-
你在哪里读到的?
-
Sam Alapti 的 Oracle 数据库 11g 管理专家。有错吗?
-
这不是我知道的书。请张贴相关报价。我认为这可能是错误的 - 或者至少是不准确的 - 但在批评之前了解原始观点会很好。