sql的优化原则

来源:互联网 发布:windos系统删除mac系统 编辑:程序博客网 时间:2024/05/17 10:43
1、查询所有时, *和列名,尽量用列名代替*
原因:
*代表所有的列名,oracle首先要判断*属于哪个表,而用列名,不需要判断,效率高
2、where解析的顺序: 右-> 左, and如果一个为假,所有都为假,把假的放在右边
where condition1 and condition2
where condition2 and condition1
如果是or,or一个为真则为真,把真的放在右边
where condition2 orcondition1
3、条件中没有组函数的情况下,尽量使用where,而不是having
原因:
where 先过滤在分组
having先分组在过滤
加入100条中就一条符合的,如果先分组要将100条分组,性能太差,用wehre直接过滤出1条然后在分组。
4、理论上:当子查询和多表查询功能一样的时候,尽量用多表查询

原因: 子查询实现,有两个from,操作了两次,而多表查询就一个from操作了一次,但是多表查询笛卡尔乘积列很多,所以说是理论上

子查询:
SQL> select *
2 from emp
3 where deptno=(select deptno from dept where dname='SALES');

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7900 JAMES CLERK 7698 03-12月-81 950 30

多查询:
SQL> select e.*
2 from emp e,dept d
3 where e.deptno=d.deptno and d.dname='SALES';

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7900 JAMES CLERK 7698 03-12月-81 950 30
5、视图 是为了简化查询,不存数据,是虚表,数据存储在表中,但是效率低,如果希望存数据,可以使用物化视图。

6、 索引不一定能加快查询速度。
原创粉丝点击