SQL Server 维护着一个叫做buffer cache的东西, 在buffer cache中SQL Server 读取必须被取回的data pages. 数据在修改时并不是直接写到磁盘上的, 而是写在buffer cache中原本在磁盘上的对应数据页的拷贝中. 修改什么时候落盘呢? 答案是在checkpoint发生的时候, 或者是当修改必须被写回到磁盘上之后buffer cache才可以腾出空间用来放新的页面的时候. 把buffer cache中被修改了的数据写回到盘上的过程叫做flushing the page. 如果一个page在cache中被修改了, 但是还没写到磁盘上, 那么它就叫做dirty page.

任何时候, 只要buffer cache中的page一有修改, 那么一条记录就会被写在log cache中用来记录这次修改. 这条日志记录必须在dirty page被从buffer cache给flush到盘上之前先被写到盘上. 如果dirty page在log record之前被写到了盘上, 那么这个dirty page就在磁盘上创建了一次修改, 该修改在当server挂掉而log record还没落盘的时候是不能回滚的.

SQL Server有阻止dirty page在log record写好之前被flush到磁盘上的逻辑. 当transaction commit了之后, log record才会被写到盘上, 之后dirty page才可以被flush到盘上.

先后顺序如下:

Commit Transaction –> Log record written to disk –> Dirty page flush to disk.

从IO的角度来看, 数据库引擎生成的写IO有两种, 一种叫做logical write另一种叫做physical writes. logical write在buffer cache中的页面有修改的时候发生. physicalwrite在页面从buffer cache中写道盘上的时候发生. 当一个页面在buffer cache中修改了, 它不会马上被写回到磁盘上, 它会被标记为dirty. 这意味着, 一个page可以在physical write发生之前发生多次logical write. 对于每次logical write, 都会有一条transaction log record被添加到log cache中, 用来记录这次修改. 下图说明了写data page的过程:

当buffer manager准备写一个page到盘上的时候, 它会搜索邻近的能够凑成一个集中写操作的dirty page. 邻近的page拥有的是连续的page ID, 并且是来自于相同的file, 这些页面并不需要是在内存中是连续的. 这种搜索是前后两个方向都有的, 会一直持续下去, 直到下面的事件发生:

  • 找到了一个clean page
  • 找到了32个page
  • 找到了一个dirty page, 并且这个dirty page的log sequence number (LSN)还没有被flush到log中去.
  • 找到了一个不能被立即latch的page.

通过这种方式, 一个集合的page可以在一个single gather-write operation中写到盘上去.

Dirty page是通过三种方式中的一种写到盘上的:

  • Lazy writing - 一个叫做lazy writer的进程会把不常用的page从buffer cache中移除出去, 写到盘上.
  • Eager writing – Eager writer进程会将注入bulk insert, select into这样没有log的dirty data page写到盘上.
  • Checkpoint - checkpoint进程定期扫描buffer cache, 寻找某个数据库中所有的dirty page, 全部写到盘上.

Lazy writing, eager writing, checkpoint 进程都不会等待IO操作的结束. 他们永远是使用异步IO之后继续他们的工作的, 稍后再检查IO是否成功了. 这能让SQL Server最大化的将CPU和IO资源使用在恰当的任务上.

资料来源

=====================

Write-Ahead Transaction Log

http://technet.microsoft.com/en-us/library/ms186259(v=sql.105).aspx

Writing Pages

http://technet.microsoft.com/en-us/library/aa337560(v=sql.105).aspx

SQL Server中数据的修改是如何落盘的?相关推荐

  1. SQL Server中数据透视表的Python脚本

    This article talks about Python scripts for creating pivot tables in multiple ways. 本文讨论了以多种方式创建数据透视 ...

  2. 用于jqGrid获取SQL Server中数据的简单分页存储过程及sp_executesql的一点使用方法...

    之前我第一篇有关jqGrid JSON数据的获取是动态拼接的SQL语句(因为是Access数据库),然后我自己也用SQL Server中的数据作了测试,为了方便写了一个分页的存储过程,过程中也认识了下 ...

  3. SQOOP 导出SQL SERVER中数据

    从SQL Server导出数据到HDFS sqoop import --connect 'jdbc:sqlserver://192.168.20.105:1433;databasename=dep' ...

  4. 数据库SQL Server中数据的模糊查询

    1.Like 使用Like查询时,字段中的类容并不一定与查询内容完全匹配,只要字段中含有这些内容即可! 代码如下: select StudentName, StudentAdress from Stu ...

  5. SQL Server 中数据查询注意事项

    1.查询语句不用区分大小写,而且即使每张表的表名或者列名出现大写字母,在写查询语句的时候也不用区分大小写,查询结果保持一致,所以查询语句小写即可. 2.在写查询语句的时候列名不需要带单引号,数值型的字 ...

  6. sql server中数据约束相关的查询

    根据表名查找数据约束 SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = 'CMS_EventLog'; SEL ...

  7. 从TXT文本文档向Sql Server中批量导入数据

    因为工作的需要,近期在做数据的分析和数据的迁移.在做数据迁移的时候需要将原有的数据导入到新建的数据库中.本来这个单纯的数据导入导出是没有什么问题的,但是客户原有的数据全部都是存在.dat文件中的.所以 ...

  8. SQL Server中的数据层应用程序简介

    In this article, I'm going to introduce the data-tier applications in SQL Server. As the official do ...

  9. 到T-SQL DML 三级的阶梯:在SQL server中实现关系模型

    作者: Gregory Larsen, 2017/08/02 (第一次出版: 2011/11/09) 翻译:谢雪妮,许雅莉,赖慧芳,刘琼滨 译文: 系列 该文章是阶梯系列的一部分:T-SQL DML的 ...

最新文章

  1. (转)ArcEngine读取数据(数据访问)
  2. java.lang.UnsatisfiedLinkError解决方法汇集
  3. C语言的标识符由什么组成
  4. 在 SQLite3 中使用回调函数
  5. SAP License:SAP中的权限与破解
  6. FreeWheel业务系统微服务化过程经验分享
  7. 无限服务器不装显卡能用吗,云服务器能装显卡吗
  8. curl: (7) Failed connect to localhost:9200; Connection refused
  9. 研磨设计模式学习笔记3--适配器模式Adapter
  10. 如何把计算机管理的服务删掉,如何将win7电脑服务列表中残留的服务选项删除掉?...
  11. 《机器视觉算法与应用》第3章 机器视觉算法之几何基元的分割和拟合——学习笔记
  12. python发短信sim800_sim800l 发短信
  13. java 光通信_超通俗易懂科普:什么是光通信?
  14. 微信小程序:同名在线查询系统
  15. 【多元统计分析】10.多元线性回归
  16. 如何对开发团队的人员进行绩效管理?
  17. 帝国php漏洞,帝国cms远程代码执行漏洞-2
  18. 人工智能技术的热潮让不少创业浪潮迅速崛起
  19. java.util.concurrent.TimeoutExceptiofor com.alibaba.nacos.shaded.io.grpc.stub.ClientCalls$GrpcFuture
  20. 如何把几张图片整合到一张图片?

热门文章

  1. 哈哈哈,这个教人写烂代码的项目在 GitHub 上火了...
  2. Java 必须掌握的 20+ 种 Spring 常用注解
  3. 图神经网络的解释性综述!
  4. 11/1787, 哈工大小学妹的比赛上分经验,附战友招募
  5. 手握173篇论文的学术新星被指造假!后续:博士论文被召回
  6. AI杀入斗地主领域,快手开发DouZero对标AlphaZero,干掉344个AI获第一
  7. GPT-3获NeurIPS 2020最佳论文奖
  8. 一行代码不用写,就可以训练、测试、使用模型,这个star量1.5k的项目帮你做到...
  9. 如何将全景分割用到养猪场?
  10. 订单管理之获取订单表表列表数据