亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

探秘重編譯(Recompilations)(2/2)

2024-07-21 02:46:43
字體:
來源:轉載
供稿:網友
探秘重編譯(Recompilations)(2/2)

在上一篇文章里,我討論了使用臨時表如何引起SQL Server里的重編譯。在文章最后我提到,今天這篇文章我會聚焦表變量(Table Variables)的更多信息,它可以避免重編譯的昂貴開銷。我們來詳細分析下。

表變量(Table Variables)

表變量總局限于提交到SQL Server的批處理語句范圍。當你在批處理語句范圍外引用表變量時,SQL Server就會返回你一條錯誤信息。這是和臨時表相比第1個重大區別。下列代碼向你展示了如何創建和使用表變量——只在簡單存儲過程的上下文里。

 1 CREATE PROCEDURE DemonstrateTableVariablesNoRecompiles 2 AS 3 BEGIN 4     DECLARE @tempTable TABLE 5     ( 6         ID INT IDENTITY(1, 1) PRIMARY KEY, 7         FirstName CHAR(4000), 8         LastName CHAR(4000) 9     )10     11     INSERT INTO @TempTable (FirstName, LastName)12     SELECT TOP 1000 name, name FROM master.dbo.syscolumns13     14     SELECT * FROM @TempTable15 END16 GO

表變量的好處是它們不會引起任何重編譯。當你執行這個存儲過程并用SQL Server Profiler跟蹤時,不會發現重編譯事件。

1 EXEC dbo.DemonstrateTableVariablesNoRecompiles

為什么使用表變量就可以這樣呢?首先表變量就是個變量——名副其實。當你定義你的表變量時,意味著你不會改變你的數據庫架構。因此基于數據酷架構改變的重編譯就可以避免。另外表變量是沒有統計信息的。因此沒有統計信息需要維護,第2個引起重編譯原因也就消失了。

首先,這2樣聽起來都很棒,但當我們進一步分析時,就會發現它的重大缺點。我們來看看。表變量近乎就是個變量。在臨時表里,表變量還是持續的。是的,你沒看錯:當你使用表變量時,會涉及到臨時表里的物理I/O操作。這個可以用動態管理視圖sys.dm_db_session_space_usage來驗證,它是在會話級別跟蹤臨時表的使用率。我們來看下面的代碼(請【新建查詢】執行下列代碼):

 1 -- Create a table variable 2 DECLARE @tempTable TABLE 3 ( 4     ID INT IDENTITY(1, 1) PRIMARY KEY, 5     FirstName CHAR(4000), 6     LastName CHAR(4000) 7 ) 8  9 -- Insert 4 records into the table variable10 INSERT INTO @tempTable (FirstName, LastName) VALUES11 (12     'Woody',13     'Tu'14 ),15 (16     'Woody',17     'Tu'18 ),19 (20     'Woody',21     'Tu'22 ),23 (24     'Woody',25     'Tu'26 )27 28 -- Retrieve the data from the table variable.29 -- The execution plan estimates 1 row.30 SELECT * FROM @tempTable31 GO32 33 -- Review the space used in TempDb.34 -- Our table variable currently needs 5 pages in TempDb.35 -- The 5 needed pages from the table variable are already marked for deallocation (column "user_objects_dealloc_page_count")36 SELECT * FROM sys.dm_db_session_space_usage37 WHERE session_id = @@SPID38 GO

從圖中可以看出,這個表變量在臨時表里需要分配5個頁。因為這個表變量已經超過范圍,這5個頁面也已被標記為重分配(deallocation)。你要知道這個副作用。

表變量也沒有統計信息。因此這里沒有重編譯發生。但是作為一個副作用,查詢優化器始終認為估計行數為1.這個會非常,非常糟糕。如果你從表變量連接你數據庫里另外一張表。在那個情況下,查選優化器在執行計劃里引入嵌套循環連接(Nested Loop Join)運算符,引用的表變量作為外表,因為估計行數是1。如果事實上返回行是10000或更多的話,整個執行計劃就談不上最優。我們來看下面的例子(點擊工具欄的顯示包含實際的執行計劃):

 1 CREATE PROCEDURE BadPerformingQuery 2 AS 3 BEGIN 4     DECLARE @tempTable TABLE 5     ( 6         ID INT IDENTITY(1, 1) PRIMARY KEY, 7         FirstName CHAR(4000), 8         LastName CHAR(4000) 9     )10     11     INSERT INTO @TempTable (FirstName, LastName)12     SELECT TOP 20000 name, name FROM master.dbo.syscolumns13     14     -- The physical Join Operator will be a Nested Loop,15     -- because Nested Loop is optimized for 1 row in the outer loop.16     SELECT * FROM AdventureWorks2008R2.Person.Person p17     INNER JOIN @tempTable t ON t.ID = p.BusinessEntityID18 END19 GO

我們仔細看下聚集索引掃描(Clustered Index Scan)運算符的屬性信息,你會看到這里的估計行數是1,而實際行數卻是12622。

你可以通過自SQL Server 2005起引入的語句級別的重編譯(Statement-Level Recompilation)來修正這個基數預估錯誤。

 1 -- Use a statement-level recompilation to fix the problem with the  2 -- cardinality estimation. 3 ALTER PROCEDURE BadPerformingQuery 4 AS 5 BEGIN 6     DECLARE @tempTable TABLE 7     ( 8         ID INT IDENTITY(1, 1) PRIMARY KEY, 9         FirstName CHAR(4000),10         LastName CHAR(4000)11     )12     13     INSERT INTO @TempTable (FirstName, LastName)14     SELECT TOP 20000 name, name FROM master.dbo.syscolumns15     16     -- The physical Join Operator will be a Nested Loop,17     -- because Nested Loop is optimized for 1 row in the outer loop.18     SELECT * FROM AdventureWorks2008R2.Person.Person p19     INNER JOIN @tempTable t ON t.ID = p.BusinessEntityID20     OPTION (RECOMPILE)21 END22 GO

但是這個方法有點產生相反效果的(counter-productive),因為你又引入了重編譯,原先你使用表變量就是為了避免重編譯。

小結

使用表變量你可以避免SQL Server里重編譯的負荷,但同樣也有副作用。最大的副作用就是錯誤參數估計——估計行數為1。因此當你和小數量行打交道時可以使用表變量,因為那時錯誤的基數預估并不重要,也不影響你的性能。但和大量數據行打交道時,它會傷害你的性能,因為生成了低效的執行計劃。

作為通常的經驗法則(general rule-of-thumb),對于大數量的數據,你應該使用臨時表,表變量用在小數量的數據上。但是你真的要為你的工作量測試(benchmark)下,來決定什么時候使用臨時表,什么時候使用表變量是正確的。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩高清有码在线| 91亚洲国产成人精品性色| 亚洲日韩欧美视频一区| 欧美国产日韩一区| 国产精品福利在线观看网址| 精品久久久久久| 亚洲最大激情中文字幕| 日韩专区在线播放| 欧美电影电视剧在线观看| 黄色精品在线看| 91青草视频久久| 国产精品自拍偷拍| 亚洲精品资源美女情侣酒店| 日韩av免费一区| 日韩精品在线观| 欧美日韩激情视频| 国产精品99导航| 日韩精品免费电影| 欧美日韩国产成人在线观看| 亚洲欧洲日产国产网站| 中文字幕欧美精品在线| 成人国产精品一区| 亚洲精品之草原avav久久| 色香阁99久久精品久久久| 国产精品96久久久久久| 久久影院模特热| 日韩成人中文字幕| 国产精品激情av在线播放| 国产在线一区二区三区| 日韩av在线网址| 欧美在线观看网址综合| 久久久噜噜噜久久中文字免| 国产成人亚洲精品| 国产精品自产拍高潮在线观看| 亚洲精品丝袜日韩| 欧美成人精品在线视频| 国产精品久久久久久久av大片| 久久精品国产亚洲精品| 日韩国产欧美精品一区二区三区| 国产视频福利一区| 欧美日韩中文字幕在线视频| 久久精彩免费视频| 欧美人交a欧美精品| 国产成人综合久久| 久久精品一区中文字幕| 成人国产精品免费视频| 91在线精品视频| 久久精品国产精品| 亚洲第一精品自拍| 国产精品视频永久免费播放| 欧美日韩国产成人在线观看| 欧美最猛性xxxxx免费| 庆余年2免费日韩剧观看大牛| 日韩国产在线播放| 91夜夜揉人人捏人人添红杏| 欧美麻豆久久久久久中文| 亚洲色图狂野欧美| 亚洲a中文字幕| 国产日韩一区在线| 欧美国产高跟鞋裸体秀xxxhd| 国产一区二区三区在线播放免费观看| 91精品视频在线| 欧美乱妇高清无乱码| 日韩高清不卡av| 日韩网站免费观看高清| 成人性生交xxxxx网站| 高清欧美性猛交| 国产精品欧美日韩久久| 亚洲最大的免费| 久久久久久国产精品久久| 色综合久久久久久中文网| 亚洲va久久久噜噜噜| 亚洲精品网址在线观看| 国产精品国内视频| 日韩亚洲成人av在线| 久久久久久久久电影| 亚洲天堂免费观看| 国产偷国产偷亚洲清高网站| 96pao国产成视频永久免费| 欧美野外wwwxxx| 久久久久久中文字幕| 亚洲最大福利视频| 日韩小视频在线| xxav国产精品美女主播| 日本免费久久高清视频| 日韩高清a**址| 7777精品久久久久久| 伊人久久免费视频| 欧美肥臀大乳一区二区免费视频| 亚洲成年人在线播放| 欧美激情精品久久久久久变态| 欧美激情精品久久久久久久变态| 欧美精品少妇videofree| 欧美色videos| 亚洲理论电影网| 欧美极品少妇全裸体| 大伊人狠狠躁夜夜躁av一区| 亚洲女人天堂色在线7777| 欧美男插女视频| 91久久国产精品91久久性色| 亚洲专区中文字幕| 国产精品69精品一区二区三区| 久久精品国产2020观看福利| 中文字幕在线日韩| 成人精品视频99在线观看免费| 亚洲欧美日韩一区二区在线| 国产精品嫩草影院久久久| 日韩精品视频中文在线观看| 国产精品亚洲综合天堂夜夜| 亚洲午夜av久久乱码| 91亚洲国产成人久久精品网站| 成人免费福利在线| 亚洲三级黄色在线观看| 成人日韩在线电影| 亚洲人成啪啪网站| 欧美色videos| 国产精品99蜜臀久久不卡二区| 国产精品永久在线| 国产九九精品视频| 精品偷拍一区二区三区在线看| 国产精品7m视频| 国产一区二区三区视频免费| 美女精品视频一区| 91精品在线观| 亚洲一区二区黄| 久久精品国产91精品亚洲| 国产精自产拍久久久久久| 国产精品视频在线观看| 日产日韩在线亚洲欧美| 91久久久久久久| 欧美日韩国产激情| 欧美激情网友自拍| 欧美性精品220| 国外成人在线视频| 亚洲成av人片在线观看香蕉| 国产精品日韩精品| 日本精品久久久久久久| 欧美在线视频一区二区| 热草久综合在线| 精品亚洲一区二区三区在线观看| 国内精品久久久久| 九九热精品在线| 91av中文字幕| 久久精品99久久久香蕉| 日韩电影在线观看永久视频免费网站| 日本欧美一二三区| 亚洲精品欧美极品| 国产欧美日韩精品专区| 欧美激情第一页xxx| 国产精品亚洲综合天堂夜夜| 欧美性xxxxx极品| 日韩av免费在线看| 最近中文字幕日韩精品| 国产亚洲欧美日韩美女| 成人444kkkk在线观看| 4438全国亚洲精品在线观看视频| 日韩欧美中文字幕在线观看| 精品国产区一区二区三区在线观看| 国产精品久久久久久久久久久久久久| 国产精品久久久久久超碰| 亚洲黄在线观看| 国产日韩在线免费| 亚洲人成电影网站色…| 亚洲精品久久久久国产|