如果說功能是程序的軀體,那末性能就是程序的靈魂。完全的功能可以保證程序的軀體是健全的,而良好的性能才是程序靈魂的意味,本文就程序的性能優(yōu)化做簡單的介紹。
最近對程序的性能的體會尤其深入。最近做了1個數(shù)據(jù)查詢和顯示的功能,從7張表大概1500條數(shù)據(jù)中查詢25條數(shù)據(jù)并且顯示出來,時間消耗1秒鐘。我的計算機參數(shù)為:CPU:i5處理器,4G內(nèi)存。這個履行速度相當(dāng)?shù)穆迷谖也樵兊臄?shù)據(jù)量比較小,等待時間不是很多,但是程序性能優(yōu)化確切迫在眉睫。
仔細(xì)分析了程序,發(fā)現(xiàn)有很多地方都是需要修改的,我們先從數(shù)據(jù)庫開始。下面先來看1段代碼,這個是程序中的SQL語句:
分析1下這段代碼,使用了6個inner join,1個in,1個not in,不固定數(shù)量的like(strTaskPointNameIn還附加了orlike)。首先,數(shù)據(jù)查詢就很費力,這里應(yīng)當(dāng)如何進(jìn)行優(yōu)化呢?數(shù)據(jù)庫的使用在性能上有哪些需要注意的地方呢?
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
結(jié)果:
ID1 |
Name1 |
ID2 |
Name2 |
1 |
a |
1 |
b |
3 |
a |
3 |
b |
Leftjoin:
Select * from A left join B on A.ID = B.ID
結(jié)果:
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
結(jié)果:
ID1 |
Name1 |
ID2 |
Name2 |
1 |
a |
1 |
b |
3 |
a |
3 |
b |
null |
null |
4 |
b |
這3種表連接方式,不能直接說那個性能最好,1是看功能需要,2是看具體查詢語句。就上面的SQL語句和功能來看,innerjoin應(yīng)當(dāng)是最合適的,1是數(shù)據(jù)量較小,2是不需要過剩數(shù)據(jù)。
2 in Exists
另外一個值得討論的地方就是in和exists的使用了,這二者是在嵌套查詢的時候使用的。我們先來看它們各自的查詢原理。
in是把外表和內(nèi)表做hash連接,exists是把外表做loop循環(huán),每次循環(huán)再對內(nèi)表進(jìn)行查詢,1直以來講exists比in的查詢方式更快是不準(zhǔn)確的,不同情況結(jié)果也不1樣,并且如果內(nèi)外表數(shù)據(jù)量相1致的情況下,兩種方式效力是相同的。
現(xiàn)在,我們還是假定有兩個表:
A表:數(shù)據(jù)量較小,B表:數(shù)據(jù)量較大。
select * from A where cc in(select cc from B)
效力較低,由于in連接使用外表A的cc列的索引進(jìn)行loop循環(huán),然后在B表中尋覓等值記錄。
select * from A where exists (select cc from B where cc = A.cc)
效力較高,由于使用了B表cc列的索引
Not in 和 not exists
如果查詢語句使用到了not in,那末內(nèi)外兩張表都需要全表掃描,沒有用到索引,效力較低;而not exists使用到了索引,所以不管哪一個表大,not exists效力較高。
暫時寫到這里吧,下篇文章繼續(xù)繼續(xù)性能優(yōu)化。