SQL數(shù)據(jù)庫(kù)中的臨時(shí)表詳解
臨時(shí)表在SQL數(shù)據(jù)庫(kù)中,是非常重要的,下面就將為您詳細(xì)介紹SQL數(shù)據(jù)庫(kù)中臨時(shí)表的特點(diǎn)及其使用,供您參考,希望對(duì)您學(xué)習(xí)SQL Server 能夠有所幫助。
臨時(shí)表與永久表相似,但臨時(shí)表存儲(chǔ)在tempdb中,當(dāng)不再使用時(shí)會(huì)自動(dòng)刪除。臨時(shí)表有兩種類型:本地和全局。它們?cè)诿Q、可見性以及可用性上有區(qū)別。本地臨時(shí)表的名稱以單個(gè)數(shù)字符號(hào) (#) 打頭;它們僅對(duì)當(dāng)前的用戶連接是可見的;當(dāng)用戶從 SQL Server 實(shí)例斷開連接時(shí)被刪除。全局臨時(shí)表的名稱以兩個(gè)數(shù)字符號(hào) (##) 打頭,創(chuàng)建后對(duì)任何用戶都是可見的,當(dāng)所有引用該表的用戶從 SQL Server 斷開連接時(shí)被刪除。
例如,如果創(chuàng)建了employees表,則任何在數(shù)據(jù)庫(kù)中有使用該表的安全權(quán)限的用戶都可以使用該表,除非已將其刪除。如果數(shù)據(jù)庫(kù)會(huì)話創(chuàng)建了本地臨時(shí)表 #employees,則僅會(huì)話可以使用該表,會(huì)話斷開連接后就將該表刪除。如果創(chuàng)建了 ##employees 全局臨時(shí)表,則數(shù)據(jù)庫(kù)中的任何用戶均可使用該表。如果該表在您創(chuàng)建后沒有其他用戶使用,則當(dāng)您斷開連接時(shí)該表刪除。如果您創(chuàng)建該表后另一個(gè)用戶在使用該表,則 SQL Server 將在您斷開連接并且所有其他會(huì)話不再使用該表時(shí)將其刪除。
conn.Execute("SELECT newscomment_user_id AS user_id, COUNT(*) AS counter INTO #userNewsComment1 " _
& " FROM newsComment GROUP BY newscomment_user_id ")
'把從newsComment中或的數(shù)據(jù)集合寫入到臨時(shí)表 #userNewsComment1 中
'newsComment是新聞評(píng)價(jià)表
Set rs = conn.Execute("SELECT TOP 10 a.user_id AS trueId, * FROM userInfo AS a INNER JOIN userPoint AS b " _
& " ON a.user_id = b.user_id INNER JOIN View_Company AS c ON a.user_id = c.user_id " _
& " LEFT OUTER JOIN #userNewsComment1 AS d ON d.user_id = a.user_id " _
& " WHERE user_isProvinceNewsShow = 1 " _
& placeCondition & " ORDER BY d.counter DESC ")
conn.execute("drop table #userNewsComment1")
'使用完記住刪除臨時(shí)表,這里是刪除臨時(shí)表對(duì)象
這里是把臨時(shí)表運(yùn)用上
1、臨時(shí)表就是用戶在創(chuàng)建表的時(shí)候添加了“#”前綴的表,其特點(diǎn)是根據(jù)進(jìn)程獨(dú)立。只有進(jìn)程的擁有者有表的訪問權(quán)限,其它用戶不能訪問該表;
2、不同的用戶進(jìn)程,創(chuàng)建的臨時(shí)表雖然“名字”相同,但是這些表之間相互并不存在任何關(guān)系;在SQLSERVER中,通過特別的命名機(jī)制保證臨時(shí)表的進(jìn)程獨(dú)立性。
3、定單和購(gòu)買意向一般不會(huì)保存在真正的“臨時(shí)表”中,而是實(shí)際的普通表,之所以稱之為“臨時(shí)表”,只是一種叫法而已。因?yàn)殡S著一個(gè)用戶進(jìn)程的結(jié)束,真正的臨時(shí)表會(huì)自動(dòng)清除,而定單和購(gòu)買意向數(shù)據(jù)一般是定時(shí)清除,所以一定是保存在普通表中,具備數(shù)據(jù)的持久性特征(臨時(shí)表最缺乏的就是數(shù)據(jù)的持久性)。
4、真正的臨時(shí)表利用了數(shù)據(jù)庫(kù)臨時(shí)表空間,由數(shù)據(jù)庫(kù)系統(tǒng)自動(dòng)進(jìn)行維護(hù),因此節(jié)省了表空間。并且由于臨時(shí)表空間一般利用虛擬內(nèi)存,大大減少了硬盤的I/O次數(shù),因此也提高了系統(tǒng)效率。
事務(wù)完畢或會(huì)話完畢數(shù)據(jù)自動(dòng)清空,不必記得用完后刪除數(shù)據(jù)。
數(shù)據(jù)當(dāng)前會(huì)話期可見,其它的會(huì)話只能看到其結(jié)構(gòu),只能看到自己的數(shù)據(jù),各會(huì)話的數(shù)據(jù)互不干擾。 如靜態(tài)創(chuàng)建臨時(shí)表t_tmp(a number primary key,b number)
用戶A可以有數(shù)據(jù) 用戶B可以有數(shù)據(jù)
1 2 1 2
2 3 3 4
3 4 6 7
4 5
A)select count(*) from t_emp; 結(jié)果為4(B的數(shù)據(jù)它看不到)
B)select count(*) from t_emp; 結(jié)果為3(A的數(shù)據(jù)它看不到)
它們有相同的兩條記錄,但由于數(shù)據(jù)只作用于當(dāng)前會(huì)話期,所以primary key不會(huì)限制它們,只限制當(dāng)前用戶下的A唯一主鍵。
上述互不干擾特性可以用于處理中間計(jì)算過程,如果是常規(guī)表在同一時(shí)間僅能被一個(gè)會(huì)話操作,鎖定資源拒絕被其它會(huì)話訪問。
【編輯推薦】