如果说功能是程序的躯体,那末性能就是程序的灵魂。完全的功能可以保证程序的躯体是健全的,而良好的性能才是程序灵魂的意味,本文就程序的性能优化做简单的介绍。
最近对程序的性能的体会尤其深入。最近做了1个数据查询和显示的功能,从7张表大概1500条数据中查询25条数据并且显示出来,时间消耗1秒钟。我的计算机参数为:CPU:i5处理器,4G内存。这个履行速度相当的慢,好在我查询的数据量比较小,等待时间不是很多,但是程序性能优化确切迫在眉睫。
仔细分析了程序,发现有很多地方都是需要修改的,我们先从数据库开始。下面先来看1段代码,这个是程序中的SQL语句:
分析1下这段代码,使用了6个inner join,1个in,1个not in,不固定数量的like(strTaskPointNameIn还附加了orlike)。首先,数据查询就很费力,这里应当如何进行优化呢?数据库的使用在性能上有哪些需要注意的地方呢?
1 inner join,left join ,right join
1 inner join (等值连接)返回两个表连接字段相等的记录
2 left join (左连接)返回左表中的所有记录和右表中连接字段相等的记录
3 right join (右连接)返回右表中所有记录和左表中连接字段相等的记录
如:
A表
ID1 |
Name1 |
1 |
a |
2 |
a |
3 |
a |
B表
ID2 |
Name2 |
1 |
b |
3 |
b |
4 |
b |
Innerjoin :
select * from A inner join B onA.ID = B.ID
结果:
ID1 |
Name1 |
ID2 |
Name2 |
1 |
a |
1 |
b |
3 |
a |
3 |
b |
Leftjoin:
Select * from A left join B on A.ID = B.ID
结果:
ID1 |
Name1 |
ID2 |
Name2 |
1 |
a |
1 |
b |
2 |
a |
null |
null |
3 |
a |
3 |
b |
Rightjoin :
Select * from A right join Bon A .ID = B.ID
结果:
ID1 |
Name1 |
ID2 |
Name2 |
1 |
a |
1 |
b |
3 |
a |
3 |
b |
null |
null |
4 |
b |
这3种表连接方式,不能直接说那个性能最好,1是看功能需要,2是看具体查询语句。就上面的SQL语句和功能来看,innerjoin应当是最合适的,1是数据量较小,2是不需要过剩数据。
2 in Exists
另外一个值得讨论的地方就是in和exists的使用了,这二者是在嵌套查询的时候使用的。我们先来看它们各自的查询原理。
in是把外表和内表做hash连接,exists是把外表做loop循环,每次循环再对内表进行查询,1直以来讲exists比in的查询方式更快是不准确的,不同情况结果也不1样,并且如果内外表数据量相1致的情况下,两种方式效力是相同的。
现在,我们还是假定有两个表:
A表:数据量较小,B表:数据量较大。
select * from A where cc in(select cc from B)
效力较低,由于in连接使用外表A的cc列的索引进行loop循环,然后在B表中寻觅等值记录。
select * from A where exists (select cc from B where cc = A.cc)
效力较高,由于使用了B表cc列的索引
Not in 和 not exists
如果查询语句使用到了not in,那末内外两张表都需要全表扫描,没有用到索引,效力较低;而not exists使用到了索引,所以不管哪一个表大,not exists效力较高。
暂时写到这里吧,下篇文章继续继续性能优化。