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

首頁 > 開發 > 綜合 > 正文

曲苑雜壇--數據庫更新探秘

2024-07-21 02:50:37
字體:
來源:轉載
供稿:網友
曲苑雜壇--數據庫更新探秘

眾所周知,SQL SERVER在更新數據時有兩個輔助表(deleted和inserted)供我們使用,但是在數據跟新時,真的是先刪除記錄在插入記錄嗎?

讓我們來測試下:

PS:以下測試在簡單恢復模式的數據庫上運行,使用checkpoint來截斷日志,使用TRACE FLAG 3505來阻止系統checkpoint。

測試方式:更新數據,查看日志記錄

DROP TABLE TB2GOCREATE TABLE TB2(    C1 INT PRIMARY KEY IDENTITY(1,1),    C2 NVARCHAR(1000),    C3 BIGINT)INSERT INTO TB2(C2,C3)SELECT name,OBJECT_ID FROM sys.all_columnsGOCHECKPOINT--=====================================--更新數據UPDATE  TB2SET C3=0WHERE C1=4--=====================================--查看生成的日志SELECT F.[Current LSN],F.Operation,F.Context,F.[Transaction ID],F.AllocUnitName,F.[Page ID]FROM fn_dblog(NULL,NULL) AS FORDER BY [Current LSN] DESC

再次測試

DROP TABLE TB2GOCREATE TABLE TB2(    C1 INT PRIMARY KEY IDENTITY(1,1),    C2 NVARCHAR(1000),    C3 BIGINT)INSERT INTO TB2(C2,C3)SELECT name,OBJECT_ID FROM sys.all_columnsGOCHECKPOINT--=====================================--更新數據UPDATE  TB2SET C2=REPLICATE('AB',40)WHERE C1=4--=====================================--查看生成的日志SELECT F.[Current LSN],F.Operation,F.Context,F.[Transaction ID],F.AllocUnitName,F.[Page ID],F.[Slot ID]FROM fn_dblog(NULL,NULL) AS FORDER BY [Current LSN] DESC

測試結論:1>在更新時,如果更新后的數據不會造成數據移動(如頁拆分情況)時,直接修改該行數據即可,而如果造成數據移動如頁拆分的話,則采用先刪除再插入的方式移動一些數據行(移動的數據行可能不是要更新數據行),來為要更新的行騰出足夠空間,來更新數據行。2>無論采用何種方式更新數據,在觸發器中都能使用DELETED和INSERTED表來獲取更新前和更新后數據。

3>數據操作導致頁拆分時,頁拆分操作會被當做單獨事務處理,這樣可以在回滾數據操作時避免回滾頁拆分。(感謝JentleWang指點)。

--====================================================================

在上面的操作中,更新操作導致數據的變化,因此需要寫入日志,記錄數據變化,那如果更新操作不導致數據變化呢?

讓我們再來測試下:

測試方式:在表TB2中導入5000+數據,表中只有4條數據的C2列值為456,其余行的C2列值為123,我們嘗試更新整表數據的C2列值為123(針對5000+數據更新,但實際發生數據變化只有4行)

DROP TABLE TB2GOCREATE TABLE TB2(    C1 INT PRIMARY KEY IDENTITY(1,1),    C2 BIGINT)INSERT INTO TB2(C2)SELECT 123 FROM sys.all_columnsGOUPDATE TB2SET C2=456WHERE C1<5GOCHECKPOINT--=====================================--更新數據UPDATE TB2SET C2=123--=====================================--查看生成的日志SELECT F.[Current LSN],F.Operation,F.Context,F.[Transaction ID],F.AllocUnitName,F.[Page ID],F.[Slot ID]FROM fn_dblog(NULL,NULL) AS FORDER BY [Current LSN] DESC

可以發現,雖然提示消息顯示5134行數據受影響,但實際上只有四條日志記錄被寫入日志,這四條日志記錄分別對應發生數據變化的行(依據page ID和solt ID來確定)。

出查看日志外,我們也可以使用數據脹頁來查看

--=============================================--確保表中只有4條數據的C2列不為123UPDATE TB2SET C2=123GOUPDATE TB2SET C2=456WHERE C1<5GOCHECKPOINTGO--=============================================--更新前查看數據脹頁--PS: 在checkpoint結束后立即檢查脹頁,會發現還有--少量脹頁存在,需要等待一段時間WAITFOR DELAY '0:0:10'GOSELECT * FROM sys.dm_os_buffer_descriptorsWHERE database_id = DB_ID() AND is_modified = 1ORDER BY page_id;--=====================================--更新數據UPDATE TB2SET C2=123--=============================================--更新后查看數據脹頁SELECT * FROM sys.dm_os_buffer_descriptorsWHERE database_id = DB_ID() AND is_modified = 1ORDER BY page_id;

運行上面code會發現,在表TB2進行整表更新后,只有一個數據脹頁(表TB2共有14個數據頁),由此我們也可以推斷出只有部分數據頁受影響。

測試結論:在數據更新時,如果當前行數據沒有發生變化,那么不會在日志中記錄該行數據,也不會因此將該行所在的頁標示為脹頁。

PS: 上述結論基于INT/DATETIME/CHAR/VARCHAR/NCHAR/NVARCHAR類型進行測試得出,在對TEXT/NTEXT測試時發現,即使值未發生改變,仍產生日志和數據脹頁。

--================================================

關于deleted和inserted,最常見的應用場景就是在觸發器中,使用在OUTPUT中較少,做個demo:

--=======================================--創建測試表CREATE TABLE TB1(    ID INT IDENTITY(1,1) PRIMARY KEY,    C1 NVARCHAR(200))GO --=======================================--向測試表中導入100條數據INSERT INTO TB1(C1)SELECT TOP(100)name FROM sys.all_columnsGO--=======================================--更新測試表中10條數據,并找出被更新的行的IDDECLARE @Tem TABLE(ID INT)UPDATE TOP(10) TB1SET C1='ABC'OUTPUT inserted.ID INTO @Tem(ID)SELECT * FROM @Tem

在上面的demo中,我們可以很容易地利用deleted和inserted來查看受影響的數據行。利用inserted,我們可以在批量插入自增表中獲取所有生成的自增值(@@IDENTITY只能獲取最后一行的值)。

對于deleted和inserted,會記錄操作中影響的所有行(即使行上的值未發生變化),同樣對于在觸發器中使用的UPDATE()函數,該函數同樣只判斷列是否受影響,而不判斷值是否改變。

--================================================

黃色背景中描述的刪除插入以及更新均指在數據頁上的操作,請勿和DML語句中的操作相混淆。

網上流傳的版本:

UPDATE操作會被轉換成兩種方式中的一種:

1. XXX條件下,直接update數據行

2. XXX條件下,先刪除數據舊行,再插入數據新行

對于這種版本,我曾經也認為時對的,并且記錄在筆記本中,時間太久,找不到原出處。先仔細推敲測試,方覺得不對頭,諸君可以發表下看法。

個人測試結論:

1.對于固定存儲空間的數據列進行更新時,由于數據長度肯定不會發生變化,因此直接修改數據,slotID 不會發生變化,行在頁上的位置不發生變化。

2.對于不固定存儲空間的數據列進行更新時,可能會直接update數據,也可能先刪除在插入數據行(即使更新后的數據長度比更新前要小,也可能會導致先刪除再更新的情況),slotID 不會發生變化,刪除插入會導致行在頁上的位置發生變化,即行在頁上的偏移量發生變化。

3.對于不固定存儲空間的數據列進行更新時,即使更新行所在位置后面有充足空間(未被其他數據行使用),也可能發生刪除插入的情況。

4. 無論是在原位置上直接更新還是刪除插入導致行偏移量變化,都不會記錄日志

有興趣的同志可以閱讀下這篇:http://www.cnblogs.com/wwwwgou/

--================================================

參考來源:

http://www.cnblogs.com/nzperfect/archive/2012/12/12/2814554.html

--================================================

妹子來啦


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产在线一区二区三区| 精品国产欧美一区二区三区成人| 午夜精品一区二区三区av| 亚洲白拍色综合图区| 国产成人鲁鲁免费视频a| 69久久夜色精品国产7777| 97视频人免费观看| 黑人精品xxx一区一二区| 欧美视频在线观看免费| 国产精品狠色婷| 亚洲一区二区三区四区在线播放| 91色琪琪电影亚洲精品久久| 92国产精品视频| 欧美另类xxx| 欧美精品videos另类日本| 久99九色视频在线观看| 亚洲精品欧美日韩| 精品亚洲一区二区三区在线观看| 福利精品视频在线| 欧美不卡视频一区发布| 欧美激情videoshd| 黄网站色欧美视频| 久久久久久久久久久网站| 97精品伊人久久久大香线蕉| 国产精品自产拍在线观看| 欧美乱妇高清无乱码| 久久精品精品电影网| 欧美精品video| 国产精品入口日韩视频大尺度| 欧美黑人视频一区| 欧美性猛交xxxx黑人猛交| 亚洲性夜色噜噜噜7777| 色黄久久久久久| 成人有码在线播放| 欧美激情一级二级| 欧美视频在线观看 亚洲欧| 久久全国免费视频| 国产z一区二区三区| 欧美激情二区三区| 国产午夜精品久久久| 日韩成人免费视频| 精品亚洲国产成av人片传媒| 午夜剧场成人观在线视频免费观看| 国产精品com| 欧美综合在线观看| 亚洲男人天堂久| 青青青国产精品一区二区| 亚洲成人黄色在线| 亚洲欧美综合精品久久成人| 久久久成人精品视频| 日韩精品高清在线| 亚洲在线观看视频网站| 奇米4444一区二区三区| 精品综合久久久久久97| 久久久91精品国产一区不卡| 欧美在线影院在线视频| 欧美一区二三区| 欧美激情久久久| 亚洲国产精彩中文乱码av| 美女999久久久精品视频| 亚洲欧美www| 亚洲aⅴ日韩av电影在线观看| 亚洲一品av免费观看| 亚洲欧美日韩图片| 97在线看免费观看视频在线观看| 性欧美视频videos6一9| 最近2019年日本中文免费字幕| 激情久久av一区av二区av三区| 亚洲国产又黄又爽女人高潮的| 992tv成人免费视频| 亚洲精品之草原avav久久| 亚洲国产精品高清久久久| 中文字幕精品一区久久久久| 日韩在线观看精品| 精品一区二区三区四区在线| 中文字幕欧美精品在线| 国产精品扒开腿爽爽爽视频| 国产成人啪精品视频免费网| 精品亚洲一区二区| 精品久久久久久久久中文字幕| 91精品国产777在线观看| 91av视频导航| 92国产精品视频| 狠狠色狠狠色综合日日小说| 国产一区二区黑人欧美xxxx| 国产成人亚洲综合91精品| 色妞一区二区三区| 日本精品视频网站| 91视频国产一区| 色yeye香蕉凹凸一区二区av| 欧美电影《睫毛膏》| 久久久亚洲国产| 欧美国产视频日韩| 性夜试看影院91社区| 91久久国产精品91久久性色| 成人免费视频97| 国产欧美亚洲视频| 亚洲乱码一区av黑人高潮| 亚洲色图欧美制服丝袜另类第一页| www欧美日韩| 久久影院中文字幕| 午夜剧场成人观在线视频免费观看| 91sao在线观看国产| 欧美亚洲在线播放| 亚洲天堂av女优| 91亚洲国产精品| 国产精品久久久久久久久久久久久久| 精品中文字幕久久久久久| 欧美午夜精品久久久久久久| 97在线日本国产| 国产欧美一区二区三区视频| 日韩中文字幕精品| 精品国产依人香蕉在线精品| 亚洲图片欧美午夜| 久久精品视频网站| 欧美日韩成人在线播放| 国产日韩精品在线| 亚洲人成伊人成综合网久久久| 亚洲最大成人在线| 欧美性猛xxx| 亚洲国产成人av在线| 91产国在线观看动作片喷水| 欧美性黄网官网| 永久免费看mv网站入口亚洲| 国产专区精品视频| 亚洲第一在线视频| 中文字幕精品视频| 日韩激情视频在线播放| 亚洲成色999久久网站| 久久久电影免费观看完整版| 最近2019年日本中文免费字幕| 亚洲欧美日韩一区二区三区在线| xxav国产精品美女主播| 91精品久久久久久综合乱菊| 日韩美女毛茸茸| 韩曰欧美视频免费观看| 91在线高清免费观看| 好吊成人免视频| 国产精品成人一区二区三区吃奶| 国产精品一区二区三区成人| 欧美国产精品va在线观看| 日韩av影片在线观看| 国产成人综合av| 中文字幕日韩欧美| 久久精品男人天堂| 91理论片午午论夜理片久久| 国产99久久久欧美黑人| 亚洲电影中文字幕| 最近2019年中文视频免费在线观看| 国产亚洲一级高清| 国内精品模特av私拍在线观看| 久久99精品久久久久久噜噜| 亚洲黄一区二区| 午夜精品久久久久久久久久久久| 96精品视频在线| 91欧美精品成人综合在线观看| 8090理伦午夜在线电影| 久久久久久国产精品美女| 国产香蕉一区二区三区在线视频| 国产精品视频网站| 欧美激情18p| 日韩欧美国产成人| 最近中文字幕日韩精品| 国产成+人+综合+亚洲欧洲|