在数据库大小分配期间,我正在等待类型PREEMPTIVE_OS_WRITEFILEGATHER。昨天,我将数据库大小配置为供应商建议的值。我们需要将数据库大小设置为700GB,保留150 GB的日志文件。我已经在不到2分钟的时间内成功配置了数据文件大小,因为我们已经启用了  即时文件初始化。我们知道即时文件初始化(IFI)通过跳过零初始化操作来加速数据文件大小分配。但是当我开始扩展日志文件大小时,花了很多时间。花费更长时间的一个原因可能是因为 正在运行以分配日志文件空间的会话ID显示的等待类型PREEMPTIVE_OS_WRITEFILEGATHER

什么是PREEMPTIVE_OS_WRITEFILEGATHER?

根据MSDN,PREEMPTIVE_OS_WRITEFILEGATHER是在SQL Server等待操作系统完成部分写操作时发生的等待类型。此等待通常出现在未正确配置自动增长的数据库中或在大规模分配到数据库文件期间。如果您经常获得此等待类型,则应调查SQL Server实例。您还可以观察此等待类型以及BACKUPBUFFER   和LOGBUFFER等待类型。

有时,我们在数据库恢复操作期间也会获得此等待类型。我们知道,备份操作会捕获数据库文件大小等详细信息,而不管数据或日志文件中填充了多少数据或日志。当您执行还原操作时,它将创建那么大的文件,这将花费更多的时间,因为SQL Server将忙于将文件归零,相当于源数据或日志文件大小。如果您已在数据库服务器上启用了IFI,那么您将无法获得数据文件的此等待类型,但仍可以获取日志文件大小分配。

假设您的数据库有100GB的日志文件,并且只填充了12 GB。如果你备份这个数据库并在任何地方恢复它,那么恢复操作将创建一个100GB的日志文件,这将花费很多时间,因为要对所有100GB大小执行零初始化操作。

减少等待类型的解决方案PREEMPTIVE_OS_WRITEFILEGATHER

Microsoft已提供一项功能即时文件初始化以克服或减少此等待类型,但此功能仅适用于数据文件而非日志文件。我们希望此功能可以在SQL Server的未来版本中同时处理数据和日志文件。

如果在扩展数据文件期间或在数据文件自动增长期间获得此等待类型,则只需在SQL Server数据库服务器上启用即时文件初始化,此等待类型将从下次消失。此功能将跳过数据文件的零初始化,并直接将给定大小分配给数据文件。阅读附加文章以了解即时文件初始化以及如何在SQL Server实例上启用它

但我们知道此功能对日志文件不起作用,因此如果在扩展日志文件期间或日志文件自动增长期间发生这种情况,我们就无法使用此功能来减少此等待类型。我们遇到了同样的问题,因为我们已经为数据文件启用了即时文件初始化,但在扩展日志文件期间卡住了 在这里,我将为您提供一些可以应用的最佳实践,以避免和减少此等待类型。

  1. 将自动增长从默认值增加到某个数值,以减少数据库文件的频繁自动增长。Thumb规则是将自动增长大小保持为相应数据库文件大小的八分之一。阅读本文以了解数据库文件Autogrowth的  完美价值?
  2. 如果可能,通过将未来增长的预期大小分配给数据库来避免自动增长。
  3. 监控存储子系统并调查是否发现任何问题。如果需要升级存储。
  4. 有关任何系统相关问题,请查看Windows事件查看器。
  5. 启用即时文件初始化以避免数据文件的零初始化。
  6. 将事务从逐行语句合并到批处理。
  7. 如果您有更大的日志文件,其中填充了少量日志。您可以使用附加文章中给出的DBCC SQLPERF命令检查日志文件大小。您可以缩小日志文件并再次执行备份以执行还原。这应该是一个快速的过程,而不是等待归零以完成以前大小的日志文件。
  8. 停止任何活动以释放目标磁盘的标头,以便它可以专门用于清零LDF文件。

如何减少SQL Server中的PREEMPTIVE_OS_WRITEFILEGATHER等待类型的更多相关文章

  1. SQL SERVER中LIKE使用变量类型输出结果不同

    前言:Sql Server中LIKE里面使用不同的变量类型导致查询结果不一致的问题,其实看似有点让人不解的现象背后实质跟数据类型的实现有关. 一.我们先来创建示例演示具体操作 CREATE TABLE ...

  2. SQL SERVER中的OLEDB等待事件

    OLEDB等待事件介绍 OLEDB等待类型是SQL SERVER 数据库中最常见的几种等待类型之一.它意味着某个会话(SPID)通过SQL Server Native Client OLEDB Pro ...

  3. SQL SERVER中LIKE使用变量类型不同输出结果不一致解惑

    一同事在写脚本时,遇到一个关于LIKE里面使用不同的变量类型导致查询结果不一致的问题,因为这个问题被不同的人问过好几次,索性总结一下,免得每次都要解释一遍,直接丢一篇博客岂不是更方便!其实看似有点让人 ...

  4. SQL Server中修改“用户自定义表类型”问题的分析与方法

    前言 SQL Server开发过程中,为了传入数据集类型的变量(比如接受C#中的DataTable类型变量),需要定义"用户自定义表类型",通过"用户自定义表类型&quo ...

  5. SQL SERVER中变量的定义、赋值与使用

      本文面向对SQL SERVER中变量操作不熟悉的用户,希望能使他们在看完本文后能对变量操作有具体和全面的认识.   在学习SQL SERVER的过程中,很多时候需要对某些单独的值进行调试,这时就需 ...

  6. 浅析SQL Server 中的SOS_SCHEDULER_YIELD类型的等待

    本文出处:http://www.cnblogs.com/wy123/p/6856802.html 进程的状态转换 在说明SOS_SCHEDULER_YIELD等待之前,先简要介绍一下进程的状态(迷迷糊 ...

  7. Microsoft SQL Server中的事务与并发详解

    本篇索引: 1.事务 2.锁定和阻塞 3.隔离级别 4.死锁 一.事务 1.1 事务的概念 事务是作为单个工作单元而执行的一系列操作,比如查询和修改数据等. 事务是数据库并发控制的基本单位,一条或者一 ...

  8. SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因

    原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中 ...

  9. SQL Server中的高可用性(1)----高可用性概览

        自从SQL Server 2005以来,微软已经提供了多种高可用性技术来减少宕机时间和增加对业务数据的保护,而随着SQL Server 2008,SQL Server 2008 R2,SQL ...

随机推荐

  1. 学习笔记:SASS

    SASS: http://www.sass.hk/sass-course.html  SASS 2015-10-10 http://sass.bootcss.com/docs/sass-referen ...

  2. swift便利构造函数

    class Person: NSObject { var name: String? var age: Int = 0 //1便利构造函数,允许返回nil //2本身不负责对象的创建 //3需要在调用 ...

  3. idea搭建Eureka注册中心

    服务的注册与发现 关系调用说明: 服务生产者启动时,向服务注册中心注册自己提供的服务 服务消费者启动时,在服务注册中心订阅自己所需要的服务 注册中心返回服务提供者的地址信息个消费者 消费者从提供者中调 ...

  4. ABAP-FTP-执行

    1.界面 2.程序 ZFID0004_FTP_EXEC 主程序: *&------------------------------------------------------------- ...

  5. Springboot 热部署问题。亲测可用。

    本人开发使用的是Mac系统,windows应该类似.主要是 spring-boot-devtools的使用 参考:mac下的idea设置,是不是有疑问,既然别人写好了,为啥你还要再来一次,因为我使用了 ...

  6. T-SQL中CTE表 with关键字

    Select字句在逻辑上是SQL语句最后进行处理的最后一步,所以,以下查询会发生错误: SELECT YEAR(OrderDate) AS OrderYear, COUNT(DISTINCT Cust ...

  7. Zabbix Agent 源码编译安装

    简介: 单独整理一下 Zabbix Agent . 1.安装包选择 下载地址:http://www.zabbix.com/download.php 这里有两种源码包,一种是安装 Zabbix Serv ...

  8. jieba分词/jieba-analysis(java版)

    简介 支持分词模式Search模式,用于对用户查询词分词Index模式,用于对索引文档分词特性支持多种分词模式全角统一转成半角用户词典功能conf 目录有整理的搜狗细胞词库因为性能原因,最新的快照版本 ...

  9. mysql修改密码方法

    1. 修改密码有三种方法:1.1 ---->用mysqladmin修改密码格式:mysqladmin -u用户名 -p旧密码 password 新密码 例子:# mysqladmin -uroo ...

  10. JDBC缺点分析

    * JDBC代码繁琐,每一次JDBC都需要编写“同样”的六步. * sql不能配置,在JDBC编程中sql语句是写在java源程序当中的,sql语句经常会发生改变(业务发生了改变),sql改变之后,需 ...