SQLServer表變量與臨時表

表變量

變量都以@或@@爲前綴,表變量是變量的一種,另外一種變量被稱爲標量(可以理解爲標準變量,就是標準數據類型的變量,例如整型int或者日期型DateTime)。以@前綴的表變量是本地的,因此只有在當前用戶會話中才可以訪問,而@@前綴的表變量是全局的,通常都是系統變量,比如說@@error代表最近的一個T-SQL語句的報錯號。當然因爲表變量首先是個變量,因此它只能在一個Batch中生存,也就是我們所說的邊界,超出了這個邊界,表變量也就消亡了。

表變量存放在內存中,正是因爲這一點所有用戶訪問表變量的時候SQL Server是不需要生成日誌。
————————————————

 

 

臨時表

臨時對象都以#或##爲前綴,臨時表是臨時對象的一種,還有例如臨時存儲過程、臨時函數之類的臨時對象,臨時對象都存儲在系統數據庫的tempdb中。以#前綴的臨時表爲本地的,因此只有在當前用戶會話中才可以訪問,而##前綴的臨時表是全局的,因此所有用戶會話都可以訪問。臨時表以會話爲邊界,只要創建臨時表的會話沒有結束,臨時表就會持續存在,當然用戶在會話中可以通過DROP TABLE命令提前銷燬臨時表。

我們前面說過臨時表存儲在tempdb中,因此臨時表的訪問是有可能造成物理IO的,當然在修改時也需要生成日誌來確保一致性,同時鎖機制也是不可缺少的。

 

 

 

 

 

      最近突然想到這個問題,記錄下來鞏固一下自己的知識。

      表,臨時表,表變量,相信很多人都用過,truncate table @表變量 會報錯,相信很多人也遇到過,不過真正去思考爲什麼的人可能少之又少,畢竟大多數情況下,我們大部分的人只需要會用,而不需要去知道爲什麼,更何況國內的項目總是那麼緊張,本來還有的那點求知慾,可能也會被任務,績效考覈衝跑了。

      那到底爲什麼表變量不能truncate呢,這就需要了解truncate這個命令的本質,truncate table 是通過釋放存儲表數據所用的數據頁來刪除數據。而表變量的數據是保存在內存中的,而非磁盤中,那麼就truncate table 試圖釋放表變量並不存在的 “數據頁”, 當然會報錯了。

 

 轉載:https://blog.csdn.net/ChengR666/article/details/120344576

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章