sql优化学习(一)

找到一套好的sql优化视频,地址如下:

http://www.ppvke.com/10355.html

p.s. 我在百度搜索半天都是些乱七八糟的东西,我用google搜索后,立刻就发现上面的视频地址,看了一些后,发现蛮有收获的,跟大家分享。

视频一共十五周,前四周的内容,听完了,也没做练习,权当听故事。从第五周的开始,我发现需要认真听,认真练习。如果时间不充裕,从第五周开始学习也可以。(个人意见)

 

1. 绑定变量
1 select aaa,bbb from ccc where ddd=fff;
2 select aaa,bbb from ccc where ddd=ggg;

每条语句都需要进行解析,这里有两条,需要解析2回,有N条,就需要解析N回。每次执行一条sql文,消耗的时间中,解析占了绝大的比例。

如果把fff 换成 :XXX (XXX可以随意填写) , 这样的话,就只进行一次解析。

 

2.脏读、幻读、不可重复读

具体的含义,我就不写了,别人讲的更清楚,我贴出地址:

http://blog.sina.com.cn/s/blog_8020e4110101bfc6.html

 

3.所有的优化都是从业务开始的

作为程序员,虽说成天处理代码,但是遇到问题,解决问题的出发点,要先从业务出发。

 

4.表分区

表分区,可以改善查询性能,方便数据管理,方便数据备份恢复。参考地址如下:

http://www.cnblogs.com/pengineer/p/4393988.html

我在练习oracle partition这个功能的时候,悲催的发现,oracle只有Enterprise edition这个版本中才paritition。。。

郁闷!暂时无法练习尝试了!

 

5.ROWID & ROWNUM

ROWNUM指的是表中的行数,第一行,第二行,.ect  而ROWID是在指明这条数据在磁盘中位置的物理地址。更详细的请参考如下链接:

http://www.dba-oracle.com/t_rownum_rowid_difference.htm

 

6.UNION & UNION ALL

两者都是合并结果集,不同在于,前者是去掉重复值,后者是不去掉重复值。

因为UNION在运行时,要去掉重复值,机制中,它会排序去重,所以花费的时间多,所以优化时可通过业务上分析,如果两个结果集不存在重复值,那么合并的时候就应该选择UNION ALL。这也是优化的一个案例。

 

7.COUNT

我相信有时需要查看这个表中,是否有数据,所以sql就会写成,select count(1) from table;

表中数据多时,这样就会造成时间的浪费,我们不需要知道有多少条数据,只要清楚里面是否有数据,所以sql优化成下面的这个样子:

select count(1) from table where rownum = 1;

这样,只检查第一条是否有就可以,第一条有,那么这表就有数据。

 

8.DISTINCT

去重功能,少用,因为去重,会产生排序,会消耗大量时间。

 

9.MAX & MIN

select max_class, min_class from
(select max(CLASS_ID) max_class from student),
(select min(CLASS_ID) min_class from student);

同时查询最大值和最小值时,写成如上sql,因为当查询最大值或最小值时,当有索引的前提下,执行计划不要要全表查询,逻辑读只需要两次就可以查到了。但是同时出现时,就会进行全表扫描,因此,写成上面的sql,可以避免全表扫描,提高查询效率。

 

 

这篇就写到这里,不会的太多,坚持学习,加油!

 

 

 

 

 

 



posted @ 2017-05-20 12:26  Mr.袋鼠  阅读(603)  评论(0编辑  收藏  举报