`
bestxiaok
  • 浏览: 455641 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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: wherecolumnin(select*from ... where ...); 2:... whereexists (select'X'from ...where ...); 第二种格式要远比第一种格式的效率高。在Oracle中可以几乎将所有的IN操作符子查询改写为使用EXISTS的子查询 使用EXIST,Oracle系统会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间 Oracle系统在执行IN子查询时,首先执行子查询,并将获得的结果列表存放在在一个加了索引的临时表中 避免使用having字句 避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销

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

1、from子句组装来自不同数据源的数据;
2、where子句基于指定的条件对记录行进行筛选;
3、group by子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用having子句筛选分组;
6、计算所有的表达式;
7、使用order by对结果集进行排序
逻辑查询处理步骤
代码如下:
(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筛选器。只有那些使<join_condition>为真的行才被插入VT2。
3. OUTER(JOIN):如果指定了OUTER JOIN,保留表中未找到匹配的行将作为外部行添加到VT2,生成VT3。
如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到
处理完所有的表为止。
4. 对VT3应用WHERE筛选器。只有使<where_condition>为TRUE的行才被插入VT4。
5. GROUP BY:按GROUP BY 子句中的列列表对VT4中的行分组,生成VT5。
6. CUBEROLLUP:把超组插入VT5,生成VT6。
7. HAVING:对VT6应用HAVING筛选器。只有使<having_condition>为TRUE的组才会被插入VT7。
8. SELECT:处理SELECT列表,产生VT8。
9. DISTINCT:将重复的行从VT8中移除,产生VT9。
10. ORDER BY:将VT9中的行按ORDER BY子句中的列列表排序,生成一个有表(VC10)。
11. TOP:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回给调用者。
以下是其它网友的补充:
好像自已在书写 SQL 语句时由于不清楚各个关键字的执行顺序, 往往组织的 SQL 语句缺少很好的逻辑, 凭感觉 "拼凑" ( 不好意思, 如果您的 SQL 语句也经常 "拼凑", 那您是不是得好好反省一下呢?, 呵呵).
这样做确实是爽了自己, 可苦了机器, 服务器还需要在我们的杂乱无章的 SQL 语句中寻找它下一句需要执行的关键字在哪里.
效率嘛, 由于我们的感觉神经对秒以下的变化实在不敏感, 暂且就认为自已写的 SQL 顺序无关紧要, "反正没什么变化!", 呵呵.其实服务器对每句 SQL 解析时间都会有详细记录的, 大家可以看一下自已按习惯写的 SQL 和按标准顺序写的SQL解析时间差别有多大.
因此, 建议大家在平时工作中 SQL 语句按标准顺序写, 一是专业, 二是实用, 呵呵, 不过我觉得最主要的是心里感觉舒服.
标准的 SQL 的解析顺序为:
(1).FROM 子句, 组装来自不同数据源的数据
(2).WHERE 子句, 基于指定的条件对记录进行筛选
(3).GROUP BY 子句, 将数据划分为多个分组
(4).使用聚合函数进行计算
(5).使用 HAVING 子句筛选分组
(6).计算所有的表达式
(7).使用 ORDER BY 对结果集进行排序
举例说明: 在学生成绩表中 (暂记为 tb_Grade), 把 "考生姓名"内容不为空的记录按照 "考生姓名" 分组, 并且筛选分组结果, 选出 "总成绩" 大于 600 分的.
标准顺序的 SQL 语句为:
select 考生姓名, max(总成绩) as max总成绩
from tb_Grade
where 考生姓名 is not null
group by 考生姓名
having max(总成绩) > 600
order by max总成绩
在上面的示例中 SQL 语句的执行顺序如下:
(1). 首先执行 FROM 子句, 从 tb_Grade 表组装数据源的数据
(2). 执行 WHERE 子句, 筛选 tb_Grade 表中所有数据不为 NULL 的数据
(3). 执行 GROUP BY 子句, 把 tb_Grade 表按 "学生姓名" 列进行分组
(4). 计算 max() 聚集函数, 按 "总成绩" 求出总成绩中最大的一些数值
(5). 执行 HAVING 子句, 筛选课程的总成绩大于 600 分的.
(7). 执行 ORDER BY 子句, 把最后的结果按 "Max 成绩" 进行排序.
好了,看了这些之后,我相信大家都知道了SQL中select语句的执行顺序了吧!

分享到:
评论

相关推荐

    SQL语句的执行原理及顺序

    了解 SQL 语句的执行顺序可以帮助开发人员更好地优化查询语句,提高数据库性能。 SQL 语句的执行顺序可以分为 11 个步骤: 1. FROM 子句:首先对 FROM 子句中的前两个表执行一个笛卡尔乘积,生成虚拟表 vt1。 2. ...

    当数据库复杂查询执行顺序与编写顺序原理及sql案例:同时出现了where_group_by_having_order_by的时候_执行顺序和编写顺序

    当同时出现了where_group_by_having_order_by的时候_执行顺序和编写顺序时的用法

    HiveSQL编译原理

    总结来说,HiveSQL编译原理是Hive处理SQL查询的核心机制,它包括词法分析、语法分析、逻辑规划、优化、物理规划和执行等多个阶段。理解这一原理对于提升Hive查询性能、优化大数据处理流程具有重要意义。在实际工作中...

    sql,编译原理课件

    当用户提交一个SQL查询时,数据库系统首先进行词法和语法分析,然后对查询进行优化,比如决定最佳的执行计划,这可能涉及到索引的使用、连接顺序的选择等。优化后的查询计划再被转换为低级的执行代码,最终由数据库...

    mysql之SQL查询原理

    一句简单的sql语句背后,mysql进行了很多临时表操作。本文档描述了sql中各关键字(FROM, JOIN, WHERE ,ORDER BY等)的执行顺序,便于深入理解sql执行原理。

    从零开始学习SQL查询语句执行顺序

    SQL查询语句的执行顺序是理解SQL工作原理的关键,它对于优化查询性能和编写有效查询至关重要。以下将详细解释每个步骤及其在实际查询中的应用。 首先,从标题和描述中我们可以得知,SQL查询语句的执行顺序是: 1. ...

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

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

    sql2000查询分析器

    SQL Server 2000 Query Analyzer是微软在SQL Server 2000时代推出的一款强大的数据库查询和管理工具...随着技术的发展,虽然已被更新的工具所取代,但对于学习和理解SQL查询原理,Query Analyzer仍然是一个宝贵的资源。

    SQL语句执行顺序图文介绍

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

    SQL语言查询优化方案探究

    通过对SQL语言原理的深入分析,可以发现影响查询效率的关键因素在于执行SQL语句的总执行代价。在集中式数据库环境下,查询执行开销主要由三个部分组成: 1. **I/O代价**:涉及到磁盘读写操作,是影响查询效率的主要...

    java SQL查询分析器开发

    通过上述步骤和技巧,你可以开发出一个强大而灵活的基于Java的SQL查询分析器,用于分析、优化和执行SQL语句,提高数据库系统的效率。记住,理解SQL语法规则和数据库原理是开发此类工具的基础,不断学习和实践是提升...

    85提纲挈领的告诉你,SQL语句的执行计划和性能优化有什么关系?.pdf

    执行计划显示了数据库执行SQL语句时的逻辑步骤,包括查询的顺序、使用的索引、返回的数据量估计、数据的排序和分组等操作。通过理解执行计划,数据库管理员和开发人员可以诊断性能问题,并相应地优化查询。 一、SQL...

    [罗振辉]SQL Server2000 数据库原理

    【SQL Server 2000 数据库原理】是IT领域中的一个重要主题,它涉及到数据库的基础概念、设计原理以及SQL语言的应用。在这个主题中,我们将会深入探讨以下几个关键知识点: 1. **数据库**: 数据库是一个组织和存储...

    SQLServer 索引查询优化指南

    - SQLServer的查询优化器是负责生成执行计划的组件,它根据查询语句、表统计信息和索引来决定最佳的执行路径。 - 优化器可能会选择全表扫描、索引扫描或索引查找等操作。 4. **索引的选择与设计** - 索引不是越...

    SQL Server 2000完结篇系列之六:设计高效的SQL语句进行查询优化

    通过查询执行计划,我们可以看到SQL Server实际是如何执行查询的,包括哪些操作、操作顺序以及资源消耗。通过图形化显示,可以直观地理解优化器的选择,并据此进行优化。 六、联接优化 在处理多表查询时,联接操作...

    SQL语句编写优化和基本原理总结

    本文将基于王崇安于2012年8月24日发布的《SQL语句编写优化和基本原理总结》,深入探讨SQL优化的二十多个关键点,涵盖共享SQL、SGA结构、查询优化策略以及具体的SQL编写技巧。 #### 共享SQL机制详解 共享SQL机制是...

    SQL 查询语句先执行 SELECT?兄弟你认真的么?

    SQL查询语句的执行顺序是数据库操作中的基本概念,对于编写高效的SQL至关重要。通常,我们按照逻辑顺序理解SQL语句的组成部分,但实际上,数据库引擎在执行时可能会进行优化,顺序并非总是严格按照语法结构来。这里...

    sql优化从原理到实战

    这包括分析SQL语句的执行计划,识别慢查询,以及理解SQL的逻辑执行顺序,如WHERE、JOIN、GROUP BY等子句的解析顺序。 2. **索引优化**:索引是提升查询速度的关键。学习如何创建合适的索引,如单列索引、复合索引、...

Global site tag (gtag.js) - Google Analytics