數(shù)據(jù)庫理論:高效數(shù)據(jù)檢索優(yōu)化應(yīng)用程序性能

字號:

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