建議一:在數(shù)據(jù)庫(kù)服務(wù)器過(guò)濾數(shù)據(jù),而不是在應(yīng)用程序上。
在通常情況下,若是在服務(wù)器上過(guò)濾數(shù)據(jù),其效率始終會(huì)高于將數(shù)據(jù)發(fā)送到應(yīng)用程序,然乎在應(yīng)用程序上對(duì)數(shù)據(jù)進(jìn)行過(guò)濾。如當(dāng)應(yīng)用程序利用Select * FROM 語(yǔ)句,要求數(shù)據(jù)庫(kù)服務(wù)器將所有列數(shù)據(jù)返回給應(yīng)用程序,不論應(yīng)用程序是否已綁定這些列以在程序變量中使用。但是,在應(yīng)用程序中,往往不會(huì)把所有的列都顯示出來(lái)。根據(jù)考試大的數(shù)據(jù)庫(kù)開(kāi)發(fā)經(jīng)驗(yàn),除非應(yīng)用程序是根據(jù)客戶需求進(jìn)行自定義,否則的話,像那種套裝軟件,其為了能夠滿足不同企業(yè)的需求,往往會(huì)在數(shù)據(jù)庫(kù)表中設(shè)置比較多的字段。故這返回給應(yīng)用程序的字段,若其利用率能夠達(dá)到60%已經(jīng)算高了。這就導(dǎo)致從數(shù)據(jù)庫(kù)服務(wù)器端傳遞給應(yīng)用程序的數(shù)據(jù),很多都是無(wú)用的。故在查詢語(yǔ)句中,按名稱只選擇必要的列可避免不必要的網(wǎng)絡(luò)流量。
同時(shí),這么設(shè)計(jì)還可以帶來(lái)另外一個(gè)好處。如可以使得應(yīng)用程序在表定義時(shí)更加的可靠,因?yàn)樾绿砑拥牧胁环祷亟o客戶端應(yīng)用程序。在SQLServer服務(wù)器中,支持在服務(wù)器上過(guò)濾數(shù)據(jù),以便給應(yīng)用程序返回最小的所需數(shù)據(jù)。使用這個(gè)功能可以使得服務(wù)器與應(yīng)用程序之間高耗費(fèi)的網(wǎng)絡(luò)流量減到最小。
若在應(yīng)用程序中帶有用戶自定義報(bào)表功能的話,這個(gè)建議就會(huì)非常有用。因?yàn)閳?bào)表自定義系統(tǒng),信息化管理軟件的用戶就可以利用這個(gè)平臺(tái),根據(jù)自身企業(yè)的需要,對(duì)報(bào)表進(jìn)行自定義,選擇自己所需要的字段內(nèi)容。此時(shí),應(yīng)用程序在生成報(bào)表的Select語(yǔ)句中,就要根據(jù)用戶自定義顯示的內(nèi)容,從數(shù)據(jù)庫(kù)中查詢相關(guān)的列。而不需要把對(duì)應(yīng)表中所有列都查詢出來(lái)。無(wú)疑,這可以在很大程度上提高應(yīng)用程序的性能。
建議二:應(yīng)用程序應(yīng)立即從數(shù)據(jù)庫(kù)結(jié)果集中提取所有的行。
當(dāng)應(yīng)用程序采用開(kāi)放式數(shù)據(jù)庫(kù)連接技術(shù)連接SQLServer數(shù)據(jù)庫(kù)時(shí),在執(zhí)行查詢前設(shè)置的語(yǔ)句選項(xiàng)決定應(yīng)用程序如何從服務(wù)器請(qǐng)求結(jié)果集。默認(rèn)情況下,數(shù)據(jù)庫(kù)以的方式發(fā)送結(jié)果集。即大部分情況下,數(shù)據(jù)庫(kù)都假定應(yīng)用程序立即才能夠數(shù)據(jù)庫(kù)結(jié)果集中提取所有的行。
對(duì)于這一點(diǎn),很多應(yīng)用程序開(kāi)發(fā)人員存在一個(gè)誤解。他們錯(cuò)誤的認(rèn)為,請(qǐng)求默認(rèn)結(jié)果集只按應(yīng)用程序邏輯或者用戶商業(yè)邏輯提取結(jié)果集中所需要的行,這會(huì)節(jié)省網(wǎng)絡(luò)與應(yīng)用程序的開(kāi)銷。其實(shí),這是錯(cuò)誤的。因?yàn)槿绻麘?yīng)用程序不馬上從數(shù)據(jù)庫(kù)結(jié)果集中提取所有的行的話,會(huì)阻礙其他應(yīng)用程序客戶端與服務(wù)器之間的連接,而且還會(huì)阻塞同一個(gè)事務(wù)中的其他工作。更嚴(yán)重的是,未從結(jié)果集中提取的行會(huì)導(dǎo)致數(shù)據(jù)庫(kù)服務(wù)器上相關(guān)的表中加鎖,從而有可能阻礙其他用戶對(duì)于數(shù)據(jù)的更新。當(dāng)信息化管理軟件的用戶越多,這個(gè)負(fù)面作用會(huì)越來(lái)越明顯。故除非有其他的考慮,否則的話,應(yīng)用程序在設(shè)計(jì)時(shí),要立即從數(shù)據(jù)庫(kù)默認(rèn)結(jié)果集中提取所有的行。
建議三:使用游標(biāo)技術(shù)來(lái)改善大表數(shù)據(jù)的查詢。
不過(guò),在實(shí)際工作中,仍然有一些應(yīng)用程序無(wú)法一次性從數(shù)據(jù)庫(kù)服務(wù)器中提取所有的結(jié)果行。如應(yīng)用程序查詢大表并且允許用戶指定選擇條件,此時(shí),有可能數(shù)據(jù)庫(kù)服務(wù)器會(huì)返回幾萬(wàn)行,甚至達(dá)到上百萬(wàn)行。若讓應(yīng)用程序緩沖這么多的數(shù)據(jù),那么應(yīng)用程序的緩沖空間很快會(huì)被消耗殆盡;同時(shí)也增加了額外的網(wǎng)絡(luò)流量。而終端用戶,可能并不需要看到這么多的行。如在實(shí)際工作中,終端用戶往往有一個(gè)不好的習(xí)慣。他們第一次查詢數(shù)據(jù)時(shí),往往會(huì)不選擇任何查詢條件查詢數(shù)據(jù)。當(dāng)他們看到查詢出來(lái)的數(shù)據(jù)比較多時(shí),才會(huì)嘗試著去輸入一些限制條件,如利用信息類別或者部分名字實(shí)現(xiàn)模糊查詢等等。在這種情況下,應(yīng)用程序提取和緩沖上百萬(wàn)條的記錄,而用戶最終仍然會(huì)丟棄這些行。這無(wú)疑會(huì)浪費(fèi)很多的時(shí)間和資源。
可是如果不馬上提取所有的結(jié)果行,會(huì)產(chǎn)生建議二所描述的不利結(jié)果。那該如何是好呢?SQLServer數(shù)據(jù)庫(kù)為了解決這個(gè)問(wèn)題,提出了一個(gè)游標(biāo)技術(shù)。在談這個(gè)游標(biāo)技術(shù)之前,考試大先談一個(gè)具體的例子,以幫助大家對(duì)于游標(biāo)有一個(gè)感性的認(rèn)識(shí)。
在一些成熟的應(yīng)用系統(tǒng)中,當(dāng)用戶查詢數(shù)據(jù)時(shí),如果數(shù)據(jù)量比較多,則在應(yīng)用程序的窗口中,顯示的是一個(gè)屏幕的數(shù)據(jù)。也就是說(shuō),應(yīng)用程序并不立即從數(shù)據(jù)庫(kù)中提取所有的行;而只提取一屏幕的行。當(dāng)用戶發(fā)現(xiàn)自己所需要的數(shù)據(jù)并不在這個(gè)屏幕中,則可以點(diǎn)擊“下一屏”等類似的按鈕,讓應(yīng)用程序窗口顯示其他的內(nèi)容。用戶每點(diǎn)擊一次,應(yīng)用程序就從數(shù)據(jù)庫(kù)服務(wù)器中提取一屏幕的行。此時(shí),因?yàn)橛昧擞螛?biāo)技術(shù),所以數(shù)據(jù)庫(kù)管理員不用擔(dān)心未提取的數(shù)據(jù)行產(chǎn)生的鎖沖突問(wèn)題。
那么游標(biāo)技術(shù)到底可以帶來(lái)哪些收益呢?且聽(tīng)考試大一一道來(lái)。
首先,數(shù)據(jù)庫(kù)提供服務(wù)器游標(biāo)允許應(yīng)用程序從任意大的結(jié)果集中提取行子集或者行快,如上面例子中的一屏幕行。如果用戶想看到同一結(jié)果集中的其他數(shù)據(jù),服務(wù)器游標(biāo)允許應(yīng)用程序從數(shù)據(jù)庫(kù)結(jié)果集中提取任何其他的行塊,如結(jié)果集后面的N行、前面的N行、或者中間某行后面的N行等等。數(shù)據(jù)庫(kù)服務(wù)器只根據(jù)需要執(zhí)行每個(gè)塊提取請(qǐng)求。最重要的是,數(shù)據(jù)庫(kù)服務(wù)器通常不會(huì)在服務(wù)器游標(biāo)上的塊提取之間對(duì)表或者表中的行加鎖。如此的話,即使應(yīng)用程序未從數(shù)據(jù)庫(kù)服務(wù)器中提取所有的結(jié)果,那么也不影響其它用戶對(duì)這數(shù)據(jù)表結(jié)果的修改。
其次,服務(wù)器游標(biāo)可以簡(jiǎn)化數(shù)據(jù)的操作。如服務(wù)器游標(biāo)允許應(yīng)用程序?qū)τ谔崛〉男袌?zhí)行定位更新或者刪除,而不需要確定行的源表與主鍵。如果行數(shù)據(jù)從提取到請(qǐng)求更新的這一段時(shí)間內(nèi)被用戶更改了,則數(shù)據(jù)庫(kù)服務(wù)器也會(huì)檢測(cè)出這個(gè)問(wèn)題并采用相關(guān)的措施來(lái)防治丟失更新。
不過(guò)除非有特殊的需要,否則的話,并不建議在數(shù)據(jù)庫(kù)與應(yīng)用程序的開(kāi)發(fā)過(guò)程中采用游標(biāo)技術(shù)。因?yàn)橛螛?biāo)技術(shù)會(huì)帶來(lái)一些額外的開(kāi)銷與負(fù)面作用。服務(wù)器游標(biāo)技術(shù)需要付出一定的代價(jià),比較天下沒(méi)有免費(fèi)的午餐。如給定查詢的所有結(jié)果都要在應(yīng)用程序使用,則服務(wù)器游標(biāo)總是比默認(rèn)結(jié)果集要耗費(fèi)更多的資源。換句話說(shuō),如果應(yīng)用程序的查詢結(jié)果,用戶都要導(dǎo)出來(lái)使用。此時(shí),若采用游標(biāo)技術(shù),則就不是一個(gè)很好的選擇,因?yàn)槠鋾?huì)比默認(rèn)結(jié)果集耗費(fèi)更多的資源與時(shí)間。
默認(rèn)結(jié)果集始終只需要在服務(wù)器端與客戶端往返一次。但是,每次使用服務(wù)器游標(biāo)調(diào)用提取行塊操作便導(dǎo)致一次往返。但紀(jì)錄量越多,則其往返次數(shù)也會(huì)越多。另外,服務(wù)器游標(biāo)也會(huì)消耗服務(wù)器上的資源。為此,只有在應(yīng)用程序需要這些服務(wù)器游標(biāo)時(shí)才使用這些服務(wù)器結(jié)果集或者可更新的結(jié)果集,則使用服務(wù)器游標(biāo)技術(shù)提取大小適中的塊。
在實(shí)際工作中,有些信息化管理系統(tǒng)就提供了一些諸如應(yīng)用程序之類的工具,來(lái)幫助應(yīng)用程序是否需要采用游標(biāo)技術(shù)。如他們會(huì)在某個(gè)窗口或者報(bào)表的自定義平臺(tái)上,提供一個(gè)是否需要采用游標(biāo)技術(shù)的按鈕(不同應(yīng)用程序提供的按鈕名字不同,但是作用類似)。當(dāng)系統(tǒng)維護(hù)人員認(rèn)為表中記錄量比較大,利用游標(biāo)技術(shù)可以改善查詢效率時(shí),只需要選擇這個(gè)按鈕即可。如此的話,應(yīng)用程序就不會(huì)從數(shù)據(jù)庫(kù)服務(wù)器中一次性提取所有的行。
而有些信息化管理軟件,則會(huì)自動(dòng)判斷。如應(yīng)用程序一次查詢其返回結(jié)果超過(guò)一定的行時(shí),其就會(huì)利用游標(biāo)技術(shù)來(lái)改善查詢性能。如到返回的記錄超過(guò)一屏幕行時(shí),就會(huì)自動(dòng)采用游標(biāo)技術(shù)。這也是一種不錯(cuò)的設(shè)計(jì)方案。
從上面的分析中,我們可以看出,在應(yīng)用程序設(shè)計(jì)的時(shí)候,若能夠適當(dāng)考慮數(shù)據(jù)庫(kù)性能方面的內(nèi)容,那么無(wú)論是應(yīng)用程序性能,還是數(shù)據(jù)庫(kù)性能,都能夠都到有效的改善。畢竟,如果數(shù)據(jù)庫(kù)性能不好,應(yīng)用程序的性能無(wú)路如何都提不上去。故采用高效數(shù)據(jù)檢索,可以同時(shí)優(yōu)化數(shù)據(jù)庫(kù)服務(wù)器與應(yīng)用程序的性能。
在通常情況下,若是在服務(wù)器上過(guò)濾數(shù)據(jù),其效率始終會(huì)高于將數(shù)據(jù)發(fā)送到應(yīng)用程序,然乎在應(yīng)用程序上對(duì)數(shù)據(jù)進(jìn)行過(guò)濾。如當(dāng)應(yīng)用程序利用Select * FROM 語(yǔ)句,要求數(shù)據(jù)庫(kù)服務(wù)器將所有列數(shù)據(jù)返回給應(yīng)用程序,不論應(yīng)用程序是否已綁定這些列以在程序變量中使用。但是,在應(yīng)用程序中,往往不會(huì)把所有的列都顯示出來(lái)。根據(jù)考試大的數(shù)據(jù)庫(kù)開(kāi)發(fā)經(jīng)驗(yàn),除非應(yīng)用程序是根據(jù)客戶需求進(jìn)行自定義,否則的話,像那種套裝軟件,其為了能夠滿足不同企業(yè)的需求,往往會(huì)在數(shù)據(jù)庫(kù)表中設(shè)置比較多的字段。故這返回給應(yīng)用程序的字段,若其利用率能夠達(dá)到60%已經(jīng)算高了。這就導(dǎo)致從數(shù)據(jù)庫(kù)服務(wù)器端傳遞給應(yīng)用程序的數(shù)據(jù),很多都是無(wú)用的。故在查詢語(yǔ)句中,按名稱只選擇必要的列可避免不必要的網(wǎng)絡(luò)流量。
同時(shí),這么設(shè)計(jì)還可以帶來(lái)另外一個(gè)好處。如可以使得應(yīng)用程序在表定義時(shí)更加的可靠,因?yàn)樾绿砑拥牧胁环祷亟o客戶端應(yīng)用程序。在SQLServer服務(wù)器中,支持在服務(wù)器上過(guò)濾數(shù)據(jù),以便給應(yīng)用程序返回最小的所需數(shù)據(jù)。使用這個(gè)功能可以使得服務(wù)器與應(yīng)用程序之間高耗費(fèi)的網(wǎng)絡(luò)流量減到最小。
若在應(yīng)用程序中帶有用戶自定義報(bào)表功能的話,這個(gè)建議就會(huì)非常有用。因?yàn)閳?bào)表自定義系統(tǒng),信息化管理軟件的用戶就可以利用這個(gè)平臺(tái),根據(jù)自身企業(yè)的需要,對(duì)報(bào)表進(jìn)行自定義,選擇自己所需要的字段內(nèi)容。此時(shí),應(yīng)用程序在生成報(bào)表的Select語(yǔ)句中,就要根據(jù)用戶自定義顯示的內(nèi)容,從數(shù)據(jù)庫(kù)中查詢相關(guān)的列。而不需要把對(duì)應(yīng)表中所有列都查詢出來(lái)。無(wú)疑,這可以在很大程度上提高應(yīng)用程序的性能。
建議二:應(yīng)用程序應(yīng)立即從數(shù)據(jù)庫(kù)結(jié)果集中提取所有的行。
當(dāng)應(yīng)用程序采用開(kāi)放式數(shù)據(jù)庫(kù)連接技術(shù)連接SQLServer數(shù)據(jù)庫(kù)時(shí),在執(zhí)行查詢前設(shè)置的語(yǔ)句選項(xiàng)決定應(yīng)用程序如何從服務(wù)器請(qǐng)求結(jié)果集。默認(rèn)情況下,數(shù)據(jù)庫(kù)以的方式發(fā)送結(jié)果集。即大部分情況下,數(shù)據(jù)庫(kù)都假定應(yīng)用程序立即才能夠數(shù)據(jù)庫(kù)結(jié)果集中提取所有的行。
對(duì)于這一點(diǎn),很多應(yīng)用程序開(kāi)發(fā)人員存在一個(gè)誤解。他們錯(cuò)誤的認(rèn)為,請(qǐng)求默認(rèn)結(jié)果集只按應(yīng)用程序邏輯或者用戶商業(yè)邏輯提取結(jié)果集中所需要的行,這會(huì)節(jié)省網(wǎng)絡(luò)與應(yīng)用程序的開(kāi)銷。其實(shí),這是錯(cuò)誤的。因?yàn)槿绻麘?yīng)用程序不馬上從數(shù)據(jù)庫(kù)結(jié)果集中提取所有的行的話,會(huì)阻礙其他應(yīng)用程序客戶端與服務(wù)器之間的連接,而且還會(huì)阻塞同一個(gè)事務(wù)中的其他工作。更嚴(yán)重的是,未從結(jié)果集中提取的行會(huì)導(dǎo)致數(shù)據(jù)庫(kù)服務(wù)器上相關(guān)的表中加鎖,從而有可能阻礙其他用戶對(duì)于數(shù)據(jù)的更新。當(dāng)信息化管理軟件的用戶越多,這個(gè)負(fù)面作用會(huì)越來(lái)越明顯。故除非有其他的考慮,否則的話,應(yīng)用程序在設(shè)計(jì)時(shí),要立即從數(shù)據(jù)庫(kù)默認(rèn)結(jié)果集中提取所有的行。
建議三:使用游標(biāo)技術(shù)來(lái)改善大表數(shù)據(jù)的查詢。
不過(guò),在實(shí)際工作中,仍然有一些應(yīng)用程序無(wú)法一次性從數(shù)據(jù)庫(kù)服務(wù)器中提取所有的結(jié)果行。如應(yīng)用程序查詢大表并且允許用戶指定選擇條件,此時(shí),有可能數(shù)據(jù)庫(kù)服務(wù)器會(huì)返回幾萬(wàn)行,甚至達(dá)到上百萬(wàn)行。若讓應(yīng)用程序緩沖這么多的數(shù)據(jù),那么應(yīng)用程序的緩沖空間很快會(huì)被消耗殆盡;同時(shí)也增加了額外的網(wǎng)絡(luò)流量。而終端用戶,可能并不需要看到這么多的行。如在實(shí)際工作中,終端用戶往往有一個(gè)不好的習(xí)慣。他們第一次查詢數(shù)據(jù)時(shí),往往會(huì)不選擇任何查詢條件查詢數(shù)據(jù)。當(dāng)他們看到查詢出來(lái)的數(shù)據(jù)比較多時(shí),才會(huì)嘗試著去輸入一些限制條件,如利用信息類別或者部分名字實(shí)現(xiàn)模糊查詢等等。在這種情況下,應(yīng)用程序提取和緩沖上百萬(wàn)條的記錄,而用戶最終仍然會(huì)丟棄這些行。這無(wú)疑會(huì)浪費(fèi)很多的時(shí)間和資源。
可是如果不馬上提取所有的結(jié)果行,會(huì)產(chǎn)生建議二所描述的不利結(jié)果。那該如何是好呢?SQLServer數(shù)據(jù)庫(kù)為了解決這個(gè)問(wèn)題,提出了一個(gè)游標(biāo)技術(shù)。在談這個(gè)游標(biāo)技術(shù)之前,考試大先談一個(gè)具體的例子,以幫助大家對(duì)于游標(biāo)有一個(gè)感性的認(rèn)識(shí)。
在一些成熟的應(yīng)用系統(tǒng)中,當(dāng)用戶查詢數(shù)據(jù)時(shí),如果數(shù)據(jù)量比較多,則在應(yīng)用程序的窗口中,顯示的是一個(gè)屏幕的數(shù)據(jù)。也就是說(shuō),應(yīng)用程序并不立即從數(shù)據(jù)庫(kù)中提取所有的行;而只提取一屏幕的行。當(dāng)用戶發(fā)現(xiàn)自己所需要的數(shù)據(jù)并不在這個(gè)屏幕中,則可以點(diǎn)擊“下一屏”等類似的按鈕,讓應(yīng)用程序窗口顯示其他的內(nèi)容。用戶每點(diǎn)擊一次,應(yīng)用程序就從數(shù)據(jù)庫(kù)服務(wù)器中提取一屏幕的行。此時(shí),因?yàn)橛昧擞螛?biāo)技術(shù),所以數(shù)據(jù)庫(kù)管理員不用擔(dān)心未提取的數(shù)據(jù)行產(chǎn)生的鎖沖突問(wèn)題。
那么游標(biāo)技術(shù)到底可以帶來(lái)哪些收益呢?且聽(tīng)考試大一一道來(lái)。
首先,數(shù)據(jù)庫(kù)提供服務(wù)器游標(biāo)允許應(yīng)用程序從任意大的結(jié)果集中提取行子集或者行快,如上面例子中的一屏幕行。如果用戶想看到同一結(jié)果集中的其他數(shù)據(jù),服務(wù)器游標(biāo)允許應(yīng)用程序從數(shù)據(jù)庫(kù)結(jié)果集中提取任何其他的行塊,如結(jié)果集后面的N行、前面的N行、或者中間某行后面的N行等等。數(shù)據(jù)庫(kù)服務(wù)器只根據(jù)需要執(zhí)行每個(gè)塊提取請(qǐng)求。最重要的是,數(shù)據(jù)庫(kù)服務(wù)器通常不會(huì)在服務(wù)器游標(biāo)上的塊提取之間對(duì)表或者表中的行加鎖。如此的話,即使應(yīng)用程序未從數(shù)據(jù)庫(kù)服務(wù)器中提取所有的結(jié)果,那么也不影響其它用戶對(duì)這數(shù)據(jù)表結(jié)果的修改。
其次,服務(wù)器游標(biāo)可以簡(jiǎn)化數(shù)據(jù)的操作。如服務(wù)器游標(biāo)允許應(yīng)用程序?qū)τ谔崛〉男袌?zhí)行定位更新或者刪除,而不需要確定行的源表與主鍵。如果行數(shù)據(jù)從提取到請(qǐng)求更新的這一段時(shí)間內(nèi)被用戶更改了,則數(shù)據(jù)庫(kù)服務(wù)器也會(huì)檢測(cè)出這個(gè)問(wèn)題并采用相關(guān)的措施來(lái)防治丟失更新。
不過(guò)除非有特殊的需要,否則的話,并不建議在數(shù)據(jù)庫(kù)與應(yīng)用程序的開(kāi)發(fā)過(guò)程中采用游標(biāo)技術(shù)。因?yàn)橛螛?biāo)技術(shù)會(huì)帶來(lái)一些額外的開(kāi)銷與負(fù)面作用。服務(wù)器游標(biāo)技術(shù)需要付出一定的代價(jià),比較天下沒(méi)有免費(fèi)的午餐。如給定查詢的所有結(jié)果都要在應(yīng)用程序使用,則服務(wù)器游標(biāo)總是比默認(rèn)結(jié)果集要耗費(fèi)更多的資源。換句話說(shuō),如果應(yīng)用程序的查詢結(jié)果,用戶都要導(dǎo)出來(lái)使用。此時(shí),若采用游標(biāo)技術(shù),則就不是一個(gè)很好的選擇,因?yàn)槠鋾?huì)比默認(rèn)結(jié)果集耗費(fèi)更多的資源與時(shí)間。
默認(rèn)結(jié)果集始終只需要在服務(wù)器端與客戶端往返一次。但是,每次使用服務(wù)器游標(biāo)調(diào)用提取行塊操作便導(dǎo)致一次往返。但紀(jì)錄量越多,則其往返次數(shù)也會(huì)越多。另外,服務(wù)器游標(biāo)也會(huì)消耗服務(wù)器上的資源。為此,只有在應(yīng)用程序需要這些服務(wù)器游標(biāo)時(shí)才使用這些服務(wù)器結(jié)果集或者可更新的結(jié)果集,則使用服務(wù)器游標(biāo)技術(shù)提取大小適中的塊。
在實(shí)際工作中,有些信息化管理系統(tǒng)就提供了一些諸如應(yīng)用程序之類的工具,來(lái)幫助應(yīng)用程序是否需要采用游標(biāo)技術(shù)。如他們會(huì)在某個(gè)窗口或者報(bào)表的自定義平臺(tái)上,提供一個(gè)是否需要采用游標(biāo)技術(shù)的按鈕(不同應(yīng)用程序提供的按鈕名字不同,但是作用類似)。當(dāng)系統(tǒng)維護(hù)人員認(rèn)為表中記錄量比較大,利用游標(biāo)技術(shù)可以改善查詢效率時(shí),只需要選擇這個(gè)按鈕即可。如此的話,應(yīng)用程序就不會(huì)從數(shù)據(jù)庫(kù)服務(wù)器中一次性提取所有的行。
而有些信息化管理軟件,則會(huì)自動(dòng)判斷。如應(yīng)用程序一次查詢其返回結(jié)果超過(guò)一定的行時(shí),其就會(huì)利用游標(biāo)技術(shù)來(lái)改善查詢性能。如到返回的記錄超過(guò)一屏幕行時(shí),就會(huì)自動(dòng)采用游標(biāo)技術(shù)。這也是一種不錯(cuò)的設(shè)計(jì)方案。
從上面的分析中,我們可以看出,在應(yīng)用程序設(shè)計(jì)的時(shí)候,若能夠適當(dāng)考慮數(shù)據(jù)庫(kù)性能方面的內(nèi)容,那么無(wú)論是應(yīng)用程序性能,還是數(shù)據(jù)庫(kù)性能,都能夠都到有效的改善。畢竟,如果數(shù)據(jù)庫(kù)性能不好,應(yīng)用程序的性能無(wú)路如何都提不上去。故采用高效數(shù)據(jù)檢索,可以同時(shí)優(yōu)化數(shù)據(jù)庫(kù)服務(wù)器與應(yīng)用程序的性能。