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