日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
在T-SQL中使用臨時表的注意事項

一、臨時表的兩種表現(xiàn)形式。

金東網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項目制作,到程序開發(fā),運營維護(hù)。創(chuàng)新互聯(lián)從2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

在SQL Server數(shù)據(jù)庫中,臨時表主要有兩種形式,分別為全局臨時表與局部臨時表。這兩種表有很大的不同,主要體現(xiàn)在名字上、可見性上以及可用性上。具體來說,本地臨時表的名字是以#符號開頭的;而全局臨時表則是以##兩個#字符號開頭。從可見性上來說,局部臨時表是有當(dāng)前用戶創(chuàng)建的,并且只有當(dāng)前用戶的會話才可以訪問。而對于全局表來說,只要這個臨時表存在,那么用戶創(chuàng)建會話后對所有的用戶都是可見的。兩者在刪除的時機(jī)尚也有不同。如本地臨時表在當(dāng)前用戶中斷會話后這個臨時表就會被刪除。而全局臨時表只有當(dāng)飲用這個表的用戶從數(shù)據(jù)庫中斷開連接時才會被刪除。由于這兩種臨時表存在這么多的差異,數(shù)據(jù)庫管理員就需要根據(jù)實際應(yīng)用來確定采用合適的臨時表類型。

筆者現(xiàn)在以一個實際的例子來談?wù)勂胀ū?、本地臨時表、全局臨時表三個表的差異。如現(xiàn)在有一個保存員工信息的表user。這個表是一個普通表,只要其建立就不會自動刪除,任何好在數(shù)據(jù)庫中有使用這個表(具有訪問權(quán)限)的用戶都可以訪問這個表,除非這個表被所有者刪除或者更改了權(quán)限。在用戶A(具有訪問權(quán)限)訪問這個表的過程中,數(shù)據(jù)庫可能會根據(jù)需要生成一張本地臨時表#user。此時只有這個會話才可以訪問這個本地臨時表。當(dāng)這個用戶的會話中斷之后,這個本地臨時表也會被自動刪除。不過根據(jù)需要,數(shù)據(jù)庫也可能會建立全局臨時表##user(在名字上與本地臨時表不同)。此時數(shù)據(jù)庫中的任何用戶只要連接到了數(shù)據(jù)庫就可以訪問這個全局臨時表(訪問權(quán)限上的不同)。當(dāng)這個創(chuàng)建臨時表會話的用戶中斷數(shù)據(jù)庫連接時,這個臨時表是否會刪除是一個未知數(shù),這要看當(dāng)時的實際情況(在可用性上不同)。如果此時還有其他用戶連接在這個表上的話,那么這個全局臨時表就不會被刪除。只有在中斷連接時,沒有其他用戶在訪問這個表時,即某個用戶(不一定是創(chuàng)建這張全局臨時表的用戶)斷開連接并且所有其他的會話不再使用這個表時才會被刪除。

可見無論是全局臨時表還是本地臨時表,其跟普通表相比,最重要的一個差異就是其會根據(jù)需要自動創(chuàng)建。當(dāng)不再需要時其又會自動刪除。這也正是臨時表的魅力所在,其可以在數(shù)據(jù)處理的過程中,減少很多中間表格。

二、使用臨時表的好處。

在T-SQL語言中使用臨時表的好處是很顯而易見的。筆者下面就舉一些常見的好處。

如利用臨時表來組織數(shù)據(jù),比普通表會更加的簡潔、緊湊。這主要是在臨時表中可以實現(xiàn)很多的特性。如可以進(jìn)行預(yù)處理計算。如當(dāng)發(fā)現(xiàn)基本標(biāo)中的索引不怎么合適,也可以在數(shù)據(jù)庫臨時表中重新創(chuàng)建索引以優(yōu)化原有的索引。特別是當(dāng)需要多次訪問某個表或者視圖的時候,利用臨時表來組織數(shù)據(jù)是一個提高效率的好方法。即使只是一個簡單的查詢,其效率的提升也是很明顯的。為此,使用臨時表最明顯的一個好處就似乎可以提高數(shù)據(jù)庫的性能,特別是查詢的性能。

另外使用臨時表還可以減少中間表的產(chǎn)生。在進(jìn)行某些操作時,本來往往需要一些中間表的幫助才可以完成。而現(xiàn)在數(shù)據(jù)庫管理員可以讓數(shù)據(jù)庫在需要時自動生成中間表,并在用完后進(jìn)行自動刪除。如此的話,中間表的建立與刪除就不需要數(shù)據(jù)庫管理員人為的管理了。所以,使用臨時表可以減少數(shù)據(jù)庫系統(tǒng)中的垃圾表,也可以降低用戶的工作量。為此筆者認(rèn)為,臨時表是SQL Server數(shù)據(jù)庫中一個很使用的工具。作為數(shù)據(jù)庫管理員,要在平時的工作中,合理使用這個臨時表,發(fā)揮其最大的效用。雖然針對特定的任務(wù)該采用什么類型的臨時表,有很多容易混淆的地方。但是數(shù)據(jù)庫管理員不能夠因噎廢食,而應(yīng)該積極的去嘗試。

三、要對本地臨時表特別引起重視。

在平時的應(yīng)用與管理中,本地臨時表的應(yīng)用幾率要比全局臨時表多的多。而且本地臨時表由于只有用戶自己的會話可以進(jìn)行訪問,而全局臨時表則是所有用戶都可以訪問。為此在安全性上本地臨時表也要比全局臨時表高的多。為此筆者認(rèn)為數(shù)據(jù)庫管理員主要要掌握本地臨時表的應(yīng)用技巧。然后再對比的去了解全局臨時表的信息,這可能是學(xué)習(xí)SQLServer數(shù)據(jù)庫臨時表的一個捷徑。

對于本地臨時表來說,需要注意在不同情形下應(yīng)用本地臨時表其刪除的實際。如假設(shè)數(shù)據(jù)庫在執(zhí)行一個存儲過程的時候建立了本地臨時表。那么此時這個本地臨時表并不是在會話終止的時候自動刪除,而是在這個存儲過程執(zhí)行完畢后就會刪除。這是什意思呢?也就是說,用戶發(fā)起的某個會話,為了執(zhí)行一個特殊的作業(yè)(如用戶的這個會話調(diào)用了某個存儲過程)。此時其實就是會話再創(chuàng)建一個子會話的過程。在這種情況下需要注意的是,子會話創(chuàng)建的本地臨時表只在子會話內(nèi)部有效。當(dāng)這個子會話終止的時候(存儲過程執(zhí)行完畢),此時這個臨時表就會自動刪除。即對于調(diào)用這個子會話的會話來說,這個其子會話的創(chuàng)建的臨時表對于其也是無效的,因為臨時表已經(jīng)在子會話關(guān)閉的時候自動刪除。做一個形象的比喻。即現(xiàn)在做父親的去叫兒子造一座房子。當(dāng)兒子死亡的時候,這座房子也會消失。對于這種情況,數(shù)據(jù)庫管理員需要注意。父會話只能夠引用子會話從臨時表中傳遞出來的數(shù)據(jù)。也就是說,父會話要訪問子會話創(chuàng)建的臨時表的數(shù)據(jù),只有一種手段。即先讓子會話對臨時表中的數(shù)據(jù)進(jìn)行查詢或者操作,然后把結(jié)構(gòu)回傳給父會話。父會話是不能夠直接訪問子會話所創(chuàng)建的臨時表。當(dāng)然這個限制是專門針對本地臨時表而言的。對于全局臨時表來說,本身就是所有用戶都可以訪問,為此就沒有這個限制。

四、臨時表對日志與鎖的影響。

日志文件是數(shù)據(jù)庫中很重要的一個工具。無論是SQL Server數(shù)據(jù)庫還是Oracle數(shù)據(jù)庫,都有日志這個工具。如憑借重做日志工具,數(shù)據(jù)庫管理員可以在數(shù)據(jù)庫故障的時候借此來恢復(fù)數(shù)據(jù),將數(shù)據(jù)恢復(fù)到故障的那個點上。但是在使用臨時表的時候,需要注意一點,就是臨時表不會有日志文件。即對臨時表進(jìn)行的DML等操作不會形成日志文件。這個特性即有好處,也有壞處。好處是對于臨時表的更改不會保存到日志文件中。也就是說,如果數(shù)據(jù)庫發(fā)生了故障,則保存在臨時表中的數(shù)據(jù)是不能夠恢復(fù)的。為此數(shù)據(jù)庫管理員不得不重新執(zhí)行某些作業(yè)以重新生成臨時表中的數(shù)據(jù)。好處就是對于臨時表的DML操作速度會非常的塊。除了其他的原因?qū)е缕湫阅艿奶嵘猓诟钠鋬?nèi)容時不會生成日志信息也是一個重要的原因。為此對臨時表的操作不生成日志信息,這是一個雙刃劍。數(shù)據(jù)庫管理員在日常工作中,要盡量發(fā)揮其優(yōu)勢,減少其負(fù)面作用的影響。

另外,若采用臨時表這種處理機(jī)制的話,還需要注意其對鎖的影響。在介紹本地臨時表與全局臨時表差異的時候,筆者就介紹過,本地臨時表只對當(dāng)前的會話有效。即使當(dāng)前會話又創(chuàng)建了另外一個子會話,也只對子會話有效。當(dāng)某個會話終止的時候,這臨時表就會自動被刪除。而對于普通表或者全局臨時表來說,可能同時多個會話都可以訪問這個表。這兩者有什么區(qū)別呢?若允許多個會話可以同時訪問某個表的話,那么這個表就可能會遇到鎖的情況。即某個用戶會話在對表中地記錄進(jìn)行DML等操作時,為了保證數(shù)據(jù)的一致性,會對相關(guān)的記錄進(jìn)行加鎖等措施。而采用本地臨時表的話,由于只有一個會話可以訪問臨時表中的數(shù)據(jù),所以即使這個會話更改臨時表中的數(shù)據(jù),也不會有鎖沖突的問題。故其在更改本地臨時表中的數(shù)據(jù)時,就不用為其加鎖。所以,對于本地臨時表的操作速度就要比其他表來的快。故在何時的情況下使用臨時表無疑可以提高數(shù)據(jù)庫的整體性能。如可以將一些操作在臨時表中完成,然后再將最后的結(jié)果更新到基本表中。


文章標(biāo)題:在T-SQL中使用臨時表的注意事項
網(wǎng)頁鏈接:http://www.5511xx.com/article/cosdihd.html