数据库服务器在为表分配初始值的时候很慢,分配初始值40GB的数据文件,花了30多分钟,一开始的时候一直认为是服务器磁盘的写入速度太慢形成的,后来通过北京-宋沄剑的提醒:即时文件初始化(Instant File Initialization),设置这一选项以后,速度提高到了19秒,下面将描述这个优化的设置过程。html
就数据库而言,如下几种状况须要对文件初始化:数据库
1. 建立数据库;安全
2. 向现有数据库中添加文件、日志或数据;服务器
3. 增大现有文件的大小(包括自动增加操做);网络
4. 还原数据库或文件组;性能
执行上面的操做,操做系统须要用零来填充文件进行初始化。在 SQL Server 中,能够在瞬间对数据文件进行初始化。即时文件初始化将回收已使用的磁盘空间而不使用零来填充该空间。而在向文件中写入新数据时,磁盘内容将被覆盖。日志文件不能当即初始化。测试
即时文件初始化功能仅在向 SQL Server (MSSQLSERVER) 服务账户授予了 SE_MANAGE_VOLUME_NAME 以后才可用。Windows Administrator 组的成员拥有此权限,并能够经过将其余用户添加到【执行卷维护任务】安全策略中来为其授予此权限。优化
首先运行gpedit.msc,按照Figure1的路径,找到【执行卷维护任务】,如Figure2所示,默认的状况下它已经设置了Administrators组的;spa
(Figure1:gpedit.msc)操作系统
(Figure2:执行卷维护任务)
接着运行services.msc进入服务设置,查看到SQL Server (MSSQLSERVER)的登录用户是【网络服务】(如Figure3所示),这就是形成初始化40GB文件花费了30多分钟的缘由了,由于【网络服务】不具有SE_MANAGE_VOLUME_NAME的权限(可查看Administrators组成员);
(Figure3:SQL Server (MSSQLSERVER))
双击SQL Server (MSSQLSERVER)服务进入设置,在登录的选项卡中能够看到账号是:NT AUTHORITY\NETWORKSERVICE,如Figure4所示。
(Figure4:NT AUTHORITY\NETWORKSERVICE)
直接勾选【本地系统账号】,在重启SQL Server (MSSQLSERVER)时遇到了下图的错误:
(Figure5:重启服务报错)
查看了相关的系统事件日志,在SQL Server服务没法使用管理员身份启动 中解决了(禁用掉SQL Server的协议Shared Memory),设置完以后重启服务SQL Server (MSSQLSERVER)。
而另一种思路就是把NT AUTHORITY\NETWORKSERVICE加入到Administrators组中,如Figure6所示。注意:这种方式同样须要重启SQL Server (MSSQLSERVER)服务。
(Figure6:Administrators组)
下面咱们就来测试下建立40GB文件的性能对比:
--测试即时文件初始化 CREATE DATABASE [TestFileInit] ON PRIMARY ( NAME = N'TestFileInit', FILENAME = N'F:\DBBackup\TestFileInit.mdf' , SIZE = 41943040KB , FILEGROWTH = 1024KB ) LOG ON ( NAME = N'TestFileInit_log', FILENAME = N'F:\DBBackup\TestFileInit_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%) GO
(Figure7:以前建立时间)
(Figure8:以后建立时间)
注意:禁用即时文件初始化功能,要想让这个禁用生效,同样须要重启SQL Server (MSSQLSERVER)服务。
1. 在安装SQL Server的时候,如何设置会使得SQL Server服务是以【网络服务】登录的?
2. 禁用掉SQL Server的协议Shared Memory,这个协议是用来干吗的?有什么做用?
3. 若是把NT AUTHORITY\NETWORKSERVICE加入到Windows组里面有什么不安全隐患嘛?
4. 当启用 TDE 时,即时文件初始化功能不可用。什么是TDE?