志达IT
做快乐程序员

sql和oracle的区别(sql的执行顺序)

sqloracle的区别

一、敞开性
SQLServer只能在windows上运行,没有丝毫的敞开性,操作体系的体系的安稳对数据库是十分重要的。Windows9X系列产品是偏重于桌面运用,NTserver只适合中小型企业。而且windows渠道的可靠性,安全性和伸缩性对错常有限的。它不象unix那样久经考验,尤其是在处理大数据库。
Oracle能在一切主流渠道上运行(包含windows)。彻底支撑一切的工业规范。采用彻底敞开战略。可以使客户挑选最适合的解决方案。对开发商全力支撑。
二、可伸缩性,并行性
SQLserver并行实施和共存模型并不成熟,很难处理日益增多的用户数和数据卷,伸缩性有限。
Oracle并行服务器通过使一组结点同享同一簇中的工作来扩展windownt的能力,供给高可用性和高伸缩性的簇的解决方案。如果windowsNT不能满足需要,用户可以把数据库移到UNIX中。Oracle的并行服务器对各种UNIX渠道的集群机制都有着相当高的集成度。sql
三、功用
SQLServer多用户时功用不佳。
Oracle功用最高,坚持敞开渠道下的TPC-D和TPC-C的国际记录。
四、客户端支撑及运用模式
SQLServerC/S结构,只支撑windows客户,可以用ADO、DAO、OLEDB、ODBC连接。
Oracle多层次网络核算,支撑多种工业规范,可以用ODBC、JDBC、OCI等网络客户连接。
五、操作
SQLServer操作简单,但只有图形界面。
Oracle较复杂,同时供给GUI和命令行,在windowsNT和unix下操作相同。
六、运用危险
SQLserver彻底重写的代码,阅历了长期的测试,不断延迟,许多功用需要时间来证明。并不十分兼容。
Oracle长期的开发经历,彻底向下兼容。得到广泛的运用。彻底没有危险。最终价格上ORACLE贵过SQLSRVER。

sql的执行顺序

书写次序:
select->distinct->from->join->on->where->groupby->having->orderby->limit
履行次序
from->on->join->where->groupby(开始运用select中的别号,后边的句子中都能够运用别号)->sum、count、max、avg->having->select->distinct->orderby->limit
关键词含义
from:需求从哪个数据表检索数据
join:对需求相关查询的表进行相关
相关查询时,数据库会挑选一个驱动表,然后用此表的记载去相关其他表
leftjoin一般以左表为驱动表(rightjoin一般为右表),innerjoin一般以成果集少的表为驱动表,leftjoin某些情况下会被查询优化器优化为innerjoin
驱动表挑选准则:在对最终成果集没影响的前提下,优先挑选成果集最少的那张表作为驱动表
在运用索引相关的情况下,有IndexNested-Loopjoin和BatchedKeyAccessjoin两种算法
在未运用索引相关的情况下,有SimpleNested-Loopjoin和BlockNested-Loopjoin两种算法
SimpleNested-Loopjoin(SNLJ,简略嵌套循环衔接)算法:根据on条件,从驱动表取一条数据,然后全表扫面被驱动表,将符合条件的记载放入最终成果会集。这样驱动表的每条记载都伴随着被驱动表的一次全表扫描
匹配次数:外层表行数*内层表行数
IndexNested-LoopJoin(INLJ,索引嵌套循环衔接)算法:索引嵌套循环衔接是基于索引进行衔接的算法,索引是基于内层表的,经过外层表匹配条件直接与内层表索引进行匹配,防止和内层表的每条记载进行比较,然后利用索引的查询减少了对内层表的匹配次数
匹配次数:外层表行数*内层表索引高度
BlockNested-LoopJoin(BNLJ,缓存块嵌套循环衔接)算法:缓存块嵌套循环衔接经过一次性缓存多条数据,把参加查询的列缓存到JoinBuffer里,然后拿joinbuffer里的数据批量与内层表的数据进行匹配,然后减少了内层循环的次数(遍历一次内层表就能够批量匹配一次JoinBuffer里面的外层表数据)。
当不运用IndexNested-LoopJoin的时分,默认运用BlockNested-LoopJoin
BatchedKeyAccessjoin(BKAJ)算法:和SNLJ算法相似,但用于被join表上有索引能够利用,那么在行提交给被join的表之前,对这些行依照索引字段进行排序,因而减少了随机IO,排序这才是两者最大的区别,可是假如被join的表没用索引呢?那就运用BNLJ了sql
什么是JoinBuffer?
JoinBuffer会缓存所有参加查询的列而不是只要Join的列。
能够经过调整join_buffer_size缓存大小
join_buffer_size的默认值是256K,join_buffer_size的最大值在MySQL5.1.22版本前是4G,而之后的版本才能在64位操作系统下申请大于4G的JoinBuffer空间。
运用BlockNested-LoopJoin算法需求开启优化器管理装备的optimizer_switch的设置block_nested_loop为on,默认为开启。
在挑选Join算法时,会有优先级,理论上会优先判别能否运用INLJ、BNLJ:
IndexNested-LoopJoin>BlockNested-LoopJoin>SimpleNested-LoopJoin
注:能够运用explain查找驱动表,成果的第一张表即为驱动表,但履行计划在真正履行时可能发生改动
on:相关条件
where:过滤表中数据的条件
履行次序:自下而上、从右到左
注:对数据库记载收效,无法对聚合成果收效,能够过滤掉最大数量记载的条件必须写在where子句结尾,不能运用聚合函数(sum、count、max、avg)
groupby:如何将上面过滤出的数据分组
履行次序:从左往右
注:尽量在groupby之前运用where过滤,防止之后运用having过滤
avg:求平均值
having:对上面已经分组的数据进行过滤的条件
注:对聚合成果过滤,因而很耗资源,能够运用聚合函数
例:挑选统计人口数量大于100W的区域
selectregion,sum(population),sum(area)frombbcgroupbyregionhavingsum(population)>1000000,不能用where挑选超过100W的区域,因为不存在这样的一条记载
select:检查成果会集的哪个列或列的计算成果
distinct:对成果集重复值去重
orderby:依照什么样的次序来检查返回的数据
履行次序:从左到右
注:很耗资源
limit:截取出方针页数据

赞(0)
未经允许不得转载:志达IT网站 » sql和oracle的区别(sql的执行顺序)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

志达IT网站 每天分享编程和互联网的IT技术博客

登录/注册联系我们