日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

表变量和临时表的使用

發(fā)布時間:2024/7/19 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 表变量和临时表的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
表變量存儲在內存中,而臨時表存儲在tempdb中,會涉及到物理IO讀寫,那么我們是否可以由此得出結論,使用表變量要比使用臨時表效率高呢?相信有一部分人會和我有同樣的想法,使用表變量的效率高,真是如此嗎?先從一次優(yōu)化存儲過程的經歷說起。

????? 存儲過程涉及到兩個表,一個是用戶今日積分表@tableUserScore(數據源來自用戶積分詳情表中的今日數據),一個是用戶積分統(tǒng)計表UserScoreSum,該存儲過程邏輯就是統(tǒng)計@tableUserScore中用戶不同原因的積分值,生成到表UserScoreSum中。數據量不算很大,@tableUserScore中大概40萬條,但這個存儲過程執(zhí)行時間卻有些驚人,通常都在1個小時之上。優(yōu)化的最終結果是將表變量@tabeUserScore換成了臨時表#tableUserScore,并在userid和reason上添加了聯(lián)合索引,優(yōu)化的效果是執(zhí)行時間控制在了40S左右。臨時表和表變量效率相差百倍,這次優(yōu)化經歷讓我對臨時表和表變量有了重新認識,也有了一連串的疑問,它們是如何存儲的,效率如何,如何選用?

表結構 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積分值
)

?????以下是個人翻閱資料后的理解,總結出來希望能給和我有同樣認識的人提個醒,起到拋磚引玉的作用,也希望大家對理解錯誤之處提出指正。

???? 臨時表

???? 臨時表有兩種類型:本地表和全局表。在與首次創(chuàng)建或引用表時相同的 SQL Server 實例連接期間,本地臨時表只對于創(chuàng)建者是可見的。當用戶與 SQL Server 實例斷開連接后,將刪除本地臨時表。全局臨時表在創(chuàng)建后對任何用戶和任何連接都是可見的,當引用該表的所有用戶都與 SQL Server 實例斷開連接后,將刪除全局臨時表。本地臨時表的名稱都是以“#”為前綴,全局臨時表的名稱都是以“##”為前綴。

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

???? 臨時表可以創(chuàng)建索引,也可以定義統(tǒng)計數據,所以可以用數據定義語言(DDL)的聲明來阻止臨時表添加的限制,約束,并參照完整性,如主鍵和外鍵約束。

???? 表變量

???? 表變量是變量的一種,表變量也分為本地及全局的兩種,本地表變量的名稱都是以“@”為前綴,只有在本地當前的用戶連接中才可以訪問。全局的表變量的名稱都是以“@@”為前綴,一般都是系統(tǒng)的全局變量,像我們常用到的,如@@Error代表錯誤的號,@@RowCount代表影響的行數。

???? 表變量存放在內存中,正是因為這一點所有用戶訪問表變量的時候SQL Server是不需要生成日志。同時變量是不需要考慮其他會話訪問的問題,因此也不需要鎖機制,對于非常繁忙的系統(tǒng)來說,避免鎖的使用可以減少一部分系統(tǒng)負載。[表變量存放在內存是有一定限制的,如果表變量數據量超過閾值,會把內存耗盡,然后使用TempDB的空間,這樣主要還是使用硬盤空間,但同時把內存基本耗盡,增加了內存調入調出的機會,反而降低速度]

???? 表變量另外還有一個限制就是不能創(chuàng)建索引,當然也不存在統(tǒng)計數據的問題,因此在用戶訪問表變量的時候也就不存在執(zhí)行計劃選擇的問題了(也就是以為著編譯階段后就沒有優(yōu)化階段了),這一特性有的時候是件好事,而有些時候卻會造成一些麻煩。

???? 臨時表 vs. 表變量

???? 1.存儲位置:臨時表是利用了硬盤(tempdb數據庫) ,表名變量是占用內存,因此小數據量當然是內存中的表變量更快。當大數據量時,就不能用表變量了,太耗內存了。大數據量時適合用臨時表。

?????2.性能:不能一概而論,表變量存儲數據有個性能臨界點,在這個臨界點之內,表變量比臨時表快,表變量是存儲在內存中的。

?????3.索引:表變量不支持索引和統(tǒng)計數據,但可以有主鍵;臨時表則可以支持索引和統(tǒng)計數據。

???? 我們對于較小的臨時計算用數據集考慮使用表變量。如果數據集比較大,如果在代碼中用于臨時計算,同時這種臨時使用永遠都是簡單的全數據集掃描而不需要考慮什么優(yōu)化,比如說沒有分組或分組很少的聚合(比如說COUNT、SUM、AVERAGE、MAX等),也可以考慮使用表變量。使用表變量另外一個考慮因素是應用環(huán)境的內存壓力,如果代碼的運行實例很多,就要特別注意內存變量對內存的消耗。一般對于大的數據集我們最好使用臨時表,同時創(chuàng)建索引。

轉載于:https://www.cnblogs.com/RealmKing/p/4364766.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的表变量和临时表的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。