设为首页 加入收藏

TOP

从实际项目中总结出的20条数据库操作优化经验(二)
2015-11-21 01:36:31 来源: 作者: 【 】 浏览:1
Tags:实际 项目 结出 数据库 操作 优化 经验
ERE EMPNO > 0 AND EXISTS (SELECT ‘X' FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = MELB')
(低效)SELECT * FROM EMP(基础表) WHERE EMPNO > 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = MELB')

16.用EXISTS替换DISTINCT:
当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换, EXISTS使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果:
(低效):
SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D, EMP E
WHERE D.DEPT_NO = E.DEPT_NO
(高效):
SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT ‘X'
FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);

17.总是使用索引的第一个列:
如果索引是建立在多个列上,只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引.这也是一条简单而重要的规则,当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引

18.用WHERE替代ORDER BY:
ORDER BY子句只在两种严格的条件下使用索引:ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序&&ORDER BY中所有的列必须定义为非空.
WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列.
表DEPT包含以下列:
DEPT_CODE PK NOT NULL
DEPT_DESC NOT NULL
DEPT_TYPE NULL
低效: (索引不被使用)
SELECT DEPT_CODE FROM DEPT ORDER BY DEPT_TYPE
高效: (使用索引)
SELECT DEPT_CODE FROM DEPT WHERE DEPT_TYPE > 0

19.避免使用耗费资源的操作:
带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎执行耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作,而其他的至少需要执行两次排序.通常,带有UNION, MINUS,INTERSECT的SQL语句都可以用其他方式重写.如果你的数据库的SORT_AREA_SIZE调配得好,使用UNION , MINUS, INTERSECT也是可以考虑的,毕竟它们的可读性很强

优化GROUP BY:
提高GROUP BY语句的效率,可以通过将不需要的记录在GROUP BY之前过滤掉.
低效:
SELECT JOB , AVG(SAL) FROM EMP GROUP by JOB HAVING JOB = ‘PRESIDENT'
高效:
SELECT JOB , AVG(SAL) FROM EMP WHERE JOB = ‘PRESIDENT' GROUP by JOB

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇数据迁移经验总结――亿级别多表.. 下一篇Redis数据类型之字符串

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: