电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

SQLSERVER 的 truncate 和 delete 區別解析

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

    一:背景

    1. 講故事

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

    二:區別詳解

    1. 思考

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

    為了方便測試,還是用上一篇的 post 表,創建好之后插入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 是如何執行刪除操作的呢?要回答這個問題需要到數據頁上找答案,參考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 是用來跟蹤 區分配 狀態的數據頁,它是用一個 bit 位跟蹤一個 , 在數據庫中一個區表示 連續的8個數據頁,在 GAM 數據頁中,用 1 表示可分配的初始狀態,用 0 表示已分配狀態,可能大家有點懵,我再畫個簡圖吧。

    為了讓大家眼見為實,還是用 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 號,對應的區號就是 240/8 + 1 = 31,因為 GAM 是用 1bit 來跟蹤一個區,所以理論上 GAM 頁面偏移 31bit 的位置就標記了該區的分配情況。

    這么說可能大家又有點懵,我準備用 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 也就說明當前都是分配狀態,如果是 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

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

    從圖中看 31bit 跟蹤的第 31 號區被回收了,也就驗證了真的切斷了聯系。

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

    四:總結

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

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

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

    標簽: MsSQL
    主站蜘蛛池模板: 制氮设备_PSA制氮机_激光切割制氮机_氮气机生产厂家-苏州西斯气体设备有限公司 | 不锈钢闸阀_球阀_蝶阀_止回阀_调节阀_截止阀-可拉伐阀门(上海)有限公司 | 新疆十佳旅行社_新疆旅游报价_新疆自驾跟团游-新疆中西部国际旅行社 | 东莞精密模具加工,精密连接器模具零件,自動機零件,冶工具加工-益久精密 | 车间除尘设备,VOCs废气处理,工业涂装流水线,伸缩式喷漆房,自动喷砂房,沸石转轮浓缩吸附,机器人喷粉线-山东创杰智慧 | 电解抛光加工_不锈钢电解抛光_常州安谱金属制品有限公司 | 电动手术床,医用护理床,led手术无影灯-曲阜明辉医疗设备有限公司 | 对辊破碎机-液压双辊式,强力双齿辊,四辊破碎机价格_巩义市金联机械设备生产厂家 | 济南货架定做_仓储货架生产厂_重型货架厂_仓库货架批发_济南启力仓储设备有限公司 | 仿清水混凝土_清水混凝土装修_施工_修饰_保护剂_修补_清水混凝土修复-德州忠岭建筑装饰工程 | 博莱特空压机|博莱特-阿特拉斯独资空压机品牌核心代理商 | 网架支座@球铰支座@钢结构支座@成品支座厂家@万向滑动支座_桥兴工程橡胶有限公司 | 20年条刷老厂-条刷-抛光-工业毛刷辊-惠众毛刷 | 西门子代理商_西门子变频器总代理-翰粤百科| app开发|app开发公司|小程序开发|物联网开发||北京网站制作|--前潮网络 | 专业的压球机生产线及解决方案厂家-河南腾达机械厂 | 过滤器_自清洗过滤器_气体过滤器_苏州华凯过滤技术有限公司 | 拉卡拉POS机官网 - 官方直营POS机办理|在线免费领取 | 传递窗_超净|洁净工作台_高效过滤器-传递窗厂家广州梓净公司 | 手术室净化厂家-成都做医院净化工程的公司-四川华锐-15年特殊科室建设经验 | 粉末包装机-给袋式包装机-全自动包装机-颗粒-液体-食品-酱腌菜包装机生产线【润立机械】 | 制冷采购电子商务平台——制冷大市场 | 定量包装机,颗粒定量包装机,粉剂定量包装机,背封颗粒包装机,定量灌装机-上海铸衡电子科技有限公司 | 氧化铁红厂家-淄博宗昂化工| 全自动过滤器_反冲洗过滤器_自清洗过滤器_量子除垢环_量子环除垢_量子除垢 - 安士睿(北京)过滤设备有限公司 | 不锈钢钢格栅板_热浸锌钢格板_镀锌钢格栅板_钢格栅盖板-格美瑞 | 芜湖厨房设备_芜湖商用厨具_芜湖厨具设备-芜湖鑫环厨具有限公司 控显科技 - 工控一体机、工业显示器、工业平板电脑源头厂家 | 医学模型生产厂家-显微手术模拟训练器-仿真手术模拟训练系统-北京医教科技 | 合肥网络推广_合肥SEO网站优化-安徽沃龙First | 硬质合金模具_硬质合金非标定制_硬面加工「生产厂家」-西迪技术股份有限公司 | 无水硫酸铝,硫酸铝厂家-淄博双赢新材料科技有限公司 | 高扬程排污泵_隔膜泵_磁力泵_节能自吸离心水泵厂家-【上海博洋】 | 进口试验机价格-进口生物材料试验机-西安卡夫曼测控技术有限公司 | 橡胶接头|可曲挠橡胶接头|橡胶软接头安装使用教程-上海松夏官方网站 | 股票入门基础知识_股票知识_股票投资大师_格雷厄姆网 | 木材烘干机,木炭烘干机,纸管/佛香烘干设备-河南蓝天机械制造有限公司 | 压力控制器,差压控制器,温度控制器,防爆压力控制器,防爆温度控制器,防爆差压控制器-常州天利智能控制股份有限公司 | 「钾冰晶石」氟铝酸钾_冰晶石_氟铝酸钠「价格用途」-亚铝氟化物厂家 | 沧州友城管业有限公司-内外涂塑钢管-大口径螺旋钢管-涂塑螺旋管-保温钢管生产厂家 | 煤机配件厂家_刮板机配件_链轮轴组_河南双志机械设备有限公司 | 上海软件开发-上海软件公司-软件外包-企业软件定制开发公司-咏熠科技 |