Oracle性能一

Oracle性能一
 

1、where条件中关于日期的,求前10天的记录

bad:

SELECT *

FROM tablename

WHERE intime>= sysdate-10

Better:

SELECT *

FROM tablename

WHERE intime between sysdate - 10 and sysdate

2、如果sql执行次数频繁,且数据量较小,可以把表数据存放到tuxedo共享内存获取数据

3、计算记录条数

   和一般的观点相反, count(*) 比count(1)稍快 , 当然如果可以通过索引检索,对索引列的计数仍旧是最快的. 例如 COUNT(EMPNO)

4、用EXISTS替代IN

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

5、用NOT EXISTS替代NOT IN

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

6、优化GROUP BY

提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉.下面两个查询返回相同结果但第二个明显就快了许多.

 低效:

   SELECT JOB , AVG(SAL)

   FROM EMP

   GROUP JOB

   HAVING JOB = ‘PRESIDENT’

   OR JOB = ‘MANAGER’

 高效:

   SELECT JOB , AVG(SAL)

   FROM EMP

   WHERE JOB = ‘PRESIDENT’

   OR JOB = ‘MANAGER’

 GROUP by JOB

7、减少对表的查询

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

例如:

     低效

          SELECT TAB_NAME

          FROM TABLES

          WHERE TAB_NAME = ( SELECT TAB_NAME

                                FROM TAB_COLUMNS

                                WHERE VERSION = 604)

          AND DB_VER= ( SELECT DB_VER

                           FROM TAB_COLUMNS

                           WHERE VERSION = 604)

     高效

          SELECT TAB_NAME

          FROM TABLES

          WHERE (TAB_NAME,DB_VER)

 = ( SELECT TAB_NAME,DB_VER)

                   FROM TAB_COLUMNS

                   WHERE VERSION = 604)

     Update 多个Column 例子:

     低效:

          UPDATE EMP

          SET EMP_CAT = (SELECT MAX(CATEGORY) FROM EMP_CATEGORIES),

              SAL_RANGE = (SELECT MAX(SAL_RANGE) FROM EMP_CATEGORIES)

          WHERE EMP_DEPT = 0020;

     高效:

          UPDATE EMP

          SET (EMP_CAT, SAL_RANGE) = (SELECT MAX(CATEGORY) , MAX(SAL_RANGE)

FROM EMP_CATEGORIES)

          WHERE EMP_DEPT = 0020;

8、程序中用到计算的数值,在查询时一定要用nvl(colnum,0),否则返回值可能为null,这样在程序计算时用到parseInt之类的转换时,会报空指针异常。

你可能感兴趣的:(Oracle性能一)