表变量与临时表的优缺点
生活随笔
收集整理的這篇文章主要介紹了
表变量与临时表的优缺点
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
表變量與臨時表的優(yōu)缺點
什么情況下使用表變量?什么情況下使用臨時表?
表變量:??
? DECLARE @tb? table(id?? int?? identity(1,1), name?? varchar(100))???
? INSERT @tb??
? SELECT id, name?
? FROM mytable?
? WHERE name like ‘zhang%’?
?
臨時表:?
? SELECT name, address
? INTO #ta?? FROM mytable??
? WHERE name like ‘zhang%’
?
表變量和臨時表的比較:
- 臨時表是利用了硬盤(tempdb數(shù)據(jù)庫) ,表名變量是占用內(nèi)存,因此小數(shù)據(jù)量當然是內(nèi)存中的表變量更快。當大數(shù)據(jù)量時,就不能用表變量了,太耗內(nèi)存了。大數(shù)據(jù)量時適合用臨時表。
- 表變量缺省放在內(nèi)存,速度快,所以在觸發(fā)器,存儲過程里如果數(shù)據(jù)量不大,應該用表變量。
- 臨時表缺省使用硬盤,一般來說速度比較慢,那是不是就不用臨時表呢?也不是,在數(shù)據(jù)量比較大的時候,如果使用表變量,會把內(nèi)存耗盡,然后使用 TEMPDB的空間,這樣主要還是使用硬盤空間,但同時把內(nèi)存基本耗盡,增加了內(nèi)存調(diào)入調(diào)出的機會,反而降低速度。這種情況建議先給TEMPDB一次分配合適的空間,然后使用臨時表。
- 臨時表相對而言表變量主要是多了I/O時間,但少了對內(nèi)存資源的占用。數(shù)據(jù)量較大的時候,由于對內(nèi)存資源的消耗較少,使用臨時表比表變量有更好的性能。
- 建議:觸發(fā)器、自定義函數(shù)用表變量;存儲過程看情況,大部分用表變量;特殊的應用,大數(shù)據(jù)量的場合用臨時表。
- 表變量有明確的作用域,在定義表變量的函數(shù)、存儲過程或批處理結(jié)束時,會自動清除表變量。
- 在存儲過程中使用表變量與使用臨時表相比,減少了存儲過程的重新編譯量。
- 涉及表變量的事務只在表變量更新期間存在。這樣就減少了表變量對鎖定和記錄資源的需求。
- 表變量需要事先知道表結(jié)構(gòu),普通臨時表,只在當前會話中可用與表變量相同into一下就可以了,方便;全局臨時表:可在多個會話中使用存在于temp中需顯示的drop。(不知道表結(jié)構(gòu)情況下臨時表方便一些)
- 全局臨時表的功能是表變量沒法達到的。
- 表變量不必刪除,也就不會有命名沖突,臨時表特別是全局臨時表用的時候必須解決命名沖突。
- 應避免頻繁創(chuàng)建和刪除臨時表,減少系統(tǒng)表資源的消耗。
- 在新建臨時表時,如果一次性插入數(shù)據(jù)量很大,那么可以使用select into代替create table,避免log,提高速度;如果數(shù)據(jù)量不大,為了緩和系統(tǒng)表的資源,建議先create table,然后insert。
- 如果臨時表的數(shù)據(jù)量較大,需要建立索引,那么應該將創(chuàng)建臨時表和建立索引的過程放在單獨一個子存儲過程中,這樣才能保證系統(tǒng)能夠很好的使用到該臨時表的索引。
- 如果使用到了臨時表,在存儲過程的最后務必將所有的臨時表顯式刪除,先truncate table,然后drop table,這樣可以避免系統(tǒng)表的較長時間鎖定。
- 慎用大的臨時表與其他大表的連接查詢和修改,減低系統(tǒng)表負擔,因為這種操作會在一條語句中多次使用tempdb的系統(tǒng)表。
轉(zhuǎn)載于:https://www.cnblogs.com/BrokenIce/p/5713238.html
總結(jié)
以上是生活随笔為你收集整理的表变量与临时表的优缺点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习:算法模型:决策树
- 下一篇: 数据绑定原理