SQL数据库优化高度总结,只为概括复习,不负责深入浅出,面试专用!
2016-03-09 09:47
771 查看
一.确保数据查询使用索引
1.在首字确定情况下,like尽量避免使用首字百分号,%号放后面是会使用索引的
2.<>不等于表达式不走索引,尽量使用大于小于代替
3.不要使用IN,用exists代替
4.OR不走索引,尽量用UNION代替
5.联合索引顺序有讲究,只有按顺序索引才生效
6.索引列一定不能存在null值,否则索引失效
二、SQL解析优化
1.SQL解析FROM是从右到左,如果是多表关联,把最简单的表写在最右边。
2.SQL解析条件是从下到上,所以表之间关联一定要写在其他表的条件之前。
3.SELECT中避免使用*,*需要耗费解析器工作.
4.使用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%’;
你可以用DECODE函数高效地得到相同结果
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%’;
5.使用ROWID进行高效操作
例如:删除重复的数据
DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)
FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
6.删除全表数据时,使用DDL'TRUNCATE'代替Delete
7.事务要及时提交,一般表建议在2w左右的数据进行提交
8.一对多关联时,如果结果集是小的数据,尽量使用EXISTS
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);
10. 尽量使用union all代替union
1.在首字确定情况下,like尽量避免使用首字百分号,%号放后面是会使用索引的
2.<>不等于表达式不走索引,尽量使用大于小于代替
3.不要使用IN,用exists代替
4.OR不走索引,尽量用UNION代替
5.联合索引顺序有讲究,只有按顺序索引才生效
6.索引列一定不能存在null值,否则索引失效
二、SQL解析优化
1.SQL解析FROM是从右到左,如果是多表关联,把最简单的表写在最右边。
2.SQL解析条件是从下到上,所以表之间关联一定要写在其他表的条件之前。
3.SELECT中避免使用*,*需要耗费解析器工作.
4.使用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%’;
你可以用DECODE函数高效地得到相同结果
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%’;
5.使用ROWID进行高效操作
例如:删除重复的数据
DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)
FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
6.删除全表数据时,使用DDL'TRUNCATE'代替Delete
7.事务要及时提交,一般表建议在2w左右的数据进行提交
8.一对多关联时,如果结果集是小的数据,尽量使用EXISTS
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);
10. 尽量使用union all代替union
相关文章推荐
- 转载java面试
- 我的第二次找工作之旅
- 面试前端工程师
- .NET面试题解析(05)-常量、字段、属性、特性与委托
- 面试了有几家了,总结一下,为下次面试做准备
- 读《Android开发艺术探索》后的面试题整理
- 前端程序员:月薪5K到5万,我干了啥
- 2016十家公司前端面试小记
- 我是如何从煤矿工成为程序员的
- 两个程序员的故事
- 揭秘阿里巴巴人力资源体系:牛逼的团队是如何建立的?
- 迈出走向程序员的第一步
- 面试前需要弄懂的SQL
- 管理岗是什么鬼?
- 【程序员必备】sql语句大全
- iOS面试 类的扩展,分类,延迟的方法,懒加载
- 一个程序员的爱情故事
- JAVA面试题
- android面试总结(1)
- 程序员面试金典(动态规划):1分,5分,10分,25分硬币面值组合问题(解题思路)