臨時(shí)表: CREATE TABLE #temp( id int NOT NULL, name varchar(100)) 表變量: DECLARE @temp table ( id int NOT NULL, name varchar(100))
不同: 1. 表變量脫離了事務(wù)機(jī)制的范圍。rollback對(duì)表變量的數(shù)據(jù)不起作用。 2. 主要的不同是任何一個(gè)使用臨時(shí)表的存儲(chǔ)過(guò)程都不會(huì)被預(yù)編譯,然而使用表變量的存儲(chǔ)過(guò)程的執(zhí)行計(jì)劃可以預(yù)先靜態(tài)的編譯。預(yù)編譯一個(gè)腳本的主要好處 在于加快了執(zhí)行的速度。這個(gè)好處對(duì)于長(zhǎng)的存儲(chǔ)過(guò)程更加顯著,因?yàn)閷?duì)它來(lái)說(shuō)重新編譯代價(jià)太高。 3. 表變量?jī)H存在于那些變量能存在的相同范圍內(nèi)。它在內(nèi)部存儲(chǔ)過(guò)程和exec(string)語(yǔ)句里是不可見(jiàn)的。 4. 使用表變量主要需要考慮的就是應(yīng)用程序?qū)?nèi)存的壓力,如果代碼的運(yùn)行實(shí)例很多,就要特別注意內(nèi)存變量對(duì)內(nèi)存的消耗。我們對(duì)于較小的數(shù)據(jù)或者是通 過(guò)計(jì)算出來(lái)的推薦使用表變量。如果數(shù)據(jù)的結(jié)果比較大,在代碼中用于臨時(shí)計(jì)算,在選取的時(shí)候沒(méi)有什么分組的聚合,就可以考慮使用表變量。 5. 一般對(duì)于大的數(shù)據(jù)結(jié)果,或者因?yàn)榻y(tǒng)計(jì)出來(lái)的數(shù)據(jù)為了便于更好的優(yōu)化,我們就推薦使用SQL Server臨時(shí)表,同時(shí)還可以創(chuàng)建索引,由于臨時(shí)表是存放 在Tempdb中,一般默認(rèn)分配的空間很少,需要對(duì)tempdb進(jìn)行調(diào)優(yōu),增大其存儲(chǔ)的空間。 6. 函數(shù)中不能支持SQL Server臨時(shí)表。這是由于函數(shù)不能對(duì)函數(shù)作用域外部的資源狀態(tài)造成永久性的更改,在SQLServer中也稱(chēng)為副作用(sideeffect)。 不過(guò)如果在函數(shù)中使用大型的臨時(shí)結(jié)果集是不推薦的,因?yàn)槿绻麑⑦@樣的函數(shù)放置到一個(gè)查詢中會(huì)造成很明顯的性能問(wèn)題,因此這種情況一般都采用存儲(chǔ)過(guò)程之類(lèi)的批處理腳本。 7. 存儲(chǔ)過(guò)程不接受表類(lèi)型的參數(shù)。 8. 表變量雖然不支持索引,但是表變量支持主鍵阿,所以可以利用主鍵來(lái)替代索引。
9. 由于表變量不支持統(tǒng)計(jì)數(shù)據(jù),因此在一個(gè)存儲(chǔ)過(guò)程中使用表變量可以減少由于數(shù)據(jù)變化而導(dǎo)致的重新編譯問(wèn)題。
10.表變量同時(shí)也不支持并行執(zhí)行計(jì)劃,因此對(duì)于大型的臨時(shí)結(jié)果集,表變量也不是一個(gè)好的選擇
|