SQL总结

在编写SQL时,尽量使用绑定变量能够大量的减少语句硬解析带来的性能问题。
比如:select * from emp where empno=7788和select * from emp where empno=:empno;相比,第一次运行时两次语句执行的过程是一致的,都会进行硬解析,但是第二次执行相同的语句,只对查询条件作出改变时,两个查询语句的差异就出现了:
select * from emp where empno=和select * from emp where empno=:empno;
使用绑定变量时,数据库不会进行硬解析,直接进行软解析,将值带入,产生结果。

使用expdp导出数据库中的数据:
1. 创建一个导出目录:

2. 在sqlplus下创建一个导入导出目录:
 
3. 给予用户读写权限
 
4. 导出数据
 
导出后的文件:
 
Oracle里的优化器
优化器是Oracle数据库中内置的一个核心子系统,可以理解为一个核心模块或核心组件,其目的是按照一定的判断原则来得到他认为的目标SQL的最高效执行路径。
Oracle里优化器又分为RBO和CBO:
RBO(基于规则的优化器):在这种优化器中,执行计划的选择会先制定一个语句的执行等级,并会严格按照等级制定执行计划,具体说就是,Oracle数据库在执行一条语句时,会首先将各种类型的执行过程分等级,一共只有15个等级,在基于规则优化的情况下,数据库会认为执行过程的等级低,那么他的执行效率一定是最好的,所以在一条语句开始执行后,Oracle数据库一定会选择等级为1的那一条执行过程。但是在这跳执行过程的执行计划不一定是消耗资源最少的执行计划,所以在Oracle 10g出现时,已经比较少的使用。
CBO(基于代价的优化器):这种优化器在选择执行计划时,会首先根据统计信息进行估算,在估算出的所有的执行计划中,选择代价最少的那一个。这里的代价指的是这条SQL语句执行过程中所涉及的表,索引,列等对象经过统计计算出来的一个值。这个值里边包含了数据库在执行SQL时I/O,CPU等资源的消耗量。CBO的运行过程是这样的:当一条SQL被执行时,CBO会首先对这条SQL进行等价改写,然后对改写后得到的SQL进行执行过程的代价计算,在所有的SQL中找到其代价最小的那一条SQL作为原SQL的执行计划去执行,得到了执行计划后,数据库就会直接执行这条SQL。需要说明一下的是,Oracle数据库会选择这种基于代价的优化器是有原因的,它在计算代价的过程中很有可能不从头到尾将所有得到的SQL全部计算一边,他的计算方式是,如果我的这条SQL在代价计算过程中,已经超过了上个SQL的代价,那么这条SQL直接跳过,直到所有的执行过程全部计算完毕,最后得到的SQL执行过程就会被正真的去执行。

Oracle中的执行计划
对SQL语句进行优化,主要从SQL语句的执行计划入手,所以要想优化SQL语句,必须先获取SQL语句的执行计划。在Oracle数据库中想要获取执行计划必须先准备好以下工作,用户必须拥有DBA权限,由于统计信息保存在多张性能视图中,所以查看执行计划时,必须拥有查看性能视图的权限。创建PLAM_TABLE,Oracle会自动将统计信息写入这张表中去,创建表的方式只需要执行Oracle自带的.sql文件即可。
Oracle有以下几种方式获取执行计划:
EXPLAIN PLAN FOR,这种方式是在一些图形化集成工具中查看执行计划的本质方法,他有一下几个特点,1)不会正真执行SQL。2)没有信息输出。3)没有执行统计信息。4)有谓词信息。5)执行计划可能不是正真的执行计划。

autotrace开关,这种方式的特点是,1)需要等待SQL语句执行完成。2)有SQL语句执行结果。3)有执行统计信息。4)有谓词信息。

DBMS_XPLAN.DISPLAY_CURSOR(),这是Oracle自带的工具包,这种方式的特点是,1)需要等待SQL执行完成。2)有SQL的执行结果信息输出。3)有每一步实际处理的行数和逻辑读等信息。


SQL的AWR报告,这种方式的特点是,1)SQL语句只有被执行过,且被AWR记录下来,才能得到。2)可以看到已经从SHARED_POOL中被清除的执行计划。3)有指定快照之间的执行统计信息。4)看不到谓词信息。
10046跟踪事件,这是Oracle数据库自带的一种可以记录数据库一段时间各种信息的重要事件,这种方式的特点是:1)需要等SQL执行完成。2)有SQL语句执行结果信息的输出。3)解析时间和执行时间分别列出。4)可以看到相关的统计信息(逻辑读、物理读、写等,执行计划中的每一步执行时间精确到微秒)。5)如果SQL语句中有函数调用或其它递归调用,将会都被列出,6)看不到谓词信息。7)获取执行计划的步骤较复杂。
获取执行计划包括了执行SQL的每一步都需要消耗什么,语句执行的过程是什么,他会输出一张表级的信息,和一张树状图。例如最简单的SQL语句‘select * from dual’通过autotrace开关获取的执行计划如图所示:
 

这张图中,每一行代表语句执行的一个步骤。Statistics是数据库在执行这条语句时所消耗的资源

索引在中文中的意思是,将书籍中的每一页,或者比较重要的那一页,把他们的页码记录下来,并按照一定的顺序排列放好,在下次查看的时候就不需要一页一页的翻,直接根据页码寻找。在数据库中索引的含义其实和中文的意思差不多,但他记录的是数据库表对象的每一行的物理位置,也可以称之为rowID,在查询时,直接找到索引中此条记录的物理位置,通过物理位置直接寻找此条记录,这样可以避免产生大量的物理读和全表扫描。索引的结构图如下:

Oracle数据库中的B-Tree索引就类似一颗倒转过来的数,它包含了两种数据块,第一种是索引根节点、索引分支块,这种类型的数据块中储存的是下一级中每一块包含从一个物理位置到另一个物理位置的信息。第二种就是索引叶子块,这种数据块中存储的就是数据库中,创建索引那一列的物理位置

Oracle数据库中B-tree索引有以下特点:

所有的索引叶子块属于同一层,也就是说一条查询语句在执行时,找到不同数据的时间是一样的。

Oracle数据库会保证索引的叶子结点必须在同一级上。

通过索引区访问表里的数据,其效率不会随着表连接数量的增多而明显的下滑,也可以说通过索引查询一条数据的时间是可以控制的,基本稳定的。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值