SQL语句优化(一)

当一条SQL语句从客户端进程传递到服务器端进程后,Oracle需要执行如下步骤:

  • 在共享池中搜索SQL语句是否已经存在;
  • 验证SQL语句的语法是否正确;
  • 执行数据字典来验证表和列的定义;
  • 获取对象的分析锁,以便在语句的分析过程中对象的定义不会改变;
  • 检查用户是否具有相应的操作权限;
  • 确定语句的最佳执行计划;
  • 将语句和执行方案保存到共享的SQL区;

1)select语句中避免使用“*”

Oracle系统需要通过数据字典将语句中的“*”转换成表中的所有列名,然后再执行查询操作,这自然要比直接使用列名花费更多的时间。

若共享池中存在要执行的SQL语句,Oracle会重用已解析过的语句的执行计划和优化方案,执行时间减少。

2)使用where子句替代having子句

where子句和having子句都可以用来过滤数据行,但having子句会在检索出所有记录后才对结果集进行过滤(先分组再过滤);而使用where子句就会减少这方面的开销(先过滤再分组)。因此,一般的过滤条件应该尽量让where子句实现。

having子句一般用于对一些集合函数执行结果的过滤,如count()、avg()等。

3)使用truncate替代delete

使用delete删除表中的所有数据时Oracle会对数据逐行删除,且使用回滚段记录删除操作,若用户在没有使用commit提交之前使用rollback命令进行回滚操作,则Oracle会将表中的数据恢复到删除之前的状态。

使用truncate语句删除表中的所有数据行时,Oracle不会再撤销表空间中记录删除操作,即不能使用rollback恢复,这就提高了语句的执行速度。且这种删除是一次性的,也就是执行一次truncate语句,所有的数据行是在同一时间被删除。

truncate只能实现删除表中的全部数据,若需要删除某一条记录,还需要使用delete语句进行操作。

4)在确保完整性的情况下多用commit语句

用户执行DML操作后,若不使用commit进行提交,则Oracle会在回滚段中记录DML操作,以便用户使用rollback命令对数据进行恢复。Oracle实现这种数据回滚功能,需要花费相应的时间和空间资源。

使用commit命令后,系统将释放回滚段上记录的DML操作信息、被程序语句获得的锁、Redo Log Buffer中的空间以及Oracle系统管理前面3种资源所需要的其他开销。

5)使用表连接而不是多个查询

一般情况下,从多个相关表中检索数据时,执行表连接比使用多个查询的效率更高。在执行每条查询语句时,Oracle内部执行了许多工作----解析SQL语句、估算索引的利用率、绑定变量,以及读取数据块等。因此,要尽量减少访问SQL语句的执行次数,即尽量减少表的查询次数。可以使用一次查询获得的数据,尽量不要通过两次或更多次的查询获得。

6)使用exists替代in

in操作符用于检查一个值是否包含在列表中。exists与in不同,exists只检查行的存在性,而in检查实际的值。在子查询中,exists提供的性能通常比in提供的性能要好。因此建议使用exists操作符来替代in操作符的使用,使用not exists替代not in,来提高查询的执行效率。

7)使用exists替代distinct

在连接查询的select语句中,distinct关键字用于禁止重复行的显示;exists用于检查子查询返回的行的存在性。尽量使用exists替代distinct,因为distinct在禁止重复行显示之前要排序检索到的行。

8)使用<=替代<

这两个运算符的区别在于,如果使用x<8888,则Oracle会定位到8888,然后再去寻找比8888小的数据;如果使用x<=8887,则Oracle会直接定位到等于8887的数。虽然这种优化显得差别不大,但是在查询的数据量较大,尤其是在循环语句中使用这两个比较操作符时,区别会是很明显的。

9)使用完全限定的列引用

在查询中包含多个表时,为每个表指定表别名,并且为所引用的每列都显示地指定合适的别名,这称为完全限定 的列引用。这样,数据库不需要查询所操作的表中包含了哪些的列,也就减少了解析列的时间,以及由列歧义引起的语法错误(列歧义指SQL语句中不同的表具有相同的列名,当SQL语句中出现这个列时,SQL解析器无法判断这个列属于哪个表)。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值