1、不要用 '*' 代替所有列名,特别是字段比较多的情况下

  使用select * 可以列出某个表的所有列名,但是这样的写法对于Oracle来说会存在动态解析问题。Oracle系统通过查询数据字典将 '*' 转换成表的所有列名,这自然会消耗系统时间。

  2、进行全表删除时,用truncate代替delete

  当用delete删除表的数据行时,Oracle会使用撤销表空间(UNDO tablespace)来存放恢复的信息。在这期间,如果用户没有发出commit语句,而是发出rollback语句,Oracle系统会将数据恢复到删除之前的状态,当用户使用truncate对表的数据进行删除时,系统不会将被删除的数据写到回滚段(撤销表空间)里,速度自然快些。

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

  在PL/SQL块中,经常将几个相互联系的DML语句写到一个BEGIN...END块中,建议在每个DML语句结尾加上commit,这样可以使用对象DML语句及时提交,同时也释放事务所占用的资源。

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

  在含有多个子查询的sql中,要注意减少对表的查询。
  示例:

    --Inefficient sql
select tab_name1,tab_name2 from table_name
where tab_name1 = (select tab_n1 from table_n)
and tab_name2 = (select tab_n2 from table_n)
--Efficient sql
select tab_name1,tab_name2 from table_name
where (tab_name1,tab_name2)= (select tab_n1,tab_n2 from table_n)

  5、使用exists代替in,使用not exists代替not in

  在子查询中,in使用一个内部的排序和合并,无论在哪种情况下,not in都是最低效的,因为它对子查询中的表执行了全表遍历,为了避免使用not in,我们可以把它改写为外连接(outer join)或者是not exists。但并不代表not in 完全不可用,我们一分为二来看待此问题:若子查询返回的数据集较复杂,避免使用not in;当子查询返回的数据集较简单或者可枚举,not in也可以使用。

  exists和in使用同理。

  6、合理使用函数

  不合理的函数使用方式会对数据库造成严重的性能问题,即使一个非常简单的函数,因为其使用不当,都可能造成严重的后果。

  示例:

    --Inefficient sql
for i in 0...10 LOOP
select count(*) into i_cnt from race_results
where horse_name = format_name('xiaobai');
end LOOP;
--Efficient sql
for i in 0...10 LOOP
select count(*) into i_cnt from race_results
where horse_name = (select format_name('xiaobai') from dual);
end LOOP;

  当函数在where子句中使用时,查询结果得到的每一行记录均会调用该函数一次。

  7、正确选择from表顺序

  在基于规则的优化器(Rule-based Optimizer)下,Oracle解析器按照从右至左的顺序处理from后的表名,因此写在from中最后的表将会被先处理,先处理的表也称为驱动表,在from子句中包含多个表的情况下,建议选择数据量最少的表作为驱动表。原因:当Oracle处理多个表时,会运用排序或合并的方式连接它们。首先,系统扫描from中最后的表,并对该表的数据进行排序;然后,扫描from中倒数第二个表;最后,将所有从第二个表中检索出来的记录和第一个表中的合适记录进行合并,取交集。

  如果有三个以上的表连接,则建议使用交叉表(intersection table)作为驱动表,所谓交叉表指的是被其他表所引用的表。

  8、where子句条件的连接顺序

  Oracle采用自下而上顺序解析where子句,按照这个原理,表连接的条件必须写在其他条件之前,那些能过滤掉最大记录的条件必须写在where子句的末尾,也就是表在连接操作以前,能过滤的数据量越大越好。

最新文章

  1. Asp.Net Mvc + ComBoost.Mvc快速开发
  2. jQuery uploadify 文件上传
  3. 设置 TabBarItem 选中时的图片及文字颜色
  4. 【转】基于 CoreText 实现的高性能 UITableView
  5. bzoj2592: [Usaco2012 Feb]Symmetry
  6. Oracle表空间、段、区和块
  7. IOS UILabel自动换行
  8. 效果类似于label从下往上滑(采用uiTableView实现)
  9. Linux 下通过脚本实现远程自动备份
  10. 解决64位系统下IIS 8下Asp+Access网站配置
  11. linux系统文件属性-硬连接、软连接
  12. python常用操作
  13. 配置RMAN备份环境
  14. 【问题】vs IIS破除文件上传限制最全版
  15. Nginx 参数配置相关
  16. Golang覆盖写入文件的小坑
  17. C# 网络通信功能 同步数据交互开发
  18. ireport部署到Linux服务器上遇到的问题解决
  19. 在Winform中菜单动态添加“最近使用文件”
  20. Dynamics 365Online 通过插件中的retrievemultiple消息来过滤产品视图

热门文章

  1. 【转】Android Shape绘制虚线在手机端查看是实线的问题
  2. HttpClient 发送 HTTP、HTTPS
  3. JDBC远程连接数据库
  4. gorm中数据库datetime类型的映射和time.Time的格式化
  5. Memtester——Linux内存测试工具
  6. Marriage Match IV(最短路+网络流)
  7. curl: (60) SSL certificate problem: unable to get local issuer certificate 错误
  8. 配置静态IP
  9. Mathtype使用技巧
  10. 一款APP的交互文档从撰写到交付