臨時表: 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é)果集,表變量也不是一個好的選擇
|