日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

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

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

    一:背景

    1. 講故事

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

    二:區(qū)別詳解

    1. 思考

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

    為了方便測試,還是用上一篇的 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

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

    2. 觀察 delete 的事務日志。

    為了觀察 delete 產生的日志,這里用 @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

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

    10 行 delete 記錄刪除

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

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

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

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

    3. 觀察 truncate 的事務日志。

    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 三個空間管理數據頁做了修改,并沒有涉及到 PAGE 頁,那就有一個疑問了,我的PAGE頁還在嗎?可以用 DBCC IND 看下。

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

    為了驗證這個結論,可以用 DBCC PAGE 直接導出 240 號數據頁,觀察下是不是表中的數據,不過遺憾的是,這個數據頁已不歸屬 post 表了。。。

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

    三:GAM 空間管理

    1. 基本原理

    GAM 是用來跟蹤 區(qū)分配 狀態(tài)的數據頁,它是用一個 bit 位跟蹤一個 區(qū), 在數據庫中一個區(qū)表示 連續(xù)的8個數據頁,在 GAM 數據頁中,用 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 表分配的數據頁是 240241 號,對應的區(qū)號就是 240/8 + 1 = 31,因為 GAM 是用 1bit 來跟蹤一個區(qū),所以理論上 GAM 頁面偏移 31bit 的位置就標記了該區(qū)的分配情況。

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

    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

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

    從圖中可以看到,全部都是 0 也就說明當前都是分配狀態(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ā)現由原來的 000000001f38 變成了 400000001f38,可以用 .format 來格式化下。

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

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

    四:總結

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

    最后的建議是如果要清空表數據,建議用 truncate table 。

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

    標簽: MsSQL
    日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
    久久99性xxx老妇胖精品| 精品视频国内| 精品久久国产一区| 久久精品国产网站| 久久97视频| 日韩成人精品一区| 中文字幕高清在线播放| 日韩电影免费在线观看| 天堂8中文在线最新版在线| 成人小电影网站| 国产v日韩v欧美v| 久久久777| 免费不卡中文字幕在线| 亚洲天堂久久| 中文精品电影| 久久国产尿小便嘘嘘| 嫩草伊人久久精品少妇av杨幂| 日本欧美韩国一区三区| 国产精品va| а√在线中文在线新版| 99精品小视频| 亚洲精品午夜av福利久久蜜桃| 免费中文字幕日韩欧美| 亚欧成人精品| 久久不卡国产精品一区二区| 成人台湾亚洲精品一区二区| 亚洲成av人片一区二区密柚| 黄色国产精品| 日韩精品国产精品| 久久精品天堂| 亚洲午夜精品久久久久久app| 免费在线观看视频一区| 日韩欧美激情| 国产一区二区三区四区| 免费不卡中文字幕在线| 日本va欧美va欧美va精品| 国产一区二区三区不卡视频网站 | 欧美国产极品| 中文字幕在线官网| 日韩视频不卡| 国产日韩欧美三级| 日韩精品首页| 午夜视频一区二区在线观看| 国产精品啊啊啊| 亚洲高清毛片| 91成人在线| 日韩国产欧美| 日本一区福利在线| 97国产精品| 国产综合精品| 久久黄色影视| 国产一区日韩欧美| 日本h片久久| 久久久久免费av| 日韩高清欧美激情| 日韩电影免费网址| 日韩精品久久理论片| 秋霞影院一区二区三区| 亚洲免费毛片| 97精品国产| 日韩精品视频在线看| 久久男人天堂| 蜜桃免费网站一区二区三区 | 在线亚洲精品| 久久精品 人人爱| 日韩午夜av| 国产精品福利在线观看播放| 免费精品视频在线| 日本黄色精品| 日韩欧美美女在线观看| 久久久久国产精品一区三寸| 欧美日韩va| 在线视频亚洲| 另类专区亚洲| 国产精品自拍区| 视频一区二区中文字幕| 91欧美在线| 国产日韩欧美三级| 午夜影院欧美| 国产精品久久久久久久免费观看| 综合欧美亚洲| 亚洲一级高清| 色婷婷亚洲mv天堂mv在影片| 日本aⅴ亚洲精品中文乱码| 欧美日韩精品一本二本三本| 国产精品国产一区| 97久久亚洲| 亚洲一区二区日韩| 在线日韩电影| 日本激情一区| 国产欧美综合一区二区三区| 亚洲综合精品| 1024精品一区二区三区| 国产高清亚洲| 日韩精品三区四区| 亚洲图片久久| 欧美日韩国产精品一区二区亚洲| 日韩伦理在线一区| 精品亚洲二区| 国产精品白丝一区二区三区| 日本精品久久| 亚洲tv在线| 丝袜美腿亚洲色图| 蜜桃成人av| 99精品小视频| 久久精品在线| 国产拍在线视频| 黄色网一区二区| 日韩av字幕| 日本成人中文字幕在线视频| 蘑菇福利视频一区播放| 国产精品色网| 久久国产福利| 丝袜亚洲另类欧美| 另类av一区二区| 女人天堂亚洲aⅴ在线观看| 久久久久久久久99精品大| 日韩在线观看一区| 九九精品调教| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 三级亚洲高清视频| 1024精品久久久久久久久| 亚洲国产综合在线看不卡| 日韩精品一卡| 免费不卡中文字幕在线| 午夜精品影院| 久久亚洲国产精品一区二区| 免费精品视频| 蜜臀av国产精品久久久久| 男女性色大片免费观看一区二区| 国产精品日本欧美一区二区三区| 亚洲精品电影| 性一交一乱一区二区洋洋av| 美女日韩在线中文字幕| 日韩视频精品在线观看| 视频一区视频二区在线观看| 蜜芽一区二区三区| 日韩av中文字幕一区| 国产精品va视频| 91亚洲成人| 亚洲午夜久久久久久尤物| 日韩午夜高潮| 日韩视频1区| 国产精品va视频| 9999国产精品| 亚洲www免费| 欧美精品黄色| 中文字幕一区二区三区四区久久| 五月国产精品| 久久精品99国产精品| 久久在线91| 久久蜜桃精品| 日韩精品一二区| 国产无遮挡裸体免费久久| 日韩av有码| 国产精品日韩| 国产精品a久久久久| 亚洲深夜视频| 亚洲一区日韩| 国产精品一区二区三区四区在线观看| 国产videos久久| 日韩视频免费| 国产欧美视频在线| 桃色一区二区| 国产日韩综合| 国产精品视频首页| 久久久久久美女精品| 亚州av一区| 98精品久久久久久久| 99国产精品| 精品99在线| 亚洲免费在线| 麻豆精品视频在线| 婷婷综合在线| 国产精品调教视频| 亚洲va在线| 日本午夜免费一区二区| 蜜桃av.网站在线观看| 蜜桃久久久久久久| 老司机免费视频一区二区| 久久久久久免费视频| 日本高清久久| 日韩欧美二区| 日本不卡一二三区黄网| 午夜欧美巨大性欧美巨大| 日韩精品中文字幕一区二区| 精品免费av在线| 日韩国产在线不卡视频| 欧美sss在线视频| 日本午夜免费一区二区| 欧美日中文字幕| 国产精品久久乐| 国产精品美女久久久浪潮软件| 久久91视频| 红桃视频欧美| 国产成人免费av一区二区午夜| 亚洲精品字幕| 99精品电影| 欧美激情精品| 蜜臀久久久久久久|