表变量和临时表的使用
????? 存儲過程涉及到兩個表,一個是用戶今日積分表@tableUserScore(數據源來自用戶積分詳情表中的今日數據),一個是用戶積分統計表UserScoreSum,該存儲過程邏輯就是統計@tableUserScore中用戶不同原因的積分值,生成到表UserScoreSum中。數據量不算很大,@tableUserScore中大概40萬條,但這個存儲過程執行時間卻有些驚人,通常都在1個小時之上。優化的最終結果是將表變量@tabeUserScore換成了臨時表#tableUserScore,并在userid和reason上添加了聯合索引,優化的效果是執行時間控制在了40S左右。臨時表和表變量效率相差百倍,這次優化經歷讓我對臨時表和表變量有了重新認識,也有了一連串的疑問,它們是如何存儲的,效率如何,如何選用?
表結構 declare @tableUserScore table(userid int, --用戶編號
name varchar(10), --用戶姓名
reason varchar(32), --積分原因
score int --積分值
)
create table UserScoreSum(
userid int, --用戶編號
name varchar(10), --用戶姓名
createTime datetime, --時間
reason1Score int, --原因1積分值
reason2Score int, --原因2積分值
reason3Score int, --原因3積分值
reason4Score int, --原因4積分值
)
?????以下是個人翻閱資料后的理解,總結出來希望能給和我有同樣認識的人提個醒,起到拋磚引玉的作用,也希望大家對理解錯誤之處提出指正。
???? 臨時表
???? 臨時表有兩種類型:本地表和全局表。在與首次創建或引用表時相同的 SQL Server 實例連接期間,本地臨時表只對于創建者是可見的。當用戶與 SQL Server 實例斷開連接后,將刪除本地臨時表。全局臨時表在創建后對任何用戶和任何連接都是可見的,當引用該表的所有用戶都與 SQL Server 實例斷開連接后,將刪除全局臨時表。本地臨時表的名稱都是以“#”為前綴,全局臨時表的名稱都是以“##”為前綴。
???? 臨時表存儲在tempdb中,因此臨時表的訪問是有可能造成物理IO的,當然在修改時也需要生成日志來確保一致性,同時鎖機制也是不可缺少的。
???? 臨時表可以創建索引,也可以定義統計數據,所以可以用數據定義語言(DDL)的聲明來阻止臨時表添加的限制,約束,并參照完整性,如主鍵和外鍵約束。
???? 表變量
???? 表變量是變量的一種,表變量也分為本地及全局的兩種,本地表變量的名稱都是以“@”為前綴,只有在本地當前的用戶連接中才可以訪問。全局的表變量的名稱都是以“@@”為前綴,一般都是系統的全局變量,像我們常用到的,如@@Error代表錯誤的號,@@RowCount代表影響的行數。
???? 表變量存放在內存中,正是因為這一點所有用戶訪問表變量的時候SQL Server是不需要生成日志。同時變量是不需要考慮其他會話訪問的問題,因此也不需要鎖機制,對于非常繁忙的系統來說,避免鎖的使用可以減少一部分系統負載。[表變量存放在內存是有一定限制的,如果表變量數據量超過閾值,會把內存耗盡,然后使用TempDB的空間,這樣主要還是使用硬盤空間,但同時把內存基本耗盡,增加了內存調入調出的機會,反而降低速度]
???? 表變量另外還有一個限制就是不能創建索引,當然也不存在統計數據的問題,因此在用戶訪問表變量的時候也就不存在執行計劃選擇的問題了(也就是以為著編譯階段后就沒有優化階段了),這一特性有的時候是件好事,而有些時候卻會造成一些麻煩。
???? 臨時表 vs. 表變量
???? 1.存儲位置:臨時表是利用了硬盤(tempdb數據庫) ,表名變量是占用內存,因此小數據量當然是內存中的表變量更快。當大數據量時,就不能用表變量了,太耗內存了。大數據量時適合用臨時表。
?????2.性能:不能一概而論,表變量存儲數據有個性能臨界點,在這個臨界點之內,表變量比臨時表快,表變量是存儲在內存中的。
?????3.索引:表變量不支持索引和統計數據,但可以有主鍵;臨時表則可以支持索引和統計數據。
???? 我們對于較小的臨時計算用數據集考慮使用表變量。如果數據集比較大,如果在代碼中用于臨時計算,同時這種臨時使用永遠都是簡單的全數據集掃描而不需要考慮什么優化,比如說沒有分組或分組很少的聚合(比如說COUNT、SUM、AVERAGE、MAX等),也可以考慮使用表變量。使用表變量另外一個考慮因素是應用環境的內存壓力,如果代碼的運行實例很多,就要特別注意內存變量對內存的消耗。一般對于大的數據集我們最好使用臨時表,同時創建索引。
轉載于:https://www.cnblogs.com/RealmKing/p/4364766.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的表变量和临时表的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 状态压缩 之 UVA 10944 - N
- 下一篇: Linux服务器运行环境搭建(二)——R