`

oracle sql语句执行步骤及顺序

 
阅读更多

sql语法的解析析是从右到左 10g前 rbo;
目前解析顺序对我们来说没什么意义,执行顺序才应该是我们应该关注的。就像你写程序一样,语法检查从左到右还是从右到左没有任何的参考价值。
对于rbo来说,一般建议把过滤量大的语句写在后面,但10g后已经自动进行cbo统计了,不用过多考虑条件的放置顺序了

Oracle中SQL语句执行过程中,Oracle内部解析原理如下:

1、当一用户第一次提交一个SQL表达式时,Oracle会将这SQL进行Hard parse,这过程有点像程序编译,检查语法、表名、字段名等相关信息(如下图),这过程会花比较长的时间,因为它要分析语句的语法与语义。然后获得最优化后的执行计划(sql plan),并在内存中分配一定的空间保存该语句与对应的执行计划等信息。

2、当用户第二次请求或多次请求时,Oracle会自动找到先前的语句与执行计划,而不会进行Hard parse,而是直接进行Soft parse(把语句对应的执行计划调出,然后执行),从而减少数据库的分析时间。

注意的是:Oracle中只能完全相同的语句,包大小写、空格、换行都要求一样时,才会重复使用以前的分析结果与执行计划。

对于大量的、频繁访问的SQL语句,如果不采用Bind 变量的方式,哪Oracle会花费大量的Shared latch与CPU在做Hard parse处理,所以,要尽量提高语句的重用率,减少语句的分析时间,通过了解Oracle SQL语句的分析过程可以明白Oracle的内部处理逻辑,并在设计与实现上避免。

在用JDBC或其它持久化数据(如Hibernate,JDO等)操作时,尽量用占位符(?)
ORACLE sql 的处理过程大致如下:
1.运用HASH算法,得到一个HASH值,这个值可以通过V$SQLAREA.HASH_VALUE 查看
2.到shared pool 中的 library cache 中查找是否有相同的HASH值,如果存在,则无需硬解析,进行软解析
3.如果shared pool不存在此HASH值,则进行语法检查,查看是否有语法错误
4.如果没有语法错误,就进行语义检查,检查该SQL引用的对象是否存在,该用户是否具有访问该对象的权限
5.如果没有语义错误,对该SQL进行解析,生成解析树,执行计划
6.生成ORACLE能运行的二进制代码,运行该代码并且返回结果给用户
硬解析和软解析都在第5步进行
硬解析通常是昂贵的操作,大约占整个SQL执行的70%左右的时间,硬解析会生成执行树,执行计划,等等。
当再次执行同一条SQL语句的时候,由于发现library cache中有相同的HASH值,这个时候不会硬解析,而会软解析,
那么软解析究竟是干了什么呢?其实软解析就是跳过了生成解析树,生成执行计划这个耗时又耗CPU的操作,直接利用生成的执行计划运行
该SQL语句。
下面摘抄eygle深入解析ORACLE 中关于SQL执行过程的描述
  1.首先获得library cache latch,根据SQL的HASH_VALUE在library cache中查找是否存在此HASH_VALUE,如果找到这个HASH_VALUE,称之为软解析,Server获得改SQL执行计划转向第4步,如果找不到共享代码就进行硬解析。
  2.释放library pool cache,获得shared pool latch,查找并锁定自由空间(在bucket 中查找chunk)。如果找不到,报ORA-04031错误
  3.释放shared pool latch,重新获得library cache latch,将SQL执行计划放入library cache中。
  4.释放library cache latch,保持null模式的library cache pin/lock.
  5.开始执行。
Library cache latch可以理解为硬/软解析的时候发生的,因为解析的时候会搜索library cache,所以会产生library cache latch
Library cache pin 是在执行的阶段发生的。


一、sql语句的执行步骤:
1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义。
2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限。
3)视图转换,将涉及视图的查询语句转换为相应的对基表查询语句。
4)表达式转换, 将复杂的 SQL 表达式转换为较简单的等效连接表达式。
5)选择优化器,不同的优化器一般产生不同的“执行计划”
6)选择连接方式, ORACLE 有三种连接方式,对多表连接 ORACLE 可选择适当的连接方式。
7)选择连接顺序, 对多表连接 ORACLE 选择哪一对表先连接,选择这两表中哪个表做为源数据表。
8)选择数据的搜索路径,根据以上条件选择合适的数据搜索路径,如是选用全表搜索还是利用索引或是其他的方式。
9)运行“执行计划”


二、oracle 共享原理:
     ORACLE将执行过的SQL语句存放在内存的共享池(shared buffer pool)中,可以被所有的数据库用户共享。
当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同,ORACLE就能很快获得已经被解析的语句以及最好的执行路径.。这个功能大大地提高了SQL的执行性能并节省了内存的使用。

三、oracle 语句提高查询效率的方法:
1:where column in(select * from ... where ...);
2:... where exists (select 'X' from ...where ...);

第二种格式要远比第一种格式的效率高。

在Oracle中可以几乎将所有的IN操作符子查询改写为使用EXISTS的子查询。
使用EXIST,Oracle系统会首先检查主查询,然后运行子查询直到它找到第一个匹配项,
这就节省了时间Oracle系统在执行IN子查询时,首先执行子查询,并将获得的结果列表存放在在一个加了索引的临时表中。


避免使用having子句。HAVING 只会在检索出所有记录之后才对结果集进行过滤。
这个处理需要排序,总计等操作。如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销。

四、SQL Select语句完整的执行顺序:
1、from子句组装来自不同数据源的数据;
2、where子句基于指定的条件对记录行进行筛选;
3、group by子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用having子句筛选分组;
6、计算所有的表达式;
7、select 的字段;
8、使用order by对结果集进行排序。

SQL语言不同于其他编程语言的最明显特征是处理代码的顺序。在大多数据库语言中,代码按编码顺序被处理。但在SQL语句中,第一个被处理的子句式FROM,而不是第一出现的SELECT。SQL查询处理的步骤序号:
(8)
1 SELECT  (9) DISTINCT (11) <TOP_specification> <select_list>
2  (1)  FROM <left_table> 
3  (3) <join_type> JOIN <right_table>
4  (2) ON <join_condition>
5  (4) WHERE <where_condition>
6  (5) GROUP BY <group_by_list>
7  (6) WITH {CUBE | ROLLUP}
8  (7) HAVING <having_condition>
9 (10) ORDER BY <order_by_list>
  以上每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只有最后一步生成的表才会会给调用者。如果没有在查询中指定某一个子句,将跳过相应的步骤。
  逻辑查询处理阶段简介:
  1、 FROM:对FROM子句中的前两个表执行笛卡尔积(交叉联接),生成虚拟表VT1。
  2、 ON:对VT1应用ON筛选器,只有那些使为真才被插入到TV2。
  3、 OUTER (JOIN):如果指定了OUTER JOIN(相对于CROSS JOIN或INNER JOIN),保留表中未找到匹配的行将作为外部行添加到VT2,生成TV3。如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表位置。
  4、 WHERE:对TV3应用WHERE筛选器,只有使为true的行才插入TV4。
  5、 GROUP BY:按GROUP BY子句中的列列表对TV4中的行进行分组,生成TV5。
  6、 CUTE|ROLLUP:把超组插入VT5,生成VT6。
  7、 HAVING:对VT6应用HAVING筛选器,只有使为true的组插入到VT7。
  8、 SELECT:处理SELECT列表,产生VT8。
  9、 DISTINCT:将重复的行从VT8中删除,产品VT9。
  10、ORDER BY:将VT9中的行按ORDER BY子句中的列列表顺序,生成一个游标(VC10)。
    11、TOP:从VC10的开始处选择指定数量或比例的行,生成表TV11,并返回给调用者。



where子句中的条件书写顺序

1、基本上对sql性能没有影响
------------------------------------------------
多表连接查询时顺序:
例如:
select * from a inner join b on a.bid=b.id inner join c on b.cid=c.id where a.XXX='XXX'
1)、from a、b、c作为数据源
2)、通过where a.XXX='XXX' 筛选a表里的数据
3)、a表与b表依次对比,根据on条件,筛选符合条件的数据集
4)、将a、b两张表得到的结果集再和c中的记录依次对比,筛选符合条件的数据集
5)、完成
注意:
在多表关联查询时,哪两个表先结合查询,要通过优化器的分析,走CBO模式,一般将数据多的放在里面,数据少的放在外面。这里是假定排序是a、b、c。

---------------------------------------------------
1:
   select * from A join B on a.id = b.id
   where b.name > 'abc'
2:
   select * from A join B on a.id = b.id and b.name > 'abc'

2比1好
1是先连接后再在结果中筛选
2是先在B中筛选后再与A连接。 
-----------------------------------------------
1。SELECT * FROM 员工 WHERE 性别='男'AND 年龄>100  
2。SELECT * FROM 员工 WHERE 年龄>100 AND 性别='男' 
1号2不好,因为SQL是从右边开始判断的


----------------------------------
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    SQL语句执行顺序说明

    ### SQL语句执行顺序说明 #### 一、SQL语句准备执行阶段 当SQL语句进入Oracle的库缓存后,为了确保其...通过遵循上述步骤和技巧,可以有效地提高SQL语句在Oracle数据库中的执行效率,从而提升应用程序的整体性能。

    Oracle SQL语句执行计划的探讨.pdf

    Oracle SQL语句执行计划是数据库管理系统中非常关键的一部分,它决定了SQL查询如何在数据库中执行,从而直接影响到查询效率和整体系统性能。Oracle数据库通过共享池来存储已解析的SQL语句及其执行计划,以此避免对...

    ORACLE-Select语句执行顺序及如何提高Oracle基本查询效率.pdf

    ORACLE-Select语句执行顺序及如何提高Oracle基本查询效率 在Oracle中,SQL语句的执行顺序是非常重要的。了解了SQL语句的执行顺序,我们可以更好地优化SQL语句,提高查询效率。下面我们将详细介绍ORACLE-Select语句...

    oracle sql执行过程(流程图)

    Oracle sql执行流程图_SQL执行过程一、sql语句的执行步骤:1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义。2) 语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限。3)...

    通过分析SQL语句的执行计划优化SQL(总结)

    在不同的数据库系统中,如MySQL、Oracle、SQL Server等,都有相应的命令或工具用于查看SQL语句的执行计划,例如SQL Server的`SET SHOWPLAN_ALL`或`SET SHOWPLAN_TEXT`,Oracle的`EXPLAIN PLAN`。 4. **执行计划的...

    读懂oracle sql执行计划

    执行计划的顺序通常表示了Oracle数据库执行SQL语句的步骤顺序。了解执行计划的真实执行顺序有助于我们理解哪些操作是并行的,哪些是顺序的,以及如何影响最终查询的性能。 为了读懂执行计划,通常需要实践和经验的...

    Oracle Sql性能调优.ppt

    SQL 执行计划是 Oracle 数据库执行 SQL 语句的计划,它包括索引使用、 Join 顺序、排序顺序等。通过对执行计划的优化,可以提高数据库的响应速度和吞吐量。 8. 索引使用优化 索引使用优化是 Oracle 调优的一个重要...

    SQL查询原理及执行顺序

    ### SQL查询原理及执行顺序详解 SQL(Structured Query Language)是一种用于管理关系型数据库的标准语言,其查询原理和执行顺序对于数据库性能优化至关重要。本文将深入探讨SQL查询的执行过程,帮助读者理解如何...

    批处理执行sql语句

    这包括可能需要的环境设置、权限要求、执行顺序、可能出现的问题及解决方案等。遵循这份说明,用户可以安全地、正确地进行数据库的批量升级操作。 批处理执行SQL语句的应用广泛,尤其是在大型系统维护、数据库版本...

    Oracle数据库中SQL语句的优化与分析.pdf

    以上步骤是Oracle执行SQL语句的一般过程,了解并掌握每个步骤对于分析和优化SQL语句至关重要。 四、影响SQL执行计划选择的因素 执行计划的选择受多种因素影响,如数据的分布、索引的可用性、表的大小、统计信息的...

    Oracle SQL语句分页问题

    ### Oracle SQL语句分页问题详解 #### 一、引言 在数据库查询操作中,分页是一项常用且重要的功能,特别是在数据量较大的情况下。它能够有效地提高用户体验,并减轻服务器负担。本文将针对Oracle数据库中的SQL分页...

    ORACLE SQL语句性能优化

    Oracle SQL语句性能优化是数据库管理员和开发人员关注的重要领域,因为高效的SQL语句能够显著提升数据库系统的响应速度,减少资源消耗,进而提高整体系统性能。以下是一些关键的优化策略: 1. **避免使用IN操作符**...

    ORACLE数据库SQL语句的执行过程

    在回答这个问题前,我们先来回顾一下:在ORACLE数据库架构下,SQL语句由用户进程产生,然后传到相对应的服务端进程,之后由服务器进程执行该SQL语句,如果是SELECT语句,服务器进程还需要将执行结果回传给用户进程。...

    Oracle+SQL性能优化40条.docx

    一、SQL 语句执行步骤 * 语法分析:检查 SQL 语句的语法正确性 * 语义分析:分析 SQL 语句的逻辑含义 * 视图转换:将 SQL 语句转换为视图 * 表达式转换:将视图转换为表达式 * 选择优化器:选择最优的执行计划 * ...

    SQL语句的执行步骤和优化

    ### SQL语句的执行步骤与优化详解 #### 一、SQL语句的执行流程 当在Oracle数据库中执行SQL查询...通过深入了解SQL语句的执行步骤和Oracle的优化机制,可以更有效地识别并解决查询性能问题,从而提高系统的整体性能。

    Oracle SQL Tuning.pdf

    在Oracle环境中,SQL语句的处理流程主要包括解析、优化和执行三个阶段。解析阶段,Oracle会检查SQL语句的语法和逻辑是否正确;优化阶段,Oracle的查询优化器会分析SQL语句,选择最有效的执行计划;最后是执行阶段,...

    linux下批量执行oracle脚本的shell脚本

    在shell脚本中,这些步骤可以通过调用相应的Oracle管理工具(如`sqlplus`或`dbca`)来实现,并通过逻辑控制结构(如if、for循环)确保按顺序执行。 `createTable.sql` 文件很可能是包含创建数据库表结构的SQL脚本。...

    SQL语句执行顺序图文介绍

    SQL语句的执行顺序对于理解和优化查询性能至关重要。本篇文章将详细解释SQL语句,特别是SELECT语句的执行流程。 首先,我们需要理解SQL语句的基本结构,通常包括以下几个部分:SELECT、FROM、WHERE、GROUP BY、...

    OracleSQL语句优化[归纳].pdf

    综上所述,Oracle SQL语句优化涉及多个方面,包括理解查询选择性和基数、监控逻辑读和物理读、分析执行计划以及合理选择访问路径。通过对这些知识点的深入理解和应用,开发者可以显著提升SQL查询的效率,从而优化...

Global site tag (gtag.js) - Google Analytics