【SQL】Oracle SQL处理的流程

来源:这里教程网 时间:2026-03-03 17:00:43 作者:

本文主要介绍Oracle SQL处理的流程 1.概述下图描述了Oracle数据库如何处理sql的一个流程,根据需求不同,可能会省略某个部分 1.1 SQL解析       当应用程序发出SQL语句时,应用程序对数据库进行解析调用,以准备执行该语句。parse调用打开或创建一个游标,该游标是特定于会话的私有SQL区域的句柄,该区域保存已解析的SQL语句和其他处理信息。游标和专用SQL区域位于程序全局区域(PGA)中。     解析包括语法解析、语义检查(含义)、共享池检查(硬解析/软解析之类)。 SQL共享池检查,请参考其他文档。1.2 SQL优化    在优化期间,Oracle 数据库必须对每个唯一的 DML 语句至少执行一次硬解析,并在此解析期间执行优化。1.3 SQL行源生成   行源生成器是从优化器接收最佳执行计划并生成可供数据库其余部分使用的迭代执行计划的软件。   迭代计划是一个二进制程序,当由SQL引擎执行时,生成结果集。该计划采取了一系列步骤的组合形式。每一步都返回一个行集。下一步使用该集中的行,或者最后一步将这些行返回给发出SQL语句的应用程序。   行源是执行计划中的步骤返回的行集,以及可以迭代处理行的控制结构。行源可以是表、视图或联接或分组操作的结果。   行源生成器生成一个行源树,它是行源的集合。 行源树显示以下信息: •对该声明引用的表格进行排序 •声明中提到的每个表的访问方法 •语句中受联接操作影响的表的联接方法 •数据操作,如筛选、排序或聚合 1.4 SQL执行  在执行过程中,如果数据不在内存中,则数据库将数据从磁盘读取到内存中。数据库还取出确保数据完整性所需的任何锁和闩锁,并记录在 SQL 执行期间所做的任何更改。处理 SQL 语句的最后阶段是关闭游标。 2.Oracle如何处理DML2.1获取行集     大多数 DML 语句都有一个查询组件。在查询中,游标的执行将查询结果放入一组称为结果集的行中。      在提取阶段,数据库选择行,如果查询请求,则对行进行排序。每次连续提取都会检索另一行结果,直到提取到最后一行。      通常,在获取最后一行之前,数据库无法确定某个查询要检索的行数。Oracle 数据库检索数据以响应 fetch 调用,因此数据库读取的行越多,它执行的工作就越多。对于某些查询,数据库尽可能快地返回第一行,而对于其他查询,它在返回第一行之前创建整个结果集。2.2 读一致性   一般情况下,查询通过Oracle 数据库读取一致性机制来检索数据,该机制保证查询读取的所有数据块在单个时间点上是一致的。    读取一致性使用撤消数据来显示数据的过去版本。例如,假设查询必须在全表扫描中读取 100 个数据块。查询处理前 10 个块,而不同会话中的 DML 修改块 75。当第一个会话到达块 75 时,它实现更改并使用撤消数据检索旧的、未修改的数据版本并构造块的非当前版本75 在内存中。2.3 数据更改      必须更改数据的 DML 语句使用读取一致性来仅检索在修改开始时与搜索条件匹配的数据。       之后,这些语句检索当前状态中存在的数据块并进行所需的修改。数据库必须执行与数据修改相关的其他操作,例如生成重做和撤消数据。 3.Oracle如何处理DDL Oracle 数据库处理 DDL 的方式与 DML 不同。 例如,创建表时,数据库不会优化CREATE TABLE语句。相反,Oracle 数据库解析 DDL 语句并执行命令。 数据库处理 DDL 的方式不同,因为它是在数据字典中定义对象的一种方式。通常,Oracle 数据库必须解析和执行许多递归 SQL语句才能执行 DDL 语句

CREATE TABLE mytable (mycolumn INTEGER);

通常,数据库会运行几十个递归语句来执行上面的语句。递归 SQL 将执行如下操作:

COMMIT在执行CREATE TABLE语句 之前发出 a

验证用户权限是否足以创建表

确定表应该驻留在哪个表空间

确保没有超过表空间配额

确保架构中没有对象具有相同的名称

将定义表的行插入到数据字典中

如果DDL语句成功,则发出COMMIT;如果未成功,则发出ROLLBACK

相关推荐