1. 排序
金句:能不排序就不排序!
除order by之外,一些隐含排序语句:
distinct
union(union all不排序)
2. 表连接
优化嵌套循环连接:可在被驱动表的连接字段和其他约束条件字段上建立复合索引,如
可在被驱动表dept表上建立(deptno, loc)复合索引。
如果没有d.loc = 'DALLAS'这个条件,那么在emp表上有empno这个索引就足够,不需要其他索引了。
总结:
要优化嵌套循环连接,或者在被驱动表的连接字段上建立索引,或者将连接字段和其他主要约束条件字段建立复合索引。
关于子查询
建议尽量少使用子查询,改用表连接,因为子查询可能使优化器选择错误的执行路径。
如果一定要使用子查询,要选择好到底使用 in 还是 exists
1) 如果限制性强的条件在子查询,选 in
2) 如果限制性强的条件的主查询,选 exists
如,以下两个查询分别使用了in和exists,是等效的。
表连接设计不良可能导致性能灾难
1)表连接字段的字段类型必须一致,否则索引被抑制,将使用全表扫描。
2)连接方式应该是简单的等号连接(如a.id = b.id),如果是复杂的公式,可能会导致笛卡尔连接。如果确有复杂连接的需求,建议新增冗余字段,然后与冗余字段连接。
金句:能不排序就不排序!
除order by之外,一些隐含排序语句:
distinct
union(union all不排序)
2. 表连接
优化嵌套循环连接:可在被驱动表的连接字段和其他约束条件字段上建立复合索引,如
点击(此处)折叠或打开
-
select e.*, d.*
-
from emp e, dept d
-
where e.deptno = d.deptno
-
and e.empno = 7499
- and d.loc = 'DALLAS';
如果没有d.loc = 'DALLAS'这个条件,那么在emp表上有empno这个索引就足够,不需要其他索引了。
总结:
要优化嵌套循环连接,或者在被驱动表的连接字段上建立索引,或者将连接字段和其他主要约束条件字段建立复合索引。
关于子查询
建议尽量少使用子查询,改用表连接,因为子查询可能使优化器选择错误的执行路径。
如果一定要使用子查询,要选择好到底使用 in 还是 exists
1) 如果限制性强的条件在子查询,选 in
2) 如果限制性强的条件的主查询,选 exists
如,以下两个查询分别使用了in和exists,是等效的。
点击(此处)折叠或打开
-
select e.*
-
from emp e
-
where e.empno = 7499
-
and deptno in (select deptno
-
from dept d
- where d.loc = 'DALLAS')
点击(此处)折叠或打开
-
select e.*
-
from emp e
-
where e.empno = 7499
-
and exists (select 1
-
from dept d
-
where e.deptno = d.deptno
- and d.loc = 'DALLAS');
表连接设计不良可能导致性能灾难
1)表连接字段的字段类型必须一致,否则索引被抑制,将使用全表扫描。
2)连接方式应该是简单的等号连接(如a.id = b.id),如果是复杂的公式,可能会导致笛卡尔连接。如果确有复杂连接的需求,建议新增冗余字段,然后与冗余字段连接。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22621861/viewspace-1307285/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/22621861/viewspace-1307285/

被折叠的 条评论
为什么被折叠?



