目录
常规 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 语句中,许多资料都建