精华内容
下载资源
问答
  • oracle 语句执行顺序

    2014-01-24 15:21:33
    SQL语句执行顺序:  1.1、先where 后select 1.2、先where 再group 再having 后select 1.3、先where 再group 再having 再select后order 1.4、先join  再where 后select   2、 TO_DATE函数,TO_CHAR函数和between ...
     
    

    sql语法的分析是从右到左

     

    一、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查询处理的步骤序号:

     

    1  (8)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,并返回给调用者。

     

    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 是在执行的阶段发生的

     

    展开全文
  • oracle语句执行顺序

    千次阅读 2010-10-01 11:26:00
    SQL Select语句完整的执行顺序:1、from子句组装来自不同数据源的数据;2、where子句基于指定的条件对记录行进行筛选;3、group by子句将数据划分为多个分组;4、使用聚集函数进行计算;5、使用having子句筛选分组;...

    SQL Select语句完整的执行顺序:

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

     

    oracle 语句提高查询效率的方法
    1:.. where column in(select * from ... where ...);
    2:... where exists (select 'X' from ...where ...);
    第二种格式要远比第一种格式的效率高。在Oracle中可以几乎将所有的IN操作符子查询改写为使用EXISTS的子查询
    使用EXISTS,Oracle系统会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间
    Oracle系统在执行IN子查询时,首先执行子查询,并将获得的结果列表存放在在一个加了索引的临时表中

     

     

    选择最有效率的表名顺序(只在基于规则的优化器中有效)
         ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理。在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。当ORACLE处理多个表时,会运用排序及合并的方式连接它们。首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并。

         如果有3个以上的表连接查询,那就需要选择交叉表(intersection table)作为基础表,交叉表是指那个被其他表所引用的表。

     

     

    WHERE子句中的连接顺序
         ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。

     

     

     

     

    展开全文
  • Oracle select语句执行顺序

    Oracle select语法分析

    sql语句中用到最多的就是查询语句,想要更好的掌握使用查询语句需要了解oracle是如何解析执行sql语句的。

    在Oracle中SQL语句运行的机制

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

    Oracle共享原理

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

    在了解了SQL语句的运行机制和oracle共享原理之后,我们可以知道SQL语句的书写方式对SQL语句的执行效率有很大的影响。

    SQL语言不同于其他编程语言的最明显特征是处理代码的顺序。在大多数据库语言中,代码按编码顺序被处理。但在SQL语句中,第一个被处理的子句是FROM,而不是第一出现的SELECT。

    SQL查询处理的步骤序号:

    (8) SELECT (9) DISTINCT (11) <TOP_specification> <select_list> 
    (1) FROM <left_table> 
    (3) <join_type> JOIN <right_table> 
    (2) ON <join_condition> 
    (4) WHERE <where_condition> 
    (5) GROUP BY <group_by_list> 
    (6) WITH {CUBE | ROLLUP} 
    (7) HAVING <having_condition> 
    (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。Having语句很耗资源,尽量少用
    8. SELECT:处理SELECT列表,产生VT8。
    9. DISTINCT:将重复的行从VT8中删除,产品VT9。
    10. ORDER BY:将VT9中的行按ORDER BY子句中的列列表顺序,生成一个游标(VC10)。执行顺序从左到右,是一个很耗资源的语句。
    11. TOP:从VC10的开始处选择指定数量或比例的行,生成表TV11,并返回给调用者。
    展开全文
  • oracle sql语句执行顺序

    千次阅读 2016-08-15 11:01:28
    摘选自:... oracle sql语句执行顺序 谷歌 Oracle sql语句执行顺序_大小孩_新浪博客 blog.sina.com.cn/s/blog_61c006ea0100mlgq.html 2010年10月14日 - sql语法的分

    摘选自:http://blog.csdn.net/haiross/article/details/38864937


    oracle sql语句执行顺序  谷歌

      • Oracle sql语句执行顺序_大小孩_新浪博客

        blog.sina.com.cn/s/blog_61c006ea0100mlgq.html
        2010年10月14日 - sql语法的分析是从右到左. 一、sql语句执行步骤: 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义。 2)语义分析,检查 ...
      • Oracle sql语句执行顺序- IT技术累积- ITeye技术网站

        wang286480403.iteye.com/blog/1899915
        2013年7月5日 - sql语法的分析是从右到左. 一、sql语句执行步骤:. 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义。 2)语义分析,检查 ...
      • ORCLE-Select 语句执行顺序以及如何提高Oracle 基本查询 ...

        wfly2004.blog.163.com/blog/static/1176427201110345049428/
        2011年11月3日 - 首先,要了解在OracleSql语句运行的机制。以下是sql语句执行步骤: 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义。
      • SQL语句执行顺序及建议--归纳整理 - CSDN blog

        blog.csdn.net/q947817003/article/details/13622215
        2013年10月30日 - 一、SQL语句准备执行阶段当SQL 语句进入Oracle 的库缓存后1) 语法检查:检查SQL 语句拼写是否正确和词序2) 语义分析:核实所有的与数据字典 ...
      • SQL语句执行顺序- a坦然- 博客园

        www.cnblogs.com/huminxxl/p/3149097.html
        2013年6月21日 - sql语句的书写顺序并不是一样的,而是按照下面的顺序执行 ... 7)选择连接顺序, 对多表连接ORACLE 选择哪一对表先连接,选择这两表中哪个 ...
      • SQL语句执行顺序分析_百度文库

        wenku.baidu.com/view/dbc4bedc5022aaea998f0f71
        2010年11月8日 - SQL语句执行顺序分析_IT/计算机_专业资料。oracle中sql语句的执行顺序. SQL 语句执行顺序分析关键字: sql 我想请哪位高人分析一下以下几 ...
      • ORACLE-Select语句执行顺序及如何提高Oracle 基本查询 ...

        wenku.baidu.com/view/b4b81c59312b3169a451a471.html
        2012年4月15日 - 9)运行“执行计划” 。 这里不得不提的是Oracle 共享原理:将执行过的SQL 语句存放在内存的共享池(shared buffer pool)中,可以被所有的数据库用户 ...
      • 关于oracle sql 语句中where 子句条件的执行顺序Oracle开发-ITPUB论 ...

        www.itpub.net › ITPUB论坛 › 论坛
        2006年12月14日 - 10 个帖子 - ‎7 个作者
        小弟最近很郁闷,在搞一个oracle 的sql的优化,对oracle不太熟,遇到不少困难。1:在where 子句中,当用不到索引时,各个条件按什么样的顺序执行 ...
      • sql语句执行顺序 - 360Doc个人图书馆

        www.360doc.com/content/09/1122/17/333365_9545966.shtml
        2009年9月14日 - ORACLE执行过的SQL语句存放在内存的共享池(shared buffer pool)中,可以被所有的数据库用户共享当你执行一个SQL语句(有时被称为一个 ...
      • sql语句执行顺序--相关文章 - 360Doc个人图书馆

        www.360doc.com/relevant/9545966_more.shtml
        oracle 查询执行顺序。在带有group by 子句的查询语句中,在select 列表中指定的列要么是group by 子句中指定的列,要么包含聚组函数select max(sal),job emp ...
    展开全文
  • --sql查询的语句执行顺序 (select from where group by having) union (select from) order by --顺序 from where group by select having union order by
  • Oracle sql语句执行顺序

    千次阅读 2013-10-11 10:25:44
    Oracle sql语句执行顺序      sql语法的分析是从右到左   一、sql语句的执行步骤: 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义。 2)语义分析,检查语句中涉及的所有数据库...
  • oracle语句执行顺序

    千次阅读 2017-05-21 16:25:49
    查询中用到的关键词主要...其中select和from是必须的,其他关键词是可选的,这六个关键词的执行顺序 与sql语句的书写顺序并不是一样的,而是按照下面的顺序来执行 from--where--group by--having--select--ord
  • 完整的查询语句类似是这样的: select ..., ROWNUM from table where where clause> group by ...首先,执行 FROM/WHERE 语句为结果赋予 ROWNUM 并同时根据 FROM/WHERE 语句进行 rownum 过滤执行
  • 语句 执行顺序 select –5 from –1 where –2 group by –3 having –4 order by ...
  • oracle SQL语句执行顺序

    2018-12-31 11:19:42
    1、from 2、where 3、group by  4、having 5、select 6、order by
  • 2014.08.27oracle sql语句执行顺序

    千次阅读 2014-08-27 09:12:21
    oracle sql语句执行顺序 谷歌
  • Oracle 语句执行顺序

    2015-10-07 16:48:19
    1、FROM 子句:执行顺序为从后往前、从右到左。数据量较少的表尽量放在后面。 2、WHERE子句:执行顺序为自下而上、从右到左。将能过滤掉最大数量记录的条件写在WHERE 子句的最右。 3、GROUP BY:执行顺序...
  • Oracle select语法分析sql语句中用到最多的就是查询语句,想要更好的掌握使用查询语句需要了解oracle是如何解析执行sql语句的。在Oracle中SQL语句运行的机制语法分析,分析语句的语法是否符合规范,衡量语句中各...
  • 关于Oracle语句执行顺序

    千次阅读 2017-08-28 21:01:30
    一般来说Oracle执行sql语句,有如下优先顺序:1、from子查询 2、where子句 3、group by分组 4、having进行筛选 5、表达式计算 6、返回来执行select查询 7、将查询结果用order by排序 点击打开传送门(出此原文) ...
  • 举例证明Oracle语句执行顺序

    千次阅读 2014-09-27 10:17:47
    惯例先上oracle数据库版本信息:
  • Oracle sql语句执行顺序

    千次阅读 2018-12-09 14:33:23
    一、sql语句执行步骤: 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义。 2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限。 3)视图转换,将涉及视图的查询...
  • oracle中查询语句执行顺序

    千次阅读 2006-08-05 12:52:00
    oracle中查询语句执行顺序1.根据where子句选择行2.根据group by子句组合行3.为每个组计算分组函数结果4.再根据having子句选择和排除组5.根据order by 子句中的分组函数的结果对组进行排序. order by 子句必须使用...
  • 原文链接地址:... 一 sql语句执行步骤  1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义。  2) 语义分析,检查语句中涉及的所有数
  • SQL Select语句完整的执行顺序:1、from子句组装来自不同数据源的数据;2、where子句基于指定的条件对记录行进行筛选;3、group by子句将数据划分为多个分组;4、使用聚集函数进行计算;5、使用having子句筛选分组;...
  • SQL语句执行顺序

    2015-10-14 21:30:09
    SQL语句执行顺序如图: Created with Raphaël 2.1.0原始数据库VT1虚拟表,From语句VT2虚拟表,Where语句VT3虚拟表,求解聚合函数VT4虚拟表,Having语句VT5虚拟表,Order by语句VT6虚拟表,select 语句最终结果 sql语句的...
  • Oracle数据库,sql语句,where的执行顺序,是从左到右执行; 例子: 数据库中存储 scarleimp表 |sequence_no|transdate |seller_code| |202012211111|20201126|009| |202012211112|20201125|009| | | | scarle表 |...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 88,442
精华内容 35,376
关键字:

oracle语句的执行顺序