oracle中sql查询语句的执行顺序

查询语句的处理过程主要包含3个阶段:编译、执行、提取数据(sql查询语句的处理主要是由用户进程和服务器进程完成的,其他进程辅助配合)

一、编译parse

        在进行编译时服务器进程会将sql语句的正文放入SGA的共享池的库高速缓存区(library cache)中并将完成一下处理。

      1、首先在共享池中搜索是否有相同的sql语句(正文),如果没有就进行后续的处理。

      2、检查sql语句的语法是否正确

      3、通过查看数据字典来检查表和列的定义是否有效

      4、对所操作的对象加编译锁,以便在编译语句期间这些对象的定义不能被改变。

      5、检查所引用对象的用户权限

      6、生成执行该sql语句所需的优化的执行计划

      7、将sql语句和sql执行计划装入共享的sql区

      以上每一步都是在处理正确时才进行的后续操作,如果不正确就返回错误。

二、执行execute

     oracle服务器进程开始执行sql语句是因为他已经获得了执行sql语句的所需的全部资源和信息

三、提取数据fetch

     oracle服务器进程选择所需要的数据行,并在需要时将其排序,最后将结果返回给用户进程。

 

### Oracle SQL 语句执行顺序详解 在 Oracle 数据库中,SQL 语句的执行顺序并不是按照书写顺序执行的,而是根据 SQL 语法和优化器的规则进行一系列步骤来处理,以确保查询的高效性和正确性。 SQL 语句的执行流程通常分为两个层面:**语法顺序**和**实际执行顺序**。从语法角度来看,SQL执行顺序如下: 1. `FROM` —— 首先确定数据来源,这是 SQL 的入口点。 2. `ON` —— 在连接操作中用于指定连接条件。 3. `JOIN` —— 将多个表根据连接条件进行连接。 4. `WHERE` —— 对数据进行过滤,筛选符合条件的行。 5. `GROUP BY` —— 将数据按指定列分组。 6. `HAVING` —— 对分组后的数据进行进一步筛选。 7. `SELECT` —— 指定需要返回的列。 8. `DISTINCT` —— 去除重复行。 9. `ORDER BY` —— 对最终结果进行排序[^1]。 从实际执行角度来看,Oracle 数据库在执行 SQL 语句时遵循以下流程: 1. `FROM` 子句首先执行,将来自不同数据源的数据组装在一起。 2. `WHERE` 子句根据指定的条件对记录行进行筛选,减少后续操作的数据量。 3. `GROUP BY` 子句将数据划分为多个分组,为聚合操作做准备。 4. 聚合函数(如 `SUM`、`COUNT`、`AVG` 等)对分组后的数据进行计算。 5. `HAVING` 子句用于筛选满足条件的分组。 6. 表达式(如别名、函数、运算等)被计算并生成结果列。 7. `ORDER BY` 子句对最终的结果集进行排序,以满足用户的排序需求[^2]。 此外,Oracle执行 SQL 语句时还会进行查询优化。即使 SQL 语句的语法和语义都正确,服务器进程也不会直接访问数据库文件。相反,它会根据一定的规则对语句进行优化,例如视图合并、子查询解嵌套、谓语前推以及物化视图重写查询等。优化器会收集统计信息,并根据这些信息选择一个成本最低的执行计划[^3]。 执行计划可以通过查询 `PLAN_TABLE` 来查看。例如,可以通过以下语句查看具体的执行计划: ```sql SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', 'stmt1', 'ALL')); ``` 通过执行计划,可以深入了解 SQL 语句的访问路径、连接方式以及资源消耗情况,从而进行性能调优[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值