国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

臨時表VS表變量--因地制宜,合理使用

2024-07-21 02:49:11
字體:
來源:轉載
供稿:網友
臨時表VS表變量--因地制宜,合理使用
一直以來大家對臨時表與表變量的孰優孰劣爭論頗多,一些技術群里的朋友甚至認為表變量幾乎一無是處,比如無統計信息,不支持事務等等.但事實并非如此.這里我就臨時表與表變量做個對比,對于大多數人不理解或是有歧義的地方進行詳細說明.
注:這里只討論一般臨時表,對全局臨時表不做闡述.
生命周期
臨時表:會話中,PRoc中,或使用顯式drop
表變量:batch中
這里用簡單的code說明表變量作用域
DECLARE @t TABLE(i int) ----定義表變量@tSELECT *FROM @t        -----訪問OKinsert into @t select 1 -----插入數據OKselect * from  @t      -------訪問OKgo                     -------結束批處理select * from @t       -------不在作用域出錯
注意:雖然說sqlserver在定義表變量完成前不允許你使用定義的變量.但注意下面情況仍然可正常運行!

if 'a'='b'beginDECLARE @t TABLE(i int)endSELECT *FROM @t        -----仍然可以訪問!
日志機制
臨時表與表變量都會記錄在tempdb中記錄日志
不同的是臨時表的活動日志在事務完成前是不能截斷的.
這里應注意的是由于表變量不支持truncate,所以完全清空對象結果集時臨時表有明顯優勢,而表變量只能delete
事務支持
臨時表:支持
表變量:不支持
我們通過簡單的實例加以說明
create table #t (i int)declare @t table(i int)BEGIN TRAN tttinsert into #t select 1insert into @t select 1SELECT * FROM #t  ------returns 1 rowsSELECT * FROM @t  ------returns 1 rowsROLLBACK tran tttSELECT * FROM #t    -------no rowsSELECT * FROM @t    -------still 1 rowsdrop table #t       ----no use drop @t in session

鎖機制(select)
臨時表 會對相關對象加IS(意向共享)鎖
表變量 會對相關對象加SCH-S(架構共享)鎖(相當于加了nolock hint) 
可以看出雖說鎖的影響范圍不同,但由于作用域都只是會話或是batch中,臨時表的IS鎖雖說兼容性不如表變量的SCH-S但絕大多數情況基本無影響.
感興趣的朋友可以用TF1200測試
索引支持
臨時表 支持
表變量 條件支持(僅SQL2014)
沒錯,在sql2014中你可以在創建表的同時創建索引 圖1-1
注:在sql2014之前表變量只支持創建一個默認的唯一性約束code
DECLARE @t TABLE (col1 int index inx_1 CLUSTERED, col2 int  index index_2 NONCLUSTERED,       index index_3 NONCLUSTERED(col1,col2))

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 汨罗市| 兴业县| 苏州市| 子洲县| 北安市| 灵川县| 平度市| 上蔡县| 达尔| 宁化县| 灵宝市| 大英县| 贞丰县| 石景山区| 定边县| 贵溪市| 莲花县| 锦州市| 林芝县| 安义县| 富蕴县| 睢宁县| 曲阜市| 汉阴县| 凤台县| 弥勒县| 浑源县| 灯塔市| 新蔡县| 泰兴市| 东宁县| 永安市| 镇巴县| 荥阳市| 南陵县| 沅江市| 弥渡县| 惠来县| 蓬安县| 沅江市| 漳浦县|