干货分享:SQLSERVER使用裸设备
这种设备少了操作系统这一层I/O效率更高。不少数据库都能通过使用裸设备作为存储介质来提高I/O效率。因为使用裸设备避免了再经过操作系统这一层数据直接从Disk到数据库进行传输所以使用裸设备对于读写频繁的数据库应用来说可以极大地提高数据库系统的性能。当然这是以磁盘的 I/O 非常大磁盘I/O已经成为系统瓶颈的情况下才成立。如果磁盘读写确实非常频繁以至于磁盘读写成为系统瓶颈的情况成立那么采用裸设备确实可以大大提高性能在宋沄剑的文章里《SQL Server数据库损坏、检测以及简单的修复办法》在这个过程中数据脏页由内存写入持久化的IO子系统在此期间按照IO子系统的不同数据可能经过这几层Windows(写数据一定调用的是WINDOWS API)Windows底层的中间层杀毒软件磁盘加密系统RAID控制器IO子系统做了RAID磁盘或SSD等持久化存储器其实如果使用了裸设备数据是不需要经过I/O子系统的直接写入到文件中根据MSDN说一下裸设备在SQLSERVER的限制Using Raw PartitionsSQLSERVER2000支持数据库创建在使用raw格式的分区。raw格式分区是一种没有格式化的文件系统就像FAT文件系统和NTFS文件系统。在某些情况下数据库创建在raw格式的分区能产生重要的性能提升相对于NTFS或FAT文件系统。然而大多数情况下还是建议使用NTFS或FAT分区来存放数据库文件当你把数据库创建在raw分区下的时候你不能指定数据库数据文件的物理名字你只能够指定数据库数据文件要存放的那个磁盘的驱动器号如果你使用Windows2000服务器版你可以挂载一个使用raw文件格式的驱动器。当你在一个空文件夹挂载一个本地驱动器的时候Windows2000会分配一个磁盘路径这样会比只分配一个驱动器号好。挂载驱动器不受26个盘符的限制分区超过26个就不能再建立分区了因此你可以使用不受数量限制的raw分区。下面有几个限制是需要考虑的当使用raw分区的时候1每一个raw分区只能有一个数据库数据文件。2标准的文件操作例如复制文件移动文件删除文件都不能在raw分区使用3放在raw分区的数据库文件都不能直接使用备份软件备份例如Acronis.True.Image.Echo.Enterprise.Server这些都不能用但是SQLSERVER的完整数据库备份、差异备份、日志备份这些SQLSERVER的备份功能是可以正常使用的4存放在raw分区上的数据文件都不能自动增长的。最好在创建数据库文件的时候就指定数据库文件的大小为raw分区的大小或者当数据库数据文件大小不够再进数据的时候手动设置数据文件或日志文件的大小CREATE DATABASE [test] ON PRIMARY ( NAME Ntest, FILENAME Nf:,SIZE 9024MB )ALTER DATABASE [sss] MODIFY FILE(nameSSS_Data,size2048)ALTER DATABASE [sss] MODIFY FILE(nameSSS_Log,size2048)5一些文件系统服务例如坏块替换磁盘整理是不能用的对于raw分区实验实验环境Windows2003 ;SQLSERVER2008R2实际上在Windows下裸设备实质就是没有格式化的分区先在虚拟机添加一个硬盘大小是10GB进行初始化初始化之后不能格式化新建一个简单卷记得不要格式化分配一个盘符号就可以了F盘是打不开的--------------------------------------------------------------------------------------------------------------创建数据库CREATE DATABASE [test] ON PRIMARY ( NAME Ntest, FILENAME NF:,SIZE 9024MB ) LOG ON ( NAME Ntest_log, FILENAME NE:\test_log.ldf ,SIZE 2048000KB , FILEGROWTH 10%) GO创建数据库的时候要注意1每一个raw分区只能有一个数据库数据文件。4存放在raw分区上的数据文件都不能自动增长的。最好在创建数据库文件的时候就指定数据库文件的大小为raw分区的大小如果你指定了物理路径那么就会报错消息 5133级别 16状态 1第 3 行 对文件 F:\test.mdf 的目录查找失败出现操作系统错误 1005(此卷不包含可识别的文件系统。 请确定所有请求的文件系统驱动程序已加载且此卷未损坏。)。 消息 1802级别 16状态 1第 3 行 CREATE DATABASE 失败。无法创建列出的某些文件名。请查看相关错误。测试新建测试表--建测试表 USE test GO CREATE TABLE testperf ( id INT IDENTITY(1, 1) PRIMARY KEY , NAME NVARCHAR(200) , timeon DATETIME )插入测试--插入数据 INSERT INTO testperf SELECT 你好,GETDATE()查询测试--查询数据 SELECT * FROM testperf