成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

SQLSERVER 的 truncate 和 delete 區(qū)別解析

瀏覽:253日期:2023-03-06 14:25:47
目錄
  • 一:背景
    • 1. 講故事
  • 二:區(qū)別詳解
    • 1. 思考
    • 2. 觀察 delete 的事務(wù)日志。
    • 3. 觀察 truncate 的事務(wù)日志。
  • 三:GAM 空間管理
    • 1. 基本原理
  • 四:總結(jié)

    一:背景

    1. 講故事

    在面試中我相信有很多朋友會被問到 truncate 和 delete 有什么區(qū)別 ,這是一個很有意思的話題,本篇我就試著來回答一下,如果下次大家遇到這類問題,我的答案應(yīng)該可以幫你成功度過吧。

    二:區(qū)別詳解

    1. 思考

    從宏觀角度來說, delete 是 DML 語句, truncate 是 DDL 語句,這些對數(shù)據(jù)庫產(chǎn)生破壞類的語句肯定是要被 sqlserver 跟蹤的,言外之意就是在某些場景下可以被回滾的,既然可以被 回滾,那自然就會產(chǎn)生 事務(wù)日志,所以從 事務(wù)日志 的角度入手會是一個好的辦法。

    為了方便測試,還是用上一篇的 post 表,創(chuàng)建好之后插入10條記錄,參考sql如下:

    DROP TABLE dbo.post;CREATE TABLE post (id INT IDENTITY, content CHAR(1000) DEFAULT "aaaaaa")INSERT post DEFAULT VALUES GO 10

    有了數(shù)據(jù)之后就可以通過 fn_dblog 函數(shù)從 MyTestDB.ldf 中提取事務(wù)日志來觀察 delete 和 truncate 日志的不同點。

    2. 觀察 delete 的事務(wù)日志。

    為了觀察 delete 產(chǎn)生的日志,這里用 @max_lsn 記錄一下起始點,參考sql如下:

    DECLARE @max_lsn VARCHAR(100)SELECT @max_lsn=[Current LSN] FROM fn_dblog(NULL,NULL)DELETE FROM post;SELECT * FROM fn_dblog(NULL,NULL) WHERE [Current LSN] >@max_lsn

    從事務(wù)日志看, delete 主要做了兩件事情。

    10 行 delete 記錄刪除

    這里就有一個好奇的地方了,sqlserver 是如何執(zhí)行刪除操作的呢?要回答這個問題需要到數(shù)據(jù)頁上找答案,參考sql如下:

    DBCC IND(MyTestDB,post,-1)DBCC PAGE(MyTestDB,1,240,2)

    從圖中可以得到如下兩點信息, 至少在堆表下 delete 操作并沒有刪除 Page,第二個是 delete 記錄刪除只是將 slot 的指針 抹0

    有些朋友可能要問,為什么還有對 PFS 的操作呢?很簡單它就是用來記錄當(dāng)前頁面的 占用空間比率 的,可以看下我的上一篇文章。

    3. 觀察 truncate 的事務(wù)日志。

    delete 原理搞清楚之后,接下來看下 truncate 做了什么?參考sql 如下:

    DROP TABLE dbo.post;CREATE TABLE post (id INT IDENTITY, content CHAR(1000) DEFAULT "aaaaaa")INSERT post DEFAULT VALUES GO 10DECLARE @max_lsn VARCHAR(100)SELECT @max_lsn=[Current LSN] FROM fn_dblog(NULL,NULL)TRUNCATE TABLE dbo.postSELECT [Current LSN],Operation,Context,AllocUnitName FROM fn_dblog(NULL,NULL) WHERE [Current LSN] >@max_lsn

    從圖中可以看到,truncate 主要是對 IAM, PFS, GAM 三個空間管理數(shù)據(jù)頁做了修改,并沒有涉及到 PAGE 頁,那就有一個疑問了,我的PAGE頁還在嗎?可以用 DBCC IND 看下。

    我去,truncate 操作居然把我的 PAGE 頁給弄丟了,它是怎么實現(xiàn)的呢? 要想找到答案,大家可以想一想, truncate 是一個 DDL 語句,為了快速釋放表數(shù)據(jù),它干脆把 postpage 的關(guān)系給切斷了,如果大家有點懵,畫個圖大概就是下面這樣。

    為了驗證這個結(jié)論,可以用 DBCC PAGE 直接導(dǎo)出 240 號數(shù)據(jù)頁,觀察下是不是表中的數(shù)據(jù),不過遺憾的是,這個數(shù)據(jù)頁已不歸屬 post 表了。。。

    接下來又得回答另外一個問題,sqlserver 是如何切斷的? 這里就需要理解 GAM 空間管理機制。

    三:GAM 空間管理

    1. 基本原理

    GAM 是用來跟蹤 區(qū)分配 狀態(tài)的數(shù)據(jù)頁,它是用一個 bit 位跟蹤一個 區(qū), 在數(shù)據(jù)庫中一個區(qū)表示 連續(xù)的8個數(shù)據(jù)頁,在 GAM 數(shù)據(jù)頁中,用 1 表示可分配的初始狀態(tài),用 0 表示已分配狀態(tài),可能大家有點懵,我再畫個簡圖吧。

    為了讓大家眼見為實,還是用 post 給大家做個演示。

    DROP TABLE dbo.post;CREATE TABLE post (id INT IDENTITY, content CHAR(1000) DEFAULT "aaaaaa")INSERT post DEFAULT VALUES GO 10DBCC TRACEON(3604)DBCC IND(MyTestDB,post,-1)

    從圖中可以看到,post 表分配的數(shù)據(jù)頁是 240241 號,對應(yīng)的區(qū)號就是 240/8 + 1 = 31,因為 GAM 是用 1bit 來跟蹤一個區(qū),所以理論上 GAM 頁面偏移 31bit 的位置就標(biāo)記了該區(qū)的分配情況。

    這么說可能大家又有點懵,我準(zhǔn)備用 windbg 來演示一下,首先大家要記住 GAM 是 mdf 文件中的第三個頁面,用 2 表示, 前兩個分別是 文件頭 和 PFS 頁,關(guān)于頁面的首地址可以用 DBCC PAGE(MyTestDB,1,2,2) 導(dǎo)出來。

    0:078> dp 00000009009F8000 +0x60 00000009`009f8060 00000000`005e0000 00000000`00000000 00000009`009f8070 00000000`00000000 00000000`00000000 00000009`009f8080 00000000`00000000 00000000`00000000 00000009`009f8090 00000000`00000000 00000000`00000000 00000009`009f80a0 00000000`00000000 00000000`00000000 00000009`009f80b0 00000000`00000000 00000000`00000000 00000009`009f80c0 d0180000`00001f38 ffffffff`ffffffd1 00000009`009f80d0 ffffffff`ffffffff ffffffff`ffffffff

    從輸出內(nèi)容看,那個 0x1f38 就是 bitmap 數(shù)組的長度,后面就是 bit 的占用情況,因為在 31 bit 上,我們觀察一個 int 就好了,輸出如下:

    從圖中可以看到,全部都是 0 也就說明當(dāng)前都是分配狀態(tài),如果是 1 表示未分配,接下來把 post 給 truncate 掉再次觀察 GAM 頁。

    TRUNCATE TABLE dbo.post;DBCC PAGE(MyTestDB,1,2,2)

    輸出如下:

    0:117> dp 00000009009F8000+0x60 00000009`009f8060 00000000`005e0000 00000000`00000000 00000009`009f8070 00000000`00000000 00000000`00000000 00000009`009f8080 00000000`00000000 00000000`00000000 00000009`009f8090 00000000`00000000 00000000`00000000 00000009`009f80a0 00000000`00000000 00000000`00000000 00000009`009f80b0 00000000`00000000 00000000`00000000 00000009`009f80c0 d0184000`00001f38 ffffffff`ffffffd1 00000009`009f80d0 ffffffff`ffffffff ffffffff`ffffffff

    對比之后會發(fā)現(xiàn)由原來的 000000001f38 變成了 400000001f38,可以用 .format 來格式化下。

    從圖中看 31bit 跟蹤的第 31 號區(qū)被回收了,也就驗證了真的切斷了聯(lián)系。

    同樣的道理 PFS 偏移的 0n240 位置跟蹤的這個頁面也是被釋放狀態(tài)。

    四:總結(jié)

    總的來說,delete 操作是將數(shù)據(jù)頁中的每個 slot 指針一條一條的擦掉,每次擦除都會產(chǎn)生一條事務(wù)日志,所以對海量數(shù)據(jù)進行 delete 會產(chǎn)生海量的事務(wù)日志,導(dǎo)致你的 日志文件 暴增。而 truncate 是直接切斷 post 和 page 的聯(lián)系,只需要修改幾個空間管理頁的 bit 位即可。

    最后的建議是如果要清空表數(shù)據(jù),建議用 truncate table

    到此這篇關(guān)于SQLSERVER 的 truncate 和 delete 有區(qū)別嗎?的文章就介紹到這了,更多相關(guān)sqlserver truncate 和 delete 區(qū)別內(nèi)容請搜索以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持!

    標(biāo)簽: MsSQL
    成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
    国产视频一区在线播放| 亚洲黄色免费电影| 1000精品久久久久久久久| av不卡一区二区三区| 制服丝袜国产精品| 日韩在线卡一卡二| 亚洲在线观看| 一区二区三区精品视频| 亚洲午夜电影| 国产欧美精品在线观看| 北条麻妃国产九九精品视频| 欧美猛男超大videosgay| 亚洲电影一级片| 亚洲一级在线| 亚洲视频一区二区在线观看| 99久久国产综合精品色伊| 日韩一区二区三区电影| 国产精品99久久久| 欧美一卡二卡三卡| 国产精品一区2区| 5858s免费视频成人| 国产一区二区三区香蕉| 欧美日韩国产精品成人| 九色综合国产一区二区三区| 在线欧美日韩国产| 蜜臀av性久久久久蜜臀aⅴ四虎| 色视频一区二区| 日本欧洲一区二区| 欧美影视一区在线| 国内一区二区视频| 6080日韩午夜伦伦午夜伦| 国产精品原创巨作av| 欧美人狂配大交3d怪物一区| 国产一区二区91| 91精品国产综合久久精品麻豆| 国产成人午夜高潮毛片| 日韩免费电影一区| 99视频精品全部免费在线| 久久尤物电影视频在线观看| 91蜜桃在线免费视频| 国产精品素人视频| 亚洲日韩视频| 亚洲成人免费视频| 91久久线看在观草草青青| 亚洲成人资源网| 玖玖玖国产精品| 久久福利资源站| 91麻豆精品久久久久蜜臀| 成人avav在线| 国产日韩高清在线| 一区视频在线看| 亚洲综合色噜噜狠狠| 麻豆av一区二区三区| 欧美aaaaaa午夜精品| 制服丝袜亚洲精品中文字幕| 99久久免费精品高清特色大片| 中文字幕国产一区二区| 一本久道久久综合狠狠爱| 婷婷久久综合九色综合伊人色| 欧美少妇性性性| 成人福利视频在线| 国产精品色噜噜| 国产一区二区精品| 男人的天堂久久精品| 欧美美女网站色| 91麻豆免费在线观看| 一区二区三区中文在线观看| 色域天天综合网| 国产激情精品久久久第一区二区 | 精品国产污网站| 国产精品啊啊啊| 爽好多水快深点欧美视频| 在线不卡一区二区| 欧美精品99| 亚洲国产精品精华液网站| 欧美亚洲尤物久久| 99久久精品国产毛片| 亚洲精品你懂的| 欧美中文字幕一二三区视频| 国产精品白丝jk黑袜喷水| 国产精品美女视频| 在线一区二区视频| 91香蕉视频mp4| 亚洲在线视频一区| 51精品视频一区二区三区| 欧美日本免费| 蜜芽一区二区三区| 久久综合九色综合久久久精品综合| 亚洲网址在线| 久久精品国产99国产| 国产亚洲精品福利| 久久亚洲精品欧美| 99r精品视频| 婷婷开心激情综合| 久久午夜免费电影| 巨乳诱惑日韩免费av| 91在线一区二区三区| 亚洲h在线观看| 欧美r级电影在线观看| 国产欧美日韩亚洲| 成人一级黄色片| 亚洲精品久久久蜜桃| 欧美一卡2卡3卡4卡| 国产欧美午夜| 国产成人精品亚洲777人妖| 亚洲美女少妇撒尿| 91精品视频网| 国产精品普通话对白| 成人黄色a**站在线观看| 亚洲高清在线精品| 久久男人中文字幕资源站| 麻豆精品传媒视频| 欧美日韩天天操| 国产一区二区在线观看免费| 亚洲精品免费视频| 欧美精品一区二区三区四区 | 日本韩国一区二区三区视频| 欧美日韩国产探花| 国产精品91一区二区| 亚洲自拍偷拍图区| 国产日产欧美一区| 欧美在线观看你懂的| 亚洲夜间福利| 成人免费视频视频| 奇米777欧美一区二区| 自拍视频在线观看一区二区| 日韩一级高清毛片| 色综合 综合色| 日韩一级在线| 成人av动漫网站| 午夜天堂影视香蕉久久| 欧美国产日本韩| 欧美一区二区三区不卡| 麻豆精品网站| 伊人久久成人| 色综合久久综合| 国产一区二区电影| 日韩av在线播放中文字幕| 中文字幕一区二区三区四区不卡| 日韩一级大片在线观看| 色婷婷综合视频在线观看| 在线看片欧美| 成a人片国产精品| 国内不卡的二区三区中文字幕| 亚洲成av人片| 国产精品美女久久久久久久久久久| 欧美一区二区三区播放老司机| 久热精品在线| 国产欧美综合一区二区三区| 你懂的成人av| 国产成人免费高清| 久热成人在线视频| 亚洲国产视频a| 中文字幕一区二区日韩精品绯色| 久久久青草青青国产亚洲免观| 91精品国产日韩91久久久久久| 欧美无砖砖区免费| 久久久久久亚洲精品不卡4k岛国| 精品91在线| 欧美日韩一区综合| 99热精品一区二区| 高清视频一区二区| 国产一区免费电影| 蜜桃视频在线观看一区| 日韩专区欧美专区| 亚洲.国产.中文慕字在线| 亚洲自拍欧美精品| 亚洲一区二区高清| 亚洲福利视频一区二区| 亚洲日本欧美天堂| 国产精品伦理一区二区| 久久美女高清视频| 久久这里只有精品首页| 26uuu精品一区二区 | 综合久久综合久久| 国产精品区一区二区三| 久久嫩草精品久久久精品| 欧美成人在线直播| 日韩写真欧美这视频| 欧美精品在线一区二区| 在线免费不卡电影| 色婷婷一区二区三区四区| 99热精品一区二区| 91小宝寻花一区二区三区| 91麻豆文化传媒在线观看| 91免费版pro下载短视频| 91免费版在线| 国产一区二区中文字幕免费看| 欧美日韩精品综合| 欧美日韩一区二区三区在线视频 | 欧美极品美女视频| 国产免费成人在线视频| 国产欧美1区2区3区| 国产午夜精品久久久久久免费视| 久久久久国产精品人| 国产欧美精品一区aⅴ影院 | 国产精品第五页| 亚洲欧美国产毛片在线| 夜夜夜精品看看| 亚洲成在线观看|