Oracle 数据库 - SQL 语言基础及调优(三)

本文详细介绍了Oracle数据库的SQL优化,包括避免使用“*”,用truncate替换delete,多用commit,减少表查询次数,以及用exists替代in。同时探讨了表连接优化,合理使用索引的重要性,如何时创建索引,选择索引列的策略,避免全表扫描。此外,还讲解了优化器的使用,数据库和SQL的重演,以及Oracle的SQL调优顾问和访问顾问,为数据库性能提升提供了全面的指导。
摘要由CSDN通过智能技术生成

目录

常规 SQL 语句优化

1、建议不用 “*” 来代替所有列名

2、用 truncate 代替 delete

3、在确保完整性的情况下多用 commit 语句

4、尽量减少表的查询次数

5、用 [NOT] exists 代替 [NOT] in

表连接优化

1、驱动表的选择

2、where 子句的连接顺序

合理使用索引

1、何时使用索引

2、索引列和表达式的选择

3、选择复合索引主列

4、避免全表扫描大表

5、监视索引是否被使用

优化器的使用

1、优化器的概念

2、运行 explain plan

3、Oracle 11g 中 SQL 执行计划的管理

数据库和SQL 重演

1、数据库重演

2、SQL重演

Oracle 的性能顾问

1、SQL 调优顾问

2、SQL 访问顾问


 

常规 SQL 语句优化

应用系统的性能优化包括对 SQL 语句、Oracle 系统、操作系统等的调整。其中工作量最大的就是 SQL 语句的调整,下面给出一些常见的 SQL 语句和一些技巧的解释。

1、建议不用 “*” 来代替所有列名

select 语句中可以用 “*” 来列出某个表的所有列名,但是这样的写法对 Oracle 系统来说会存在解析的动态问题。Oracle 系统会通过查询数据字典来将 “*” 转换成表的所有列名,这自然会消耗系统时间。建议用户在写 select 语句时,采用与访问表有关的实际列名。

 

2、用 truncate 代替 delete

使用 delete 表中的数据行时,Oracle 会使用撤销表空间(undo tablespace)来存放恢复的信息。在这期间,如果用户没有发出 commit 语句,而是发出 rollback 语句,Oracle 系统会将数据恢复到删除之前的状态。当用户使用 truncate 语句对表的数据进行删除时,系统不会将被删除的数据写到回滚段(或撤销表空间)中,速度当然要快得多。所以当希望对表或者簇中的所有行全部删除时,采用 truncate 命令更加有效。其语法格式如下:

truncate [ table | cluster ] schema.[ table_name ] [ cluster_name ] [drop | reuse storage ]; table_name :要清空的表名,cluster_name :要清空的簇名。 drop | reuse storage : reuse storage 表示保留被删除的空间以供该表的新数据使用,默认为 drop storage ,即收回被删除的空间系统。

另外需要注意的是,在 SQL  Plus 环境下,直接采用 truncate table 命令即可,但要在 PL/SQL 中使用,只能采用动态语句实现。

在这说明一下,直接使用 sql plus 环境下的用户模式是无法创建 afiedt.buf 文件的(后面 过程和PL/SQL 中经常使用,比较方便),至于为什么我没具体去查,但如果你从 系统命令行方式下进入的 sql plus 环境,那就可以创建。

 

3、在确保完整性的情况下多用 commit 语句

在 PL/SQL 块中,经常将几个相互联系的 DML 语句写在一个 begin ... end 块中,建议在每个块的 end 前面使用 commit 语句,这样就可以实现对象 DML 语句的及时提交,同时也释放事务所占用的资源

commit 所释放的资源包括:回滚段上用于恢复数据的信息,插销表空间也只做短暂的保留;被程序语句获得的锁;redo log buffer 中的空间;Oracle 为管理上述资源的内部花费。

 

4、尽量减少表的查询次数

在含有子查询的 SQL 语句中,要特别注意减少对表的查询。如:

在第一个查询语句中,对 dept 表执行了两遍的查询,而在第二个查询中,仅对 dept 表执行一遍的查询。在大量数据的情况下,显然第二种查询要比 第一种查询快得多。

 

5、用 [NOT] exists 代替 [NOT] in

在子查询中 ,[ NOT ] in 子句将执行一个内部的排序与合并,无论在哪种情况下,[ NOT ] in 都是最低效的,因为它对子查询中的表执行了一个全表遍历。为了避免使用 [ NOT ] in ,我们可以把它改写成外连接 (outer joins)、NOT EXISTS 或者 EXISTS 子句,如:

上面第一种就是低效率的 not in 子句,后面是高效率的 exists 子句。在 SQL 语句中,许多资料都建

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值