易截截图软件、单文件、免安装、纯绿色、仅160KB

Oracle Sql 语句性能调优

这篇文章是玄机逸士为某上市公司的ERP系统调优所撰写报告的部分摘录,希望能够对大家有所帮助:
下面给出SQL优化经常遇到的情形。它们是在很多人长期积累的经验上总结出来的,这些都是一些一般性的结论,在实际工作中,还应当具体情况具体分析,并加以灵活运用。
(1)  用NOT EXISTS替换NOT IN 将更显著地提高效率,尽量用NOT EXISTS替代NOT IN。在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS。
例如,
SELECT ENMAE
from EMP
WHERE DEPTNO NOT IN
(
SELECT DEPTNO
from DEPT
WHERE LOC='BOSTON'
);
为了提高效率,可改写为,
(方法一:高效)
SELECT ENAME
from EMP A,DEPT B
WHERE A.DEPTNO = B.DEPTNO(+)
AND B.DEPTNO IS NULL
AND B.LOC(+) = 'BOSTON'
(方法二:最高效)
SELECT ENAME
from EMP E
WHERE NOT EXISTS
( SELECT 'X' from DEPT D WHERE
D.DEPTNO = E.DEPTNO AND LOC='BOSTON'
);
除此之外,推荐使用NOT EXISTS的一个重要的原因是NOT EXISTS在当子查询可能返回NULL的情况下,更加可靠,这是因为在比较列表中如果包含NULL,NOT IN条件将为false。考虑下面的语句,该语句试图在EMP表中查询出来没有一个下属的人员列表:
    SELECT ENAME, JOB from EMP
    WHERE EMPNO NOT IN (SELECT MGR from EMP);
       上面查询不会返回任何结果,因为某些记录的MGR字段是NULL值。正确的写法是:
       SELECT ENAME, JOB from EMP E
    WHERE NOT EXISTS (SELECT MGR from EMP WHERE MGR=E.EMPNO);
(2)  尽量避免在索引列上进行计算。
       WHERE子句中,如果索引列是函数的一部分。优化器将不使用索引而使用全表扫描。例如:
       低效的写法:
SELECT …
from DEPT
WHERE SAL * 12 > 25000;
高效的写法:
SELECT …
from DEPT
WHERE SAL > 25000/12;
这是一个非常实用的规则,请务必牢记。
(3)  用>=替代>
如果DEPTNO上有一个索引,
高效的写法:
SELECT *
from EMP
WHERE DEPTNO >=4
低效的写法:


相关文档:

Windows Oracle 10G手工创建数据库

在Oracle中建库,通常有两种方法。一是使用Oracle的建库工
且DBCA,这是一个图形界面工且,使用起来方便且很容易理解,因为它的界面友好、美观,而且提示也比较齐全。在Windows系统中,这个工具可以在Oracle程序组中打开(”开始”—“程序”—“ Oracle OraDb10g_home1”&mdash ......

Oracle 三种集合数据类型的比较

 Oracle 三种集合数据类型的比较:
PL/SQL中没有数组的概念,他的集合数据类型和数组是相似的。在7.3以前的版本中只有一种集合,称为PL/SQL表,在这之后又有两种集合数据类型:嵌套表和varray。其中varray集合中的元素是有数量限制的,index_by表和嵌套表是没有这个限制的。index-by表是稀疏的,也就是说下标可以不连续 ......

oracle client连接

最近一段时间一直没写博客,不是懒,是学了太多东西。以后慢慢补上。 1. odbc中添加oracle数据源 odbc中添加oracle数据源首要条件:安装oracle client。安装完之后添加,但是还必须在安装目录下通常是C:\oracle\ora90\network\ADMIN\tnsnames.ora中添加一个连接,如下格式: DXS =
  (DESCRIPTION =
  ......

如何正确删除ORACLE归档日志文件

 我们都都知道在controlfile中记录着每一个archivelog的相关信息,当然们在OS下把这些物理文件delete掉后,在我们的
controlfile中仍然记录着这些archivelog的信息,在oracle的OEM管理器中有可视化的日志展现出,当我们手工清除archive目录下的文件后,这些记录并没有被我们从controlfile中清除掉,也就是oracle并不 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号