如何减少对数据库的访问次数来加快sql执行

来源:互联网 发布:淘宝旺旺怎么找人 编辑:程序博客网 时间:2024/04/20 00:01
如何减少对数据库的访问次数来加快sql执行

=====================

1、合理使用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 LIKE ‘SMITH%';

这两个查询可以写成

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%';

用类似的方法也可以重新写GROUP BY 和ORDER BY子句。

----------------------

2、整合简单的查询

SELECT NAME FROM EMP WHERE EMP_NO = 1234;

SELECT NAME FROM DPT WHERE DPT_NO = 10 ;

SELECT NAME FROM CAT WHERE CAT_TYPE = ‘RD';

这三个查询可以写成:

SELECT E.NAME , D.NAME , C.NAME FROM CAT C , DPT D , EMP E,DUAL X
WHERE NVL(‘X',X.DUMMY) = NVL(‘X',E.ROWID(+))
AND NVL(‘X',X.DUMMY) = NVL(‘X',D.ROWID(+))
AND NVL(‘X',X.DUMMY) = NVL(‘X',C.ROWID(+))
AND E.EMP_NO(+) = 1234
AND D.DEPT_NO(+) = 10
AND C.CAT_TYPE(+) = ‘RD';

<理论如此,打死我也不会这么做~~~~~>

低效:

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;

--------------------------------

3、使用truncate代替delete

当删除表中记录时,要是回滚段来记录已经被删除的数据的信息,记录大量日志,用来做恢复使用
这样在操作的时候,对数据库来说是个不小的消耗
相反truncate是ddl,直接收回表所使用的空间,不记录日志,速度快,而且可以回收空间

----------------------------------

4、合理使用commit

commit后可以释放资源

a、释放回滚段上用于恢复数据的信息
b、释放锁
c、释放redo log buffer中的空间
d、为管理上述资源花费的内部消耗

但使用commit也要注意事务的完整性,而且过于频繁的commit也会带来性能的开销


原创粉丝点击