一、什么情況下才應(yīng)該使用存儲(chǔ)過(guò)程而不是用程序來(lái)對(duì)數(shù)據(jù)做操作
1.如果處理的邏輯不是太復(fù)雜,也就是邏輯的時(shí)間復(fù)雜度不高,可以放進(jìn)存儲(chǔ)過(guò)程,因?yàn)槿绻珡?fù)雜(例如有很多巨耗CPU資源的操作),會(huì)加大數(shù)據(jù)庫(kù)服務(wù)器的壓力,從而影響數(shù)據(jù)庫(kù)服務(wù)器對(duì)其它請(qǐng)求的響應(yīng)。而本應(yīng)以運(yùn)行程序邏輯為本職的應(yīng)用服務(wù)器,卻晾在一旁打醬油,你認(rèn)為這樣真的好嗎?
2.相反,如果邏輯不太復(fù)雜,但是需要訪問(wèn)的數(shù)據(jù)量是巨量的,那么就更適合放進(jìn)存儲(chǔ)過(guò)程處理(注意處理好表鎖定的問(wèn)題),因?yàn)楫?dāng)你讀取上千萬(wàn)條件數(shù)據(jù)并把它們傳進(jìn)應(yīng)用服務(wù)器再來(lái)處理除了對(duì)教據(jù)庫(kù)服務(wù)器有壓力,對(duì)應(yīng)用外理哭的內(nèi)存壓力也很大的,倒不如直接在數(shù)據(jù)庫(kù)服務(wù)器外理完它。這種情況時(shí),盡管在讀取大數(shù)據(jù)量時(shí),其實(shí)無(wú)論用哪種方法,數(shù)據(jù)庫(kù)服務(wù)器的磁盤(pán)IO承受的玉力都是一樣的,但如果放在代碼里處理,也就是需要傳到應(yīng)用服務(wù)器端處理,那么就會(huì)對(duì)網(wǎng)絡(luò)IC也形成了壓力。如果這種操作頻繁的話,會(huì)對(duì)網(wǎng)絡(luò)IC也形成了壓力。如果這種操作頻繁的話,會(huì)對(duì)網(wǎng)絡(luò)10形成壓力脈沖。有可能影響同一網(wǎng)絡(luò)上的其它應(yīng)用。
延伸閱讀:
二、中小型項(xiàng)目使用存儲(chǔ)過(guò)程的優(yōu)勢(shì)
存儲(chǔ)過(guò)程不僅僅適用于大型項(xiàng)目,對(duì)于中小型項(xiàng)目,使用存儲(chǔ)過(guò)程也是非常有必要的。其威力和優(yōu)勢(shì)主要體現(xiàn)在:
1.存儲(chǔ)過(guò)程只在創(chuàng)造時(shí)進(jìn)行編譯,以后每次執(zhí)行存儲(chǔ)過(guò)程都不需再重新編譯,而一般 SQL 語(yǔ)句每執(zhí)行一次就編譯一次,所以使用存儲(chǔ)過(guò)程可提高數(shù)據(jù)庫(kù)執(zhí)行速度。
2.當(dāng)對(duì)數(shù)據(jù)庫(kù)進(jìn)行復(fù)雜操作時(shí)(如對(duì)多個(gè)表進(jìn)行 Update,Insert,Query,Delete 時(shí)),可將此復(fù)雜操作用存儲(chǔ)過(guò)程封裝起來(lái)與數(shù)據(jù)庫(kù)提供的事務(wù)處理結(jié)合一起使用。這些操作,如果用程序來(lái)完成,就變成了一條條的 SQL 語(yǔ)句,可能要多次連接數(shù)據(jù)庫(kù)。而換成存儲(chǔ),只需要連接一次數(shù)據(jù)庫(kù)就可以了。
3.存儲(chǔ)過(guò)程可以重復(fù)使用,可減少數(shù)據(jù)庫(kù)開(kāi)發(fā)人員的工作量。
4.安全性高,可設(shè)定只有某此用戶才具有對(duì)指定存儲(chǔ)過(guò)程的使用權(quán)。