精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

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

數據庫
借用火影忍者中宇智波. 鼬的一句名言:”任何術都是有缺陷的” 同樣,在數據庫的世界里沒有哪項技術是完美無缺的.根據實際的場景,情形,選擇合理的實現方式才是我們的初衷。

一直以來大家對臨時表與表變量的孰優孰劣爭論頗多,一些技術群里的朋友甚至認為表變量幾乎一無是處,比如無統計信息,不支持事務等等.但事實并非如此.這里我就臨時表與表變量做個對比,對于大多數人不理解或是有歧義的地方進行詳細說明.

注:這里只討論一般臨時表,對全局臨時表不做闡述.

生命周期

臨時表:會話中,proc中,或使用顯式drop

表變量:batch中

這里用簡單的code說明表變量作用域

  1. DECLARE @t TABLE(i int----定義表變量@t  
  2.  
  3. SELECT *FROM @t        -----訪問OK  
  4.  
  5. insert into @t select 1 -----插入數據OK  
  6.  
  7. select * from  @t      -------訪問OK  
  8. go                     -------結束批處理  
  9. select * from @t       -------不在作用域出錯 

注意:雖然說sqlserver在定義表變量完成前不允許你使用定義的變量.但注意下面情況仍然可正常運行!

  1. if 'a'='b' 
  2. begin 
  3. DECLARE @t TABLE(i int)  
  4. end 
  5. SELECT *FROM @t        -----仍然可以訪問!  

日志機制

臨時表與表變量都會記錄在tempdb中記錄日志

不同的是臨時表的活動日志在事務完成前是不能截斷的.

這里應注意的是由于表變量不支持truncate,所以完全清空對象結果集時臨時表有明顯優勢,而表變量只能delete

事務支持

臨時表:支持

表變量:不支持

我們通過簡單的實例加以說明

  1. create table #t (i int)  
  2. declare @t table(i int)  
  3.  
  4. BEGIN TRAN ttt  
  5. insert into #t select 1  
  6. insert into @t select 1  
  7. SELECT * FROM #t  ------returns 1 rows  
  8. SELECT * FROM @t  ------returns 1 rows  
  9. ROLLBACK tran ttt  
  10.  
  11. SELECT * FROM #t    -------no rows  
  12. SELECT * FROM @t    -------still 1 rows  
  13. drop table #t       ----no use drop @t in session 

鎖機制(select)

臨時表 會對相關對象加IS(意向共享)鎖

表變量 會對相關對象加SCH-S(架構共享)鎖(相當于加了nolock hint)

可以看出雖說鎖的影響范圍不同,但由于作用域都只是會話或是batch中,臨時表的IS鎖雖說兼容性不如表變量的SCH-S但絕大多數情況基本無影響.

感興趣的朋友可以用TF1200測試

索引支持

臨時表 支持

表變量 條件支持(僅SQL2014)

沒錯,在sql2014中你可以在創建表的同時創建索引 圖1-1

注:在sql2014之前表變量只支持創建一個默認的唯一性約束

cod

  1. DECLARE @t TABLE   
  2. (  
  3. col1 int index inx_1 CLUSTERED,   
  4. col2 int  index index_2 NONCLUSTERED,  
  5.        index index_3 NONCLUSTERED(col1,col2)  

圖1-1

  1. CREATE FUNCTION TVP_Customers (@cust nvarchar(10))  
  2. RETURNS TABLE 
  3. AS 
  4.  RETURN 
  5.  (SELECT RowNum, CustomerID, OrderDate, ShipCountry  
  6.  FROM BigOrders  
  7.  WHERE CustomerID = @cust);  
  8. GO  
  9. CREATE FUNCTION TVF_Customers (@cust nvarchar(10))  
  10. RETURNS @T TABLE (RowNum int, CustomerID nchar(10), OrderDate date,  
  11.  ShipCountry nvarchar(30))  
  12. AS 
  13. BEGIN 
  14.  INSERT INTO @T  
  15.   SELECT RowNum, CustomerID, OrderDate, ShipCountry  
  16.   FROM BigOrders  
  17.   WHERE CustomerID = @cust  
  18.   RETURN 
  19. END;  
  20.  
  21. DBCC FREEPROCCACHE  
  22. GO  
  23. SELECT * FROM TVF_Customers('CENTC');  
  24. GO  
  25. SELECT * FROM TVP_Customers('CENTC');  
  26. GO  
  27. SELECT * FROM TVF_Customers('SAVEA');  
  28. GO  
  29. SELECT * FROM TVP_Customers('SAVEA');  
  30. GO  
  31.  
  32. select b.text,a.execution_count,a.* from sys.dm_exec_query_stats a  
  33. cross apply sys.dm_exec_sql_text(a.sql_handle) b  
  34. where b.text like '%_Customers%' 

圖1-2

其它方面

表變量不支持select into,alter,truncate,dbcc等

表變量不支持table hint 如(force seek)

 

執行計劃預估

我想這里可能是引起使用何種方式爭論比較突出的地方,由于表變量沒有統計信息,無法添加索引等使得大家對其在執行計劃中的性能表現嗤之以鼻,但實際情況呢?我們需要深入分析.

關于臨時表的預估這里我就不做介紹了,主要對表變量的預估做詳細闡述.

表變量在sql2000引入的一個原因就是為了在一些執行過程中減少重編譯.以獲得更好的性能.當然帶來好處的同時也會帶來一定弊端.由于其不涉及重編譯,優化器其實并不知道表變量中的具體行數,此時他采取了保守的預估方式:預估行數為1行.如圖2-1

Code

  1. declare @t table (i int)  
  2. select * from @t-----此時0行預估行數為1行  
  3. insert into @t select 1  
  4. select * from @t-----此時1行,預估行數仍為1行  
  5. insert into @t values (2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(14),(15),(16),(17),(18),(19),(20)  
  6. select * from @t ----此時19行,預估行數仍為1行  
  7.  
  8. --....無論實際@t中有多少行,由于沒有重編譯,預估均為1行 

 

圖2-1

 所以當我們加上重編譯的的操作,此時優化器就知道了表變量的具體行數.如圖2-2

Code

  1. declare @t table (i int)  
  2. select * from @t option(recompile)-----此時0行預估行數為1行  
  3. insert into @t select 1  
  4. select * from @t  option(recompile)-----此時1行,預估行數為1行  
  5. insert into @t values (2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(14),(15),(16),(17),(18),(19),(20)  
  6. select * from @t  option(recompile)----此時19行,預估行數為19行  
  7. --....當加入重編譯hint時,優化器就知道的表變量的行數. 

圖2-2

至此,我們可以看到優化器知道了表變量中的行數.這樣在表變量掃描的過程中,尤其針對數據量較大的情形,不會因為預估總是1而引起一些問題.

如果你剛知道這里的預估原理,現有的代碼都加上重編譯那工作量可想而知了..這里介紹一個新的跟蹤標記,Trace Flag 2453.

TF2453可以一定程度上替代重編譯Hint,但只是在非簡單計劃(trivial plans)的情形下

注:TF2453只在sql2012 SP2和SQL2014中的補丁中起作用

#p#

 

表變量謂詞預估

由于表變量木有統計信息,在優化器知道整體行數的前提下將會根據謂詞的情形

采用不同的規則"猜"來進行預估.

注:這里有些規則筆者未找到微軟相應的算法文檔,經過自己根據數據推算得出.

看到這里的朋友請為我點個贊J(很長時間推算得出.可能數學忘得差不多了)

注:由于檢索對象本身及為變量,謂詞為變量,或是常數無影響

常見謂詞下預估算法:

a ">", "<" 運算符 按照表變量數據量的30%進行預估

b "like" 運算符 按照表變量數據量的10%進行預估

c "=" 運算符 按照表變量數據量的0.75次方預估

實例如圖2-3

code

  1. declare @i int 
  2. set @i=13  
  3. DECLARE @T TABLE(I INT);  
  4. INSERT INTO @T VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(14),(15),(16),(17),(18),(19),(20)  
  5. ------表變量中存在個數字  
  6. select * from @T where I < 1  option(recompile) ------20*30% 預估數為6  
  7. select * from @T where I > @i option(recompile) --------20*30%預估數為6  
  8. select * from @T where I like @i  option(recompile) --------20*10% 預估數為2  
  9. select * from @T where I like 1  option(recompile)  --------20*10 預估數為2  
  10. select * from @T where I = @i  option(recompile) --------POWER(20.00000,0.75) 預估數為9.45742  
  11. select * from @T where I = 1  option(recompile)  --------POWER(20.00000,0.75) 預估數為9.45742  
  12.  
  13. insert into @T  
  14. select DatabaseLogID from AdventureWorks2008R2.dbo.DatabaseLog------insert new records  
  15. select * from @T option(recompile) ------------此時數據為行  
  16. select * from @T where I = 1  option(recompile)--------------------POWER(1617.00000,0.75) 預估數為254.99550 

 

圖2-3

可以看出根據不同的謂詞優化器會采用不同的預估方式,雖然它不如統計信息下的密度,直方圖等來的精確(尤其是等值預估,在數據量巨大的情形下,其效果可能接近統計信息),但在了解數據的前提下如果適合表變量我們還是可以大膽使用的.

Tempdb競爭

tempdb的競爭本身涵蓋的知識面比較大,這里我們只討論臨時表與表變量的孰優孰劣.

通過前面的介紹我們知道臨時表是支持事務的,而表變量時不支持的.正因如此很多人放棄了表變量的使用.但任何事情都有兩方面,支持就一定好嗎?由于臨時表對事務的支持,在高并發的情形中可能正因為其事務的支持造成系統表鎖,總而影響并發.

 

我們通過一個簡單的實例來說明

日常管理中,我發現很多開發人員在使用臨時表時采用select * into #t from …的語法,這樣的寫法如果數據量稍大,將會造成事務持有系統表鎖的時間變長,從而影響并發,吞吐.我們通過一個簡單的實例說明.如圖3-1

 

Code 我們通過sqlquerystress模擬并發

  1. ----SSMS測試數據  
  2. Use tempdb  
  3. create table t  
  4. ( id int identity,str1 char(8000))----more pages for many records  
  5.  
  6. insert into t select 'a' 
  7. go 100  
  8.  
  9. ----sqlquerystress  
  10. select * into #t  
  11. from t----57s  
  12.  
  13. ----sqlquerystress  
  14. declare @t table 
  15. ( id int,str1 char(8000))  
  16. insert into @t  
  17. select * from t-----1s 

圖3-1

通過圖3-1可以看出上述情形中臨時表簡直不堪重負.臨時表與表變量到底該如何應用不是看誰比誰的優點多,應視具體情形而定

結語:借用火影忍者中宇智波. 鼬的一句名言:”任何術都是有缺陷的” 同樣,在數據庫的世界里沒有哪項技術是完美無缺的.根據實際的場景,情形,選擇合理的實現方式才是我們的初衷.

原文出自:http://www.cnblogs.com/shanksgao/p/3988089.html

責任編輯:林師授 來源: shanks_gao的博客
相關推薦

2010-09-27 08:52:06

搭建無線局域網

2010-09-15 11:02:36

搭建無線局域網

2011-06-17 10:10:02

2015-03-19 17:03:57

大數據

2011-05-05 15:43:29

投影機

2014-07-29 09:23:13

LTEEPC無線

2017-06-16 15:54:53

數據中心自動化IT

2009-03-09 09:16:00

無線局域網無線網絡實施

2009-03-02 14:19:33

CiscoWi-Fi通話調度

2009-12-03 10:45:28

2011-05-24 09:49:02

有線無線3G

2022-10-27 10:09:59

東數西算布局

2009-10-22 16:06:57

網絡綜合布線系統

2010-09-16 15:10:48

SQL Server表

2011-03-29 13:22:07

SQL Server臨時表表變量

2017-08-02 16:15:12

2009-10-21 15:10:28

大樓綜合布線系統

2010-07-22 16:02:29

2010-09-08 17:35:25

SQL表變量
點贊
收藏

51CTO技術棧公眾號

日韩欧美亚洲国产另类| 国产精品进线69影院| 欧美在线视频观看| 免费一级黄色录像| 精品一区二区三区在线观看视频| 婷婷开心激情综合| 亚洲精品一区二| 欧美一区二区黄片| 麻豆国产欧美日韩综合精品二区| 欧美激情一区二区三区在线视频观看 | 国产在线看一区| 久久久久久一区二区三区 | 精品国产一级片| 国产精品视区| 久久精品小视频| 精品无码在线视频| 秋霞影院一区| 欧美日韩一区二区欧美激情| 黄色一级片在线看| 免费黄色网页在线观看| 91亚洲资源网| 91九色在线观看| 自拍偷拍精品视频| 一本色道久久综合一区 | 国产传媒免费在线观看| 亚洲va久久久噜噜噜久久| 欧美一区二区三区视频| 无遮挡又爽又刺激的视频| ririsao久久精品一区| 国产精品久久一卡二卡| 欧美国产二区| 视频在线观看你懂的| 精品在线播放免费| 国产成人精品视频在线| 成人在线免费看视频| 亚洲第一精品影视| 九九九热精品免费视频观看网站| 国产综合精品久久久久成人av| 看全色黄大色大片免费久久久| 欧美一卡二卡三卡| 亚洲色图欧美自拍| 亚洲黑人在线| 欧美片网站yy| 精品日韩久久久| 经典三级一区二区| 欧美日韩午夜视频在线观看| 久久这里只有精品8| xvideos国产在线视频| 国产精品成人网| 亚洲精品影院| 在线看的av网站| 中文字幕一区二区在线观看| 亚洲激情电影在线| 欧美精品日韩少妇| 亚洲欧美激情一区二区| 国产又粗又大又爽的视频| 浪潮av一区| 亚洲免费成人av| 欧美人与动牲交xxxxbbbb| 亚洲综合影视| 亚洲在线观看免费视频| 国产小视频免费| 国产高清在线a视频大全| 亚洲一级二级三级| 青草青青在线视频| 女海盗2成人h版中文字幕| 欧美日韩中文字幕在线视频| 欧美少妇性生活视频| 三上悠亚国产精品一区二区三区| 色菇凉天天综合网| 日韩一级免费片| 国产一区二区三区免费在线 | 国产剧情日韩欧美| 国产毛片一区二区三区va在线| 国产精品一区二区无线| 国产精品一区二区三区在线观| 手机在线精品视频| 久久久三级国产网站| 亚洲国产精品一区在线观看不卡| 在线观看免费黄色| 一区二区三区四区在线播放 | 亚洲国内精品在线| 亚洲av无码国产精品麻豆天美| 清纯唯美亚洲综合一区| 久久99久国产精品黄毛片入口| 懂色av.com| 日韩高清在线不卡| 99理论电影网| 国产一级片在线| 一区二区三区国产精品| 一本大道熟女人妻中文字幕在线 | 日本免费一区二区三区| 黄网页在线观看| 午夜精品aaa| 成人在线观看a| 一区二区三区免费在线看| 亚洲精品福利视频| 99成人在线观看| 亚洲片区在线| 国产精品日韩一区| 亚洲国产www| 久久久久久久一区| 日本一道在线观看| 欧美gay囗交囗交| 欧美久久久影院| 2一3sex性hd| 97视频精品| 26uuu亚洲伊人春色| 国产免费黄色片| 国产亚洲综合在线| 屁屁影院ccyy国产第一页| 日韩漫画puputoon| 日韩av在线一区| www中文在线| 国产精品老牛| av一区和二区| 免费在线观看av网站| 五月婷婷综合激情| 三级网站免费看| 四虎8848精品成人免费网站| 57pao成人永久免费视频| 国产高清第一页| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 天天在线女人的天堂视频| 亚洲人成网站色在线观看 | 国内不卡的二区三区中文字幕 | www.久久com| 欧美日韩中字| 国产成人精品久久二区二区91| 欧美性受xxxx狂喷水| 亚洲日本成人在线观看| 天天色综合天天色| 国产精品一区二区99| 2021久久精品国产99国产精品| 亚洲精品一区二区三区区别 | 特黄视频免费看| 成人美女视频在线看| www.在线观看av| www.神马久久| 欧美第一淫aaasss性| 国产同性人妖ts口直男| 久久久电影一区二区三区| 鲁一鲁一鲁一鲁一澡| 久久久伦理片| 51久久精品夜色国产麻豆| 二区三区在线视频| 一区二区三区日韩在线观看| 日本在线观看免费视频| 久久综合色占| 日本精品一区二区三区在线| 亚洲人视频在线观看| 亚洲va欧美va人人爽| 性囗交免费视频观看| 136国产福利精品导航网址| 亚洲一区二区三区xxx视频| 看女生喷水的网站在线观看| 欧美日韩国产综合一区二区三区| 欧美激情视频二区| 免费不卡在线视频| 一区在线电影| 电影一区二区三区久久免费观看| 久久久91精品| 99国产精品99| 亚洲一区二区三区免费视频| 无码人妻一区二区三区一| 欧美日韩免费| 韩国成人av| 中文日产幕无线码一区二区| 亚洲精品网站在线播放gif| 国产亚洲欧美日韩高清| 亚洲国产经典视频| 日本高清久久久| 综合久久精品| 国产精品theporn88| 黄在线观看免费网站ktv| 日韩精品在线播放| 精品国产www| 亚洲女子a中天字幕| 美女露出粉嫩尿囗让男人桶| 1000部精品久久久久久久久| 欧美12av| 国产精品美女午夜爽爽| 欧美另类第一页| 亚洲区小说区图片区| 欧美日韩三级视频| 久久午夜无码鲁丝片午夜精品| www.亚洲精品| 一区二区xxx| 亚洲高清不卡| 亚洲一区二区三区涩| 成人午夜网址| 91精品国产高清久久久久久久久 | 天天操天天操天天| 欧美视频一区在线观看| 久久艹精品视频| 国产欧美视频一区二区三区| 99国产精品免费视频| 亚洲影院在线| 成人高清dvd| 欧美三级三级| 国产伦精品一区二区三区免费视频 | 国产在线观看精品一区| 日韩午夜电影av| 国产日韩在线免费观看| 亚洲高清免费观看高清完整版在线观看| 久久久精品人妻无码专区| 国内精品写真在线观看| 久久免费视频3| 欧美日韩mv| 偷拍视频一区二区| 五月国产精品| 国产精品一区二区三区精品| 日本电影久久久| 日韩av三级在线观看| 欧美14一18处毛片| 久久精彩免费视频| 精品视频三区| 日韩精品视频免费| 男人天堂一区二区| 日韩欧美不卡一区| 国产精品久久久久久免费播放| 色琪琪一区二区三区亚洲区| 国产污视频在线观看| 亚洲精品国产一区二区精华液| 欧美另类69xxxx| 国产三级精品三级| ass精品国模裸体欣赏pics| 成人综合婷婷国产精品久久免费| 欧美视频亚洲图片| 久久99精品久久久| 亚洲少妇久久久| 久久久国产精品一区二区中文| 成人在线播放网址| 欧美另类女人| 一本大道东京热无码aⅴ| 99热在线成人| 亚洲黄色成人久久久| 日韩成人激情| 亚洲一区二区在线观| 精品美女久久久| 青娱乐国产91| 精品视频国产| 日韩亚洲一区在线播放| 蜜桃一区二区三区| 欧美18视频| blacked蜜桃精品一区| 欧美成人免费在线| 国产剧情在线观看一区| 日本一区二区三区视频免费看| 国产一区二区三区91| 欧美亚洲另类久久综合| 沈樵精品国产成av片| 欧洲一区二区日韩在线视频观看免费 | 老司机免费视频久久| 99蜜桃臀久久久欧美精品网站| 性欧美精品高清| 人妻无码视频一区二区三区| 日韩高清不卡一区二区| 成年人三级黄色片| 国产麻豆一精品一av一免费| 潘金莲一级淫片aaaaaaa| 粉嫩欧美一区二区三区高清影视| 黑人玩弄人妻一区二区三区| 99精品国产热久久91蜜凸| 少妇精品一区二区三区| 国产欧美日韩激情| 国产福利视频网站| 亚洲国产精品一区二区久久恐怖片| 亚欧视频在线观看| 色av成人天堂桃色av| 97人妻精品一区二区三区视频| 欧美一区二区三区人| 色综合视频在线| 亚洲视频在线播放| 成人国产免费电影| 97色在线视频观看| 国产原创一区| 成人欧美一区二区| 美女久久99| 超碰在线免费观看97| 日韩午夜av| 少妇一级淫免费放| 国产suv精品一区二区6| 久久精品成人av| 亚洲欧洲日韩女同| 日韩乱码一区二区| 欧美日韩成人一区二区| 亚洲国产福利视频| 国产一区二区三区在线| 伊人影院蕉久影院在线播放| 日韩av免费看网站| 日韩一二三区在线观看| 欧美日韩成人一区二区三区| 婷婷六月综合| 国产男女无遮挡| 国产一区二区调教| 无码国产69精品久久久久同性| 亚洲久本草在线中文字幕| www.国产一区二区| 日韩精品一区国产麻豆| 国产高清av在线| 久久久久久久一区二区| 日本成人一区二区| 你懂的视频在线一区二区| 在线看片不卡| 波多结衣在线观看| 91丨porny丨户外露出| 肉色超薄丝袜脚交69xx图片 | 午夜肉伦伦影院| 丰满岳乱妇一区二区三区| 中文字幕 自拍| 午夜激情综合网| 丰满人妻一区二区三区免费| 日韩在线视频网站| 亚洲日本网址| 欧美一区二区三区电影在线观看| 黄色精品一区| 国产资源中文字幕| 中文字幕欧美区| 一级片中文字幕| 亚洲成在人线av| 免费电影网站在线视频观看福利| 国产在线视频不卡| 国产欧美日韩在线观看视频| 欧美老熟妇喷水| 成人毛片视频在线观看| 欧美精品色哟哟| 欧美一区二区视频在线观看| 中文字幕在线免费| 国产精品久久久久久久久久久久| 久久不见久久见中文字幕免费| 欧美s码亚洲码精品m码| 白白色 亚洲乱淫| 久久久久久久久久一区二区三区| 91精品国产综合久久国产大片| 午夜在线视频播放| 国产精品第100页| 国内黄色精品| 爱情岛论坛成人| 亚洲国产高清不卡| 伊人影院中文字幕| 色999日韩欧美国产| 亚洲欧洲一二区| 亚洲区成人777777精品| 国产福利电影一区二区三区| 欧美又粗又大又长| 精品欧美一区二区三区精品久久| 91中文在线| 国产福利久久| 日韩视频在线一区二区三区 | 日韩精品在线视频免费观看| 久99久精品视频免费观看| 欧日韩不卡视频| 欧美三区视频| 国产91色在线|| 国产精品毛片一区二区在线看舒淇| 高清不卡在线观看| 一区二区免费在线播放| 久久精品91久久香蕉加勒比| 欧美黄色激情视频| 国产一区2区| 亚洲级视频在线观看免费1级| 四川一级毛毛片| 国产欧美啪啪| 国产在线拍揄自揄拍无码| 国产酒店精品激情| 免费在线视频一区二区| 精品国产乱码久久久久久浪潮| 国产美女高潮在线| 欧美精品久久久| 久久成人综合网| 久久久久国产精品夜夜夜夜夜| 精品国精品国产尤物美女| 日韩理论视频| 一区二区日本伦理| 国产大片一区二区| 婷婷激情五月网| 中文字幕9999| 日本精品视频| 亚洲国产精品久久久久爰色欲| 欧美激情一区在线| 精品人妻午夜一区二区三区四区 | 欧美一区欧美二区| 欧美6一10sex性hd| 日韩久久在线| 国产成人在线视频网站| 波多野结衣国产| 久久人人爽人人爽人人片亚洲| 国产伦精品一区二区三区免费优势 | 人妖粗暴刺激videos呻吟| 欧美性猛交xxxx富婆| 快射av在线播放一区| 精品国产一区二区三| 久久国产免费看| 99精品视频99| 欧美xxxx做受欧美| 国产欧美一区二区精品久久久| 国产麻豆剧传媒精品国产| 91成人免费电影| а√天堂8资源中文在线|