固态硬盘和机械硬盘的比较和SQLSERVER在两种硬盘

    最近写了个小程序,用于将固态硬盘的写入量等信息显示在任务栏,最开始使用Windows API也可以实现,但是当任务栏托盘增加的时候,会被遮盖,最终采用了DeskBand来实现,填了很多坑。

Win7启动全过程

固态硬盘和机械硬盘的比较和SQLSERVER在两种硬盘上的性能差异

在看这篇文章之前可以先看一下下面的文章:

SSD小白用户收货!SSD的误区如何解决

这样配会损失性能?实测6种特殊装机方式

听说固态硬盘是高富帅的必备神器,本人为了提升工作效率和提高工作速度

这个月节衣缩食,终于也决定买了一块三星固态硬盘120G容量

这个固态硬盘拿在手里轻飘飘的, 好像里面什么东西都没有似的

废话少说,先上图

图片 1

开机速度20秒左右

图片 2

 

测试环境:Windows7,SQLSERVER2005个人开发者版 SP4

图片 3

我这里用旧的硬盘希捷硬盘和新买的固态硬盘三星硬盘来比较

这次测试用到的测试软件:

ASSSDBenchmark_1.7_XiaZaiBa

HDTune 5.0

ATTO DiskBenchmark:

 

由于这篇文章:SSD固态硬盘详解说首次安装不能用GHOST版Windows7来安装

那我只能上网下载装机版镜像,并刻录成光碟,经过一番折腾终于安装好操作系统和SQLSERVER了

网上有很多4KB对齐的文章,例如下面所说:

GHOST11.5版本之前的 Ghost 装 Win7 会导致已有对齐的分区不对齐

Ghost 能用吗?

能用,只是 Ghost 11.5 之前的版本会导致即使原有分区是对齐的,Ghost 后不对齐

11.5 及之后版本 只要镜像创建于对齐的分区,恢复后也是对齐的。如果你不清楚你所使用 Ghost 的版本请最好不要使用。


用鲁大师显示一下硬盘信息

希捷硬盘

图片 4

三星硬盘

图片 5

 

 

 

关于性能问题:

由于是Windows7的系统,那么我的笔记本电脑瓶颈就在SATA2.0接口上

AHCI模式、TRIM指令、4KB对齐这些条件都没有问题

至于4KB这个对齐参数是不是可以达到性能最佳这个要看您的固态硬盘的闪存颗粒用的是哪一种

最好咨询一下卖家或者硬盘厂商,由于本人是固态硬盘的小白,为了装好系统尽快上班工作就不研究

这个参数了,直接设置为4KB

说明一下:这篇文章的测试结果仅供参考!!

 

IOPS

IOPS (Input/Output Operations Per Second),即每秒进行读写(I/O)操作的次数,多用于数据库等场合,衡量随机访问的性能。

存储端(例如硬盘,磁盘阵列)的IOPS性能和主机端的IO是不同的,IOPS是指存储每秒可接受多少次主机发出的访问,

主机的一次IO需要多次访问存储才可以完成。

例如,主机写入一个最小的数据块,也要经过“发送写入请求、写入数据、收到写入确认”等三个步骤,也就是3个存储端访问。

百度百科:

 

4KB对齐是什么?

大家知道Windows是以扇区为读写单位的,一个扇区默认就是4096BYTE(4KB),8个512字节

您们可以看到下面的测试软件,多数以4KB为单位

图片 6

图片 7图片 8

而固态硬盘是以页为读写单位的,为了兼容机械硬盘,硬盘厂商做了一些设置使兼容机械硬盘,而这个设置就是4KB对齐

但是不同的固态硬盘内存颗粒,不一定就是4KB大小就可以对齐的

因为本人对固态硬盘还是小白,不过原理应该就是这个o(∩_∩)o


HDTune 5.0

HDTUNE只测试了读取忘记了测试写入,不好意思啊各位!

希捷硬盘

图片 9

图片 10

三星硬盘

 图片 11

图片 12


ATTO Disk Benchmark

希捷硬盘

图片 13

三星硬盘

 图片 14


AS SSD Benchmark

希捷硬盘

由于希捷硬盘测试到中途突然停止了,没有办法继续测试,AS SSD Benchmark这部分我们只测试三星硬盘

而且在下面文章中也提到:机械硬盘在AS SSD和CDM软件下测试意义不大。

参考文章:别低估成绩 和你解读8款硬盘检测软件

Seq:持续测试,AS SSD会先以16MB的尺寸为单位,持续向受测分区写入生成1个达到1GB大小的文件,

然后再以同样的单位尺寸读取这个,最后计算平均成绩而给出结果。测试一完毕,测试文件会立刻删除。

4K:随机单队列深度测试,测试软件会以512KB的单位尺寸生成1GB大小的测试文件,

然后在其地址范围(LBA)内进行随机4KB单位尺寸进行写入及读取测试,直到跑遍这个范围为止,最后同样计算平均成绩给出结果。

由于有生成步骤,本测试对硬盘会产生一共2GB的数据写入量。本测试完毕后,测试文件会暂时保留。

4K-64Thrd(64Thrd 64线程):随机64队列深度测试,软件则会生成64个16MB大小的测试文件(共计1GB),

然后同时以4KB的单位尺寸,同时在这64个文件中进行写入和读取测试,最后依然以平均成绩为结果。

本步骤也同样产生2GB的数据写入量。本测试一完毕,测试文件会立刻删除。

Acc.time(accurate精确的):数据存取时间测试,软件会以4KB为单位尺寸,随机读取全盘地址范围(LBA),

写入则以512B为单位尺寸,随机写入保留的1GB地址范围内,最后以平均成绩给出结果。

 

图片 15

三星硬盘

 图片 16


数据库读写比较

先创建数据库和表,使用下面脚本,我们随便建立一个堆表

图片 17图片 18

 1 --测试脚本
 2 USE master
 3 GO
 4 CREATE DATABASE testdisk
 5 GO
 6 USE testdisk
 7 GO
 8 --建立堆表
 9 CREATE TABLE testdisktable(id INT ,NAME VARCHAR(5000))
10 GO

View Code

希捷硬盘

测试插入数据(10000条记录)

图片 19图片 20

 1 --测试插入
 2 DBCC DROPCLEANBUFFERS
 3 DBCC FREEPROCCACHE
 4 DBCC freesystemcache('ALL')
 5 GO
 6 SELECT  GETDATE()
 7 GO
 8 DECLARE @i INT
 9 SET @i = 1
10 WHILE ( @i < 10000 ) 
11     BEGIN
12         INSERT  INTO [dbo].[testdisktable] ( [id], [name] )
13         VALUES  ( @i, REPLICATE('s', 3000) )
14         SET @i = @i   1
15     END
16 CHECKPOINT 
17 SELECT  GETDATE()
18 GO

View Code

图片 21

(22:44:35.540)  -  (22:44:17.583)=大概18秒

两个时刻相减大概18秒

 

测试读取数据(10000条记录)

图片 22图片 23

 1 --测试读取
 2 DBCC DROPCLEANBUFFERS
 3 DBCC FREEPROCCACHE
 4 DBCC freesystemcache('ALL')
 5 GO
 6 SET STATISTICS IO ON
 7 SET STATISTICS TIME ON 
 8 GO
 9 SELECT  *
10 FROM    testdisktable
11 SET STATISTICS IO OFF
12 SET STATISTICS TIME OFF 
13 GO

View Code

 1 DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
 2 DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
 3 DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
 4 SQL Server 分析和编译时间: 
 5    CPU 时间 = 0 毫秒,占用时间 = 102 毫秒。
 6 
 7 (9999 行受影响)
 8 表 'testdisktable'。扫描计数 1,逻辑读取 5004 次,物理读取 0 次,预读 5004 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
 9 
10 SQL Server 执行时间:
11    CPU 时间 = 78 毫秒,占用时间 = 1108 毫秒。
12 
13 SQL Server 执行时间:
14    CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

Logical reads:包含该语句从内存数据缓冲区中访问的页数和从物理磁盘读取的页数


三星硬盘

测试插入数据(10000条记录)

图片 24图片 25

 1 --测试插入
 2 DBCC DROPCLEANBUFFERS
 3 DBCC FREEPROCCACHE
 4 DBCC freesystemcache('ALL')
 5 GO
 6 SELECT  GETDATE()
 7 GO
 8 DECLARE @i INT
 9 SET @i = 1
10 WHILE ( @i < 10000 ) 
11     BEGIN
12         INSERT  INTO [dbo].[testdisktable] ( [id], [name] )
13         VALUES  ( @i, REPLICATE('s', 3000) )
14         SET @i = @i   1
15     END
16 CHECKPOINT 
17 SELECT  GETDATE()
18 GO

View Code

 图片 26

 (12:50:04.847) - (12:50:02.150)  =2秒多一点

两个时刻相减大概2秒多一点

 

测试读取数据(10000条记录)

图片 27图片 28

 1 --测试读取
 2 DBCC DROPCLEANBUFFERS
 3 DBCC FREEPROCCACHE
 4 DBCC freesystemcache('ALL')
 5 GO
 6 SET STATISTICS IO ON
 7 SET STATISTICS TIME ON 
 8 GO
 9 SELECT  *
10 FROM    testdisktable
11 SET STATISTICS IO OFF
12 SET STATISTICS TIME OFF 
13 GO

View Code

 1 DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
 2 DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
 3 DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
 4 SQL Server 分析和编译时间: 
 5    CPU 时间 = 0 毫秒,占用时间 = 5 毫秒。
 6 
 7 (9999 行受影响)
 8 表 'testdisktable'。扫描计数 1,逻辑读取 5004 次,物理读取 0 次,预读 5028 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
 9 
10 SQL Server 执行时间:
11    CPU 时间 = 125 毫秒,占用时间 = 651 毫秒。
12 
13 SQL Server 执行时间:
14    CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

 图片 29

 

这两个硬盘的时间差异比较就是执行时间的差异比较分析编译时间的差异比较

因为IO(读取数据页)无论是固态硬盘还是机械硬盘都是需要做的

但是分析编译时间和执行时间不一样

分析编译期间SQLSERVER需要编译中间代码,这个过程也是需要读取磁盘文件的

执行时间里包括从磁盘里读取数据,因为机械硬盘有寻道时间而固态硬盘没有

详细的大家可以看一下我这篇文章:带您理解SQLSERVER是如何执行一个查询的


总结

上面的测试结果有积极的参考意义,如果本人的笔记本电脑接口是原生SATA3.0的速度肯定会更快

打开网页的时候也很快,因为浏览器需要将cookies、缓存文件、图片下载到本地然后显示

自从换了SSD之后多年的老问题解决了,健步如飞了~

 

小贴士:三星固态硬盘在淘宝天猫买的不用600块,还包邮,卖家对我这种小白的态度也很好

            有很多地方不明白也耐心教导o(∩_∩)o

 

如有不对的地方,欢迎大家拍砖o(∩_∩)o

    参考的GitHub地址:

 

    DeskBand相关代码如下:

 开机时间优化,相信这是我们这些使用电脑用户的一个永远的优化话题,一般我们都是使用像360一键优化之类的工具软件来禁用开机启动项从而达到开机时间的缩短的效果,但是从根本上来说,这样只是针对Windows启动的最后一步进行处理,要真正理解开机优化机制,还是得从对系统的启动过程的理解入手。

COLORREF:

       首先,我们要知道在电脑开机的时候,到底Win7都干了哪些事?只有知道这些,我们才能对症下药,真正的做到开机的极速优化。

图片 30图片 31

  下面,就看一下华丽的Windows7的完整开机加载过程吧。

// This code snippet was used by SharpShell.
//

using System.Drawing;
using System.Runtime.InteropServices;

namespace MyDiskInfo.Interop
{
    [StructLayout(LayoutKind.Sequential)]
    public struct COLORREF
    {
        public COLORREF(Color color)
        {
            Dword = (uint)color.R   (((uint)color.G) << 8)   (((uint)color.B) << 16);
        }

        public uint Dword;
        public Color Color
        {
            get
            {
                return Color.FromArgb(
                    (int)(0x000000FFU & Dword),
                    (int)(0x0000FF00U & Dword) >> 8,
                    (int)(0x00FF0000U & Dword) >> 16);
            }
        }
    }
}

 

View Code

  1、开启电源   

DESKBANDINFO:

 

图片 32图片 33

  当你打开电源后,系统将进行加电自检(POST)。如果通过,之后会由机器的核心部分---BIOS会读取主引导记录也就是MBR,MBR作为启动设备的硬盘的首扇区。   

using System;
using System.Runtime.InteropServices;

namespace MyDiskInfo.Interop
{
    /// <summary>
    /// Receives information about a band object. This structure is used with the deprecated IDeskBand::GetBandInfo method.
    /// </summary>
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct DESKBANDINFO
    {
        /// <summary>
        /// Set of flags that determine which members of this structure are being requested. 
        /// </summary>
        /// <remarks>
        /// This will be a combination of the following values:
        ///     DBIM_MINSIZE    ptMinSize is being requested.
        ///     DBIM_MAXSIZE    ptMaxSize is being requested.
        ///     DBIM_INTEGRAL   ptIntegral is being requested.
        ///     DBIM_ACTUAL     ptActual is being requested.
        ///     DBIM_TITLE      wszTitle is being requested.
        ///     DBIM_MODEFLAGS  dwModeFlags is being requested.
        ///     DBIM_BKCOLOR    crBkgnd is being requested.
        /// </remarks>
        public DBIM dwMask;

        /// <summary>
        /// Point structure that receives the minimum size of the band object. 
        /// The minimum width is placed in the x member and the minimum height 
        /// is placed in the y member. 
        /// </summary>
        public POINT ptMinSize;

        /// <summary>
        /// Point structure that receives the maximum size of the band object. 
        /// The maximum height is placed in the y member and the x member is ignored. 
        /// If there is no limit for the maximum height, (LONG)-1 should be used. 
        /// </summary>
        public POINT ptMaxSize;

        /// <summary>
        /// Point structure that receives the sizing step value of the band object. 
        /// The vertical step value is placed in the y member, and the x member is ignored. 
        /// The step value determines in what increments the band will be resized. 
        /// </summary>
        /// <remarks>
        /// This member is ignored if dwModeFlags does not contain DBIMF_VARIABLEHEIGHT. 
        /// </remarks>
        public POINT ptIntegral;

        /// <summary>
        /// Point structure that receives the ideal size of the band object. 
        /// The ideal width is placed in the x member and the ideal height is placed in the y member. 
        /// The band container will attempt to use these values, but the band is not guaranteed to be this size.
        /// </summary>
        public POINT ptActual;

        /// <summary>
        /// The title of the band.
        /// </summary>
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)]
        public String wszTitle;

        /// <summary>
        /// A value that receives a set of flags that define the mode of operation for the band object. 
        /// </summary>
        /// <remarks>
        /// This must be one or a combination of the following values.
        ///     DBIMF_NORMAL
        ///     The band is normal in all respects. The other mode flags modify this flag.
        ///     DBIMF_VARIABLEHEIGHT
        ///     The height of the band object can be changed. The ptIntegral member defines the 
        ///     step value by which the band object can be resized. 
        ///     DBIMF_DEBOSSED
        ///     The band object is displayed with a sunken appearance.
        ///     DBIMF_BKCOLOR
        ///     The band will be displayed with the background color specified in crBkgnd.
        /// </remarks>
        public DBIMF dwModeFlags;

        /// <summary>
        /// The background color of the band.
        /// </summary>
        /// <remarks>
        /// This member is ignored if dwModeFlags does not contain the DBIMF_BKCOLOR flag. 
        /// </remarks>
        public COLORREF crBkgnd;

        /// <summary>
        /// The view mode of the band object. This is one of the following values.
        /// </summary>
        [Flags]
        public enum DBIF
        {
            /// <summary>
            /// Band object is displayed in a horizontal band.
            /// </summary>
            DBIF_VIEWMODE_NORMAL = 0x0000,

            /// <summary>
            /// Band object is displayed in a vertical band.
            /// </summary>
            DBIF_VIEWMODE_VERTICAL = 0x0001,

            /// <summary>
            /// Band object is displayed in a floating band.
            /// </summary>
            DBIF_VIEWMODE_FLOATING = 0x0002,

            /// <summary>
            /// Band object is displayed in a transparent band.
            /// </summary>
            DBIF_VIEWMODE_TRANSPARENT = 0x0004
        }

        /// <summary>
        /// The set of flags that determine which members of this structure are being requested by the caller. One or more of the following values:
        /// </summary>
        [Flags]
        public enum DBIM
        {
            /// <summary>
            /// ptMinSize is requested.
            /// </summary>
            DBIM_MINSIZE = 0x0001,

            /// <summary>
            /// ptMaxSize is requested.
            /// </summary>
            DBIM_MAXSIZE = 0x0002,

            /// <summary>
            /// ptIntegral is requested.
            /// </summary>
            DBIM_INTEGRAL = 0x0004,

            /// <summary>
            /// ptActual is requested.
            /// </summary>
            DBIM_ACTUAL = 0x0008,

            /// <summary>
            /// wszTitle is requested.
            /// </summary>
            DBIM_TITLE = 0x0010,

            /// <summary>
            /// dwModeFlags is requested.
            /// </summary>
            DBIM_MODEFLAGS = 0x0020,

            /// <summary>
            /// crBkgnd is requested.
            /// </summary>
            DBIM_BKCOLOR = 0x0040
        }

        /// <summary>
        /// A value that receives a set of flags that specify the mode of operation for the band object. One or more of the following values:
        /// </summary>
        [Flags]
        public enum DBIMF : uint
        {
            /// <summary>
            /// The band uses default properties. The other mode flags modify this flag.
            /// </summary>
            DBIMF_NORMAL = 0x0000,

            /// <summary>
            /// Windows XP and later: The band object is of a fixed sized and position. With this flag, a sizing grip is not displayed on the band object.
            /// </summary>
            DBIMF_FIXED = 0x0001,

            /// <summary>
            /// DBIMF_FIXEDBMP
            /// Windows XP and later: The band object uses a fixed bitmap (.bmp) file as its background. Note that backgrounds are not supported in all cases, so the bitmap may not be seen even when this flag is set.
            /// </summary>
            DBIMF_FIXEDBMP = 0x0004,

            /// <summary>
            /// The height of the band object can be changed. The ptIntegral member defines the step value by which the band object can be resized.
            /// </summary>
            DBIMF_VARIABLEHEIGHT = 0x0008,

            /// <summary>
            /// Windows XP and later: The band object cannot be removed from the band container.
            /// </summary>
            DBIMF_UNDELETEABLE = 0x0010,

            /// <summary>
            /// The band object is displayed with a sunken appearance.
            /// </summary>
            DBIMF_DEBOSSED = 0x0020,

            /// <summary>
            /// The band is displayed with the background color specified in crBkgnd.
            /// </summary>
            DBIMF_BKCOLOR = 0x0040,

            /// <summary>
            /// Windows XP and later: If the full band object cannot be displayed (that is, the band object is smaller than ptActual, a chevron is shown to indicate that there are more options available. These options are displayed when the chevron is clicked.
            /// </summary>
            DBIMF_USECHEVRON = 0x0080,

            /// <summary>
            /// Windows XP and later: The band object is displayed in a new row in the band container.
            /// </summary>
            DBIMF_BREAK = 0x0100,

            /// <summary>
            /// Windows XP and later: The band object is the first object in the band container.
            /// </summary>
            DBIMF_ADDTOFRONT = 0x0200,

            /// <summary>
            /// Windows XP and later: The band object is displayed in the top row of the band container.
            /// </summary>
            DBIMF_TOPALIGN = 0x0400,

            /// <summary>
            /// Windows Vista and later: No sizing grip is ever displayed to allow the user to move or resize the band object.
            /// </summary>
            DBIMF_NOGRIPPER = 0x0800,

            /// <summary>
            /// Windows Vista and later: A sizing grip that allows the user to move or resize the band object is always shown, even if that band object is the only one in the container.
            /// </summary>
            DBIMF_ALWAYSGRIPPER = 0x1000,

            /// <summary>
            /// Windows Vista and later: The band object should not display margins.
            /// </summary>
            DBIMF_NOMARGINS = 0x2000
        }
    }
}

 

View Code

  ——这时,Windows接管启动过程。接下来: 

POINT:

 

图片 34图片 35

  MBR读取引导扇区-活动分区(也就是我们所说的主分区)的第一扇区。此扇区包含用来启动Windows启动管理器(Windows Boot Manager)程序Bootmgr exe的代码。(WBM与Bootmgr为系统引导启动所必须的,如果缺失或是损坏,系统无法启动)

// This code snippet was used by SharpShell.
//
using System.Runtime.InteropServices;

namespace MyDiskInfo.Interop
{
    /// <summary>
    /// The POINT structure defines the x- and y- coordinates of a point.
    /// </summary>
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct POINT
    {
        /// <summary>
        /// The x-coordinate of the point.
        /// </summary>
        public int X;

        /// <summary>
        /// The y-coordinate of the point.
        /// </summary>
        public int Y;
    }
}

Ps. 这里插一句,估计装系统的童鞋会有人见过这样的情况,在笔记本无法进入系统时,左上角会显示Bootmgr is Missing或者是MBR is Missing,这就是引导丢失的提示,这时候得尝试启动项的修复工具了。

View Code

 

RECT:

  2、启动菜单生成——

图片 36图片 37

  Windows启动管理器读取“启动配置数据存储(BCD)中的信息。这个BCD文件里面是什么东西呢,其实,它里面存放着安装在你的电脑上的所有操作系统的配置信息。这时会根据BCD的引导记录生成启动菜单供用户选择。    

using System.Runtime.InteropServices;

namespace MyDiskInfo.Interop
{
    [StructLayout(LayoutKind.Sequential)]
    public struct RECT
    {
        public RECT(int left, int top, int right, int bottom)
        {
            this.left = left;
            this.top = top;
            this.right = right;
            this.bottom = bottom;
        }


        public int left, top, right, bottom;

        public int Width()
        {
            return right - left;
        }

        public int Height()
        {
            return bottom - top;
        }

        public void Offset(int x, int y)
        {
            left  = x;
            right  = x;
            top  = y;
            bottom  = y;
        }

        public void Set(int left, int top, int right, int bottom)
        {
            this.left = left;
            this.top = top;
            this.right = right;
            this.bottom = bottom;
        }

        public bool IsEmpty()
        {
            return Width() == 0 && Height() == 0;
        }
    }
}

  

View Code

 

Attributes:

  3、当您在启动菜单中选择下列动作时:   

图片 38图片 39

 

本文由糖果派对电玩城发布于用户反馈,转载请注明出处:固态硬盘和机械硬盘的比较和SQLSERVER在两种硬盘

您可能还会对下面的文章感兴趣: