A,避免在索引列上使用 IS NULL 和 IS NOT NULL 操作

避免在索引中使用然后可以为空的列,ORACLE将无法使用该索引。对于单列索引  如果包含空值,索引将不存在此记录。对于复合索引 如果每个列都为空,索引中同样不存在此记录。如果至少有一个列不为空则记录存在于索引中

B, 用 UNION 替换 OR (适用于索引列)

通常情况下,用UNION替换where子句中的OR会起到较好的作用。对索引列使用OR会造成全表扫描。(以上规则只针对多个索引列有效,如果column没有被索引,查询效率可能会因为没有用OR而降低)

C, 分离表和索引

总是将你的表和索引建立在不同的表空间内(TABLESPACES).决不要将不属于ORACLE内部系统的对象存放到SYSTEM表空间里。同时,确保数据表空间和索引表空间于不同的硬盘上(通过指定表空间的方式可以实现这个要求)

D ,共享SQL语句

为了不重复解析相同的SQL语句,在第一次解析之后,ORACLE将SQL语句存放在内存中,这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享,因此,当你执行一个SQL语句(有时被称为个游标)时,如果它和之前的执行过的语句完全相同,ORACLE就能很快获得已经被解析的语句以及最好的执行路径。ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用。当你向ORACLE提交一个SQL语句,ORACLE会首先在这块内存中查找相同的语句.这里需要注明的是,ORACLE对两者采取的是一“种严格匹配,要达成共享,SQL语句必须完全相同(包括空格,换行等)

E,WHERE子句连接顺序

WHERE子句中的连接顺序,
ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数让记录的条件必须写在WHERE子句的末尾

F,SELECT 子句避免使用 *

当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 * 是一个方便的方法。 但,不幸的是 这是一个非常低效的方法.实际上,ORACLE在解析的过程中,会将*依次转换成所有的列名,这个工作是通过查询数据字典完成的,这意味着将耗费更多的时

G,使用DECODE函数来减少处理时间

使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表,

例如:

SELECT COUNT(*),SUM(SAL)
FROM EMP
WHERE DEPT_NO= 0020
AND ENAME LIKE 'SMITH%';

SELECT COUNT(*),SUM(SAL)
FROM EMP
WHERE DEPT NO = 0030
AND ENAME UKE 'SMITH%';

你可以用DECODE函数高效地得到相同结果
SELECT COUNT(DECODE(DEPT NO,0020,'X',NULL)) D0020_ COUNT,COUNT(DECODE(DEPT NO,0030,'X',NULL)) D0030_ COUNT,SUM(DECODE(DEPT NO,0020,SAL,NULL) D0020_ SAL,SUM(DECODE(DEPT_NO,0030,SAL,NULL) D0030_ SAL FROM EMP WHERE ENAME LIKE 'SMITH%';
类似的,DECODE函数也可以运用于GROUP BY和ORDER BY子句中。

H,用TRUNCATE替代DELETE

当删除表中的记录时,在通常情况下,回滚段(rollback segments)用来存放可以被恢复的信息。如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况)而当运用TRUNCATE时,回滚段不再存放任何可被恢复的信息,当命令运行后,数据不能被恢复因此很少的资源被调用,执行时间也会很短。

(注意: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML)

I,尽量多使用COMMIT

只要有可能,在程序中尽量多使用COMMIT,这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:COMMIT所释放的资源:

a.回滚段上用于恢复数据的信息,

b.被程序语句获得的锁

C. redo log buffer中的空间

d. ORACLE为管理上述3种资源中的内部花费
(注意:在使用COMMIT时必须要注意到事务的完整性,现实中效率和事务完整性往往是鱼和熊掌不可得兼)

J,WHERE子句替换HAVING子句

避免使用HAVING子句,HAVING只会在检索出所有记录之后才对结果集进行过滤.这个处理需要排序,总计等操作.如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销。

K,用EXISTS替换IN

在许多基于基础表的查询中,为了满足一个条件,往往 需要对另 一个表进行联接 在这种情况下,使用EXISTS(或NOT EXISTS)通常将提高查询的效率

L,用NOT EXISTS替代NOT IN

在子查询中,NOT IN子句将执行一一个内部的排序和合并无论在哪种情况下,NOT IN都是最低效的(因为它对子查询中的表执行了一个全表遍历).为了避免使用NOT IN,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS

Oracle数据库如何提高访问性能的更多相关文章

  1. 通过缓存数据库结果提高PHP性能(转)

    众所周知,缓存数据库查询的结果可以显著缩短脚本执行时间,并最大限度地减少数据库服务器上的负载.如果要处理的数据基本上是静态的,则该技术将非常有效.这是因为对远程数据库的许多数据请求最终可以从本地缓存得 ...

  2. Holer实现oracle数据库外网访问

    外网访问内网Oracle数据库 内网主机上安装了Oracle数据库,只能在局域网内访问,怎样从公网也能访问本地Oracle数据库? 本文将介绍使用holer实现的具体步骤. 1. 准备工作 1.1 安 ...

  3. ORACLE数据库学习之SQL性能优化详解

                                                                                    Oracle  sql 性能优化调整 ...

  4. Oracle数据库的sql语句性能优化

    在应用系统开发初期,由于开发数据库数据比较少,对于查询sql语句,复杂试图的编写等体会不出sql语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目 ...

  5. DB2数据库中提高INSERT性能详解

        分类: Linux INSERT 处理过程概述 首先让我们快速地看看插入一行时的处理步骤.这些步骤中的每一步都有优化的潜力,对此我们在后面会一一讨论. 在客户机准备 语句.对于动态 SQL,在 ...

  6. Oracle数据库穿越防火墙访问

    原因 Oracle listener 只起一个中介作用,当客户连接它时,它根据配置寻找到相应的数据库实例进程,然后spawned一个新的数据库连接,这个连接端口由listener传递给客户机,此后客户 ...

  7. Oracle数据库十大常见性能问题

    错误的连接管理 oracle的连接是耗时耗力的操作,不应像sqlserver那样使用连接 错误的使用游标和共享池 一般是没有使用绑定变量 不好的SQL语句 使用大量资源的SQL语句都应该好好检查是否可 ...

  8. 实现asp.net mvc页面二级缓存,提高访问性能

    实现的mvc二级缓存的类 //Asp.Net MVC视图页面二级缓存 public class TwoLevelViewCache : IViewLocationCache { private rea ...

  9. 访问Oracle数据库的工具【unfinished】

    ylbtech-Oracle:访问Oracle数据库的工具 访问Oracle数据库的工具 1. SQL*PLUS返回顶部 1.0, 1.0.1, 之network\admin\tnsnames.ora ...

随机推荐

  1. Html5与Css3知识点拾遗(三)

    文本 small:包括免责申明.注意事项.法律限制.版权信息,只适用于短于,常包含在页面级的footer里 H5对i和b的重新定义 b:提醒文字.不传达任何额外的语气.文档摘要关键词.评论中的产品名. ...

  2. EF6学习笔记(六续) 复杂数据模型建表测试

    测试以下几种模型关系: 1对1或0  . 1对多  . 多对多 1 对 1 或 0 如果直接定义两个模型,相互直接增加导航属性,会提示错误,必须为这个对应关系设定主副关系: public class ...

  3. XE下显示托盘图标(TrayIcon)

    https://www.cnblogs.com/studypanp/p/4930619.html XE下显示托盘图标(TrayIcon)   1.拖一个TrayIcon控件 2.拖一个Applicat ...

  4. 6. ASP.NET MVC 5.0 中的HTML Helper【HTML 帮助类】

    这篇文章,我将带领大家学习HTML Helper.[PS:上一篇-->5.ASP.NET MVC 中的Area[区域]是什么] HTML Helpers是用来创建HTML标签进而创建HTML控件 ...

  5. 75道经典AI面试题,我就想把你们安排的明明白白的!(含答案)

    基础知识(开胃菜) Python 1.类继承 有如下的一段代码: class A(object): def show(self): print 'base show' class B(A): def ...

  6. phpMyAdmin 4.7.x CSRF 漏洞利用

    作者:Ambulong phpMyAdmin是个知名MySQL/MariaDB在线管理工具,phpMyAdmin团队在4.7.7版本中修复了一个危害严重的CSRF漏洞(PMASA-2017-9),攻击 ...

  7. Android开发工程师文集-1 小时学会各种Drawable

    前言 大家好,给大家带来Android开发工程师文集-1 小时学会各种Drawable的概述,希望你们喜欢 Drawable介绍 Drawable为抽象类,drawable与view有区别的地方,主要 ...

  8. python 输出“Hello, world”

    目的:制作第一个项目,输出“Hello, world” 首先查看自己电脑上的python版本号,方法打开cmd输入python 如果提示:不是内部或外部命令,也不是可运行的程序或批处理文件.那么需要设 ...

  9. (转)Linux 系统设置 : dmesg 命令详解

    原文:https://blog.csdn.net/yexiangCSDN/article/details/80683246 https://www.cnblogs.com/duanxz/p/34770 ...

  10. 2.WF 4.5 流程引擎设计思路

    本文主要给大家分享下基于WF 4.5框架的流程引擎设计思路 1.流程启动时的数据写入EventMsgPP对象中,ObjectAssemblyType记录流程启动时需要的类型,ObjectContent ...