`

sql执行机制

阅读更多
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp38

sql执行机制
1.对于普通的sql语句只有where条件的执行机制
    首先我们要了解一下SQL语句的执行过程。SELECT字段FROM表名WHERE条件表达式那它们是按什么顺序执行呢?
分析器会先看语句的第一个词,当它发现第一个词是SELECT关键字的时候,它会跳到FROM关键字,然后通过FROM关键字找到表名并把表装入内存。接着是找WHERE关键字,如果找不到则返回到SELECT找字段解析,如果找到WHERE,则分析其中的条件,完成后再回到SELECT分析字段。最后形成一张我们要的虚表。其它的先不说了,只说WHERE。WHERE关键字后面的是条件表达式。
    如果学过C语言等编程语言就会知道,条件表达式计算完成后,会有一个返回值,即非0或0,非0即为真(true),0即为假(false)。同理WHERE后面的条件也有一个返回值,真或假,来确定接下来执不执行SELECT。

例:SELECT*FROM STUDENT WHERE SNO='1';分析器先找到关键字SELECT,    然后跳到FROM关键字将STUDENT表导入内存,并通过指针p1找到第一条记录,接着找到WHERE关键字计算它的条件表达式,如果为真那么把这条记录装到一个虚表当中,p1再指向下一条记录。如果为假那么p1直接指向下一条记录,而不进行其它操作。一直检索完整个表,关把虚表返回给用户。

2.对于嵌套的sql语句
再说EXISTS谓词,EXISTS谓词也是条件表达式的一部分。当然它也有一个返回值(true或false)。例:SELECT Sname FROM Student WHERE EXISTS(SELECT*FROM SC WHERE SC.Sno=Student.Sno AND SC.Cno='1');这是一个SQL语句的嵌套使用,但和上面说的SQL语句的执行过程也是相同的。嵌套的意思也就是说当分析主SQL语句(外面的那个SELECT,我们权且先这么叫它)到WHERE关键字的时候,又进入了另一个SQL语句中。那么也就是说,分析器先找到表Student并装入内存,一个指针(例如p1)指向Student表中的第一条记录。然后进入WHERE里分析里面的SQL语句,再把SC表装入内存,另一个指针(例如p2)指向SC表中的第一条记录,分析WHERE后面的条件表达式,依次进行分析,最后分析出一个虚表2,也就变成SELECT Sname FROM Student WHERE EXISTS虚表2如果虚表为空表,EXISTS虚表2也就为false,不返回到SELECT,而p1指向下一条记录。



3.示列分析
select distinct(a.s_cid),SUM(N_JE),count(a.S_CID) from zw_yingyez a  inner join KG_BiaoKaXX b on a.S_CID=b.S_CID
where a.I_XiaoZhang=0
group by a.S_CID
having SUM(N_JE)>100
order by a.S_CID
执行顺序:
(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。
  8、 SELECT:处理SELECT列表,产生VT8。
  9、 DISTINCT:将重复的行从VT8中删除,产品VT9。
  10、ORDER BY:将VT9中的行按ORDER BY子句中的列列表顺序,生成一个游标(VC10)。
11、TOP:从VC10的开始处选择指定数量或比例的行,生成表TV11,并返回给调用者。



总结 :
执行顺序
FROM
JOIN
WHERE
GROUP
HAVING
SELECT
ORDER
SQL是按照这个顺序来的



Sql语句优化
1.WHERE后面的条件顺序影响
WHERE子句后面的条件顺序对大数据量表的查询会产生直接的影响,如
Select * from zl_yhjbqk where dy_dj = '1KV以下' and xh_bz=1
Select * from zl_yhjbqk where xh_bz=1 and dy_dj = '1KV以下'
以上两个SQL中dy_dj(电压等级)及xh_bz(销户标志)两个字段都没进行索引,所以执行的时候都是全表扫描,如果dy_dj = '1KV以下'条件在记录集内比率为99%,而xh_bz=1的比率只为0.5%,在进行第一条SQL的时候99%条记录都进行dy_dj及xh_bz的比较,而在进行第二条SQL的时候0.5%条记录都进行dy_dj及xh_bz的比较,以此可以得出第二条SQL的CPU占用率明显比第一条低。所以尽量将范围小的条件放在前面。

2.使用in时,在IN后面值的列表中,将出现最频繁的值放在最前面,出现得最少的放在最后面,这样可以减少判断的次数

3. exists 和 in 的效率 当两个表大小差不多的时候,效率差不多,但是当一个表大一个表小的时候,子查询表大的用exists,子查询表小的用in

in是把外表和内表作hash连接,而exists 是对外表作loop循环,每次loop循环再对内表进行查询。
列于表A(小表),表B(大表)
select * from A where cc in(select cc from B) 效率低
select * from A where where exists (select cc from B where cc=A.cc) 效率高

4.效率对比
createtime between '2011-7-4 0:00:00' AND '2011-8-4 23:59:59'
convert(varchar(10),createtime,112) between '20110704' and '20110804'

分享到:
评论

相关推荐

    mybatis直接执行sql语句后续之一

    下面我们将深入探讨MyBatis的SQL执行机制及相关知识点。 首先,MyBatis的核心组件是SqlSessionFactory,它是创建SqlSession对象的工厂,而SqlSession则是执行SQL语句的主要接口。通过SqlSession,开发者可以直接...

    sql内存管理机制

    SQL SERVER 2000的内存管理是其性能优化的关键部分,对于开发者来说,理解这一机制能帮助他们更好地优化数据库的运行效率。本文将深入探讨SQL SERVER 2000的内存管理,特别是从开发者的视角出发,解释服务器内存管理...

    sql server锁机制

    SQL Server的锁机制是数据库管理系统中用于控制并发访问和维护数据完整性的重要机制。它确保了在多用户环境中,数据能够被正确地读取和修改,防止出现数据不一致的情况。以下是对SQL Server锁机制的详细解释: 1. *...

    SQL脚本批量执行,方便大量的SQL脚本执行。

    在SQL的上下文中,批处理通常涉及将多个SQL语句写入一个文本文件,然后通过某种机制一次性执行这些语句。 1. **SQL Server Management Studio (SSMS)**:对于SQL Server用户,SSMS提供了一种直观的方式批量执行SQL...

    sql数据库 事务机制详解

    - DBMS,如SQL Server 2000,负责提供事务管理机制,如锁定、日志记录等,以保证事务的正确执行。开发者需要关注的是何时使用事务,以及事务对性能的影响。 4. **在.NET框架下的C#中使用SQL事务** 在C#程序中,...

    SQL的锁机制

    ### SQL的锁机制 在数据库管理系统(DBMS)中,锁机制是一种重要的并发控制手段,用于确保多个用户或进程能够安全地访问共享资源而不发生冲突。本文将详细探讨SQL Server中的锁机制及其工作原理。 #### 一、为什么...

    SQL server 中锁机制详解

    "SQL Server 锁机制详解" SQL Server 中的锁机制是为了提供并发控制,防止多个事务同时访问同一个资源时出现的问题。锁机制可以分为悲观锁和乐观锁两种。 悲观锁是一种保守的锁机制,为任何操作(即使是 select)...

    SQLServer锁机制探究

    SQL Server的锁机制是数据库管理系统中用于确保数据一致性、避免并发操作冲突的重要机制。在高并发的数据库环境中,正确理解和使用锁是至关重要的,因为它直接影响到系统的性能和稳定性。 首先,我们需要了解SQL ...

    sql调优工具mytun

    SQL调优是数据库管理中的重要环节,它涉及到对SQL查询的优化,以提高数据库的运行效率,减少资源消耗...通过深入理解SQL执行机制,结合MyTun提供的工具和建议,可以有效地解决数据库性能问题,保证系统的稳定高效运行。

    显示 sql 执行效率.

    这些信息对于理解 SQL 语句的运行机制和优化 SQL 语句至关重要。查看统计信息的方法如下: 1. **开启统计信息显示:** ```sql SET AUTOTRACE ON Statistics ``` 2. **查看统计信息示例:** ```sql --------...

    Oracle 高性能SQL引擎剖析:SQL优化与调优机制详解

    Oracle数据库的性能优化直接关系到系统的运行效率,而影响数据库性能...《Oracle 高性能SQL引擎剖析:SQL优化与调优机制详解》内容丰富且深入,破解了Oracle技术的很多秘密,适合Oracle数据库管理员、应用开发人员参考。

    SQL SERVER2008安全机制

    SQL Server 2008的安全机制是其核心功能之一,旨在保护数据库系统的数据和资源免受非法访问和操作。...理解并熟练掌握这些机制,对于数据库管理员来说至关重要,以确保系统的稳定运行和数据的保护。

    Oracle中SQL语句执行效率的查找与解决

    3. **SQL执行计划解析**:SQL语句的执行计划是理解其运行方式的关键。Oracle提供了多种工具来分析SQL执行计划,包括EXPLAIN PLAN和AUTOTRACE。通过这些工具,可以详细查看SQL语句如何访问表和索引,以及执行过程中...

    Oracle 高性能SQL引擎剖析SQL优化与调优机制详解

    Oracle数据库的性能优化直接关系到系统的运行效率,而影响数据库性能的一个重要因素就是SQL性能问题。本书是作者十年磨一剑的成果之一,深入分析与解剖OracleSQL优化与调优技术,主要内容包括: 第一篇“执行计划”...

    Sql tuning

    Chris Adkin的介绍提供了关于Oracle SQL调优的一些核心思想,虽然没有提供一个万能的调优步骤,但它确实强调了理解SQL执行机制的重要性。 首先,我们要明白,尽管数据库技术不断进步,目前的RDBMS(关系数据库管理...

    SQL Server 2000完结篇系列之三:数据并发-彻底掌握SQL Server 2000事务机制

    本篇将深入探讨SQL Server 2000的事务机制,帮助你全面理解并掌握如何在多用户环境下有效地处理数据并发。 首先,我们来了解事务的基本概念。事务是数据库操作的基本单元,它包含了一组逻辑相关的数据库操作。这些...

    PB 9 执行 多行 SQL

    - PB9允许开发人员通过动态SQL执行来处理多行SQL脚本。这涉及使用`ExecuteSQLString()`函数或`SQLCA.SQL`属性来执行存储在字符串变量中的SQL语句。 4. **读取SQL文件**: - 可以使用PB9的`FileOpen()`, `...

    SQL Server中存储过程比直接运行SQL语句慢的原因

    然而,有时人们发现存储过程的执行速度比直接运行SQL语句要慢,这主要归因于几个因素。 首先,存储过程的编译和缓存机制。存储过程在创建时进行一次性编译,之后的执行会使用已编译的计划,从而避免了每次执行时的...

    java批量执行SQL

    本文将详细介绍如何利用Java进行批量SQL执行,包括其背景、实现原理、代码示例及优化策略等。 #### 一、批量执行SQL的背景与意义 在日常的业务场景中,如用户注册、数据迁移或系统初始化等,往往涉及到大量的数据...

Global site tag (gtag.js) - Google Analytics