注:转自大神
存储过程的核心还是sql文,为了执行一定的任务而组合在一起的SQL、PL/SQL语句集,不是为了加快查询速度,视图是建立的一个虚表可以加快查询速度,设计数据库满足第三范式。要想加快查询速度除了可以建索引外,优化sql文是关键,
如下:1.解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理.
例如: 表 TAB1 16,384 条记录 表 TAB2 1 条记录
选择TAB2作为基础表(最好的方法)
select count(*) from tab1,tab2
执行时间0.96秒
选择TAB1作为基础表(不佳的方法)
select count(*) from tab2,tab1
执行时间26.09秒
2.WHERE子句中的连接顺序.
采用自下而上的顺序解析WHERE子句.
根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.
例如:
(低效,执行时间156.3秒)
SELECT …
FROM EMP E
WHERE SAL > 50000
AND JOB = 'MANAGER'
AND 25 < (SELECT COUNT(*)
FROM EMP
WHERE MGR=E.EMPNO);
(高效,执行时间10.6秒)
SELECT …
FROM EMP E
WHERE 25 < (SELECT COUNT(*)
FROM EMP
WHERE MGR=E.EMPNO)
AND SAL > 50000
AND JOB = 'MANAGER';
3.减少访问数据库的次数
方法1(低效)
SELECT EMP_NAME ,
SALARY ,
GRADE
FROM EMP
WHERE EMP_NO = 342;
SELECT EMP_NAME ,
SALARY ,
GRADE
FROM EMP
WHERE EMP_NO = 291;
方法2(高效)
SELECT A.EMP_NAME ,
A.SALARY ,
A.GRADE,
B.EMP_NAME ,
B.SALARY ,
B.GRADE
FROM EMP A,
EMP B
WHERE A.EMP_NO = 342
AND B.EMP_NO = 291;
4.用EXISTS替代IN