一. SQL Server 什么时候和磁盘打交道:

1. SQL 需要访问的数据没有在Buffer pool中,第一次访问时需要将数据所在的页面从数据文件中读取到内存中。(只读)

2. 在insert/update/delete提交之前, 需要将日志记录缓存区写入到磁盘的日志文件中。(写)

3. Checkpoint的时候,需要将Buffer pool中已经发生修改的脏数据页面同步到磁盘的数据文件中。(写)

4. 当Buffer pool空间不足的时候, 会触发Lazy writer, 主动将内存中的一些很久没有使用过的数据页面和执行计划清空。如果这些页面上的修改还没有被检查点写回硬盘, Lazy writer 会将其写回。(写)

5. DBCC checkDB, Reindex, Update Statistics, database backup等操作, 会带来比较大的硬盘读写。(读/写)

二. 哪些SQL 配置会对I/O有影响:

1. ( Recovery Interval, 默认60秒)(Checkpoint pages/sec + Avg. Disk Queue Length + Batch Requests/sec)

2. 数据文件和日志文件的自动增长和自动收缩。对于生成数据库,要避免自动增长和自动收缩。

3. 数据文件中的页面碎片程度 (Clustered index) :  dbcc showcontig('table_name') -- avg. Page Density(full)  碎片多,读取/写入的页面多(set statistics io on -- logical reads)

4. 表上的索引结构: 聚集索引的表和堆表的存储管理不同。

5. 数据压缩: 可以减少I/O, 但会消耗CPU和内存资源。

6. 数据文件和日志文件分别放在不同的硬盘上,日志要放在写入速度较快的硬盘上, 如RAID10

7. 数据文件可以有多个分别放到不同硬盘上的文件, SQL server会将新数据按照同一个文件组的每个文件剩余空间的大小, 按比例写入到所有有剩余空间的文件中。  而日志文件则不同, 在一个时间点只会写一个日志文件。 所以在不同的硬盘上建日志文件对性能没有什么帮助。

三. 操作系统I/O问题的诊断:

1. 在判断SQL I/O问题之前,先看看Windows层面I/O是否正常。 如果很忙,再确认是不是SQL造成的。

2. LogicalDisk and PhysicalDisk:

  %idle time:

  %disk time: = %disk read time + %disk write time

  %disk read time

  %disk write time

  Avg. disk sec/read

  Avg. disk sec/write:   很好:<10ms    一般:10-20ms   有点慢:20-50ms   非常慢:> 50ms

  Avg. disk bytes/transfer

  Avg. disk queue length: 不应该长时间>2  (SAN 盘就不同)

  Avg. disk read queue length

  Avg. disk write queue length

  Disk Bytes/sec:  好:20-40MB   一般:10-20MB

  Disk Read Bytes/sec

  Disk Write Bytes/sec

  Disk Transfers/sec

  Disk Reads/sec

  Disk Writes/sec

  Current Disk queue length

四. SQL Server 内部分析:

1. 检查sys.dm_exec_requests 或者 sys.dm_os_wait_stats:

  select wait_type,

    waiting_tasks_count,

    wait_time_ms

  from sys.dm_os_wait_stats

  where wait_type like 'PAGEIOLATCH'   -- PAGEIOLATCH_EX(写)   PAGEIOLATCH_SH(读) 主要反映数据文件上的I/O等待

  order by wait_type

2. 找出那个数据库哪个文件总做I/O,是数据文件还是日志文件, 经常读,还是经常写:

  select db.name as database_name, f.fileid as file_id, f.filename as file_name,

    i.num_of_reads, i.num_of _bytes_read, i.io_stall_read_ms,

    i.num_of_writes, i.num_of_bytes_written, i.io_stall_write_ms,

    i.io_stall, i.size_on_disk_bytes

  from sys.database db inner join sys.sysaltfiles f on db.database_id=f.dbid

  inner join sys.dm_io_virtual_file_stats(NULL,NULL) i  on i.database_id=f.dbid and i.file_id=f.fileid

  select database_id, file_id, io_stall, io_pending_ms_ticks, scheduler_address  -- check every pending I/O request

  from sys.dm_io_virtual_file_stats(NULL,NULL) t1, sys.dm_io_pending_io_requests as t2

  where t1.file_handle=t2.io_handle

  -- check which table in buffer pool and how mang size of it

  declare @name nvarchar(100)

  declare @cmd nvarchar(1000)

  declare dbname cursor for

    select name from master.dbo.sysdatabases

  open dbname

  fetch next from dbname into @name

  while @@fetch_status = 0

  begin

    set @cmd= 'select b.databse_id, db=dbname(b.database_id), p.object_id, p.index_id, buffer_count=count(*) from ' + @name + '.sys.allocation_units a, '

        + @name + '.sys.dm_os_buffer_descriptions b, ' + @name+ '.sys.partitions p

        where a.allocation_unit_id=b.allocation_unit_id

        and a.container_id=p.hobt_id

        and b.database_id=db_id(''' + @name+ ''')

        group by b.database_id, p.object_id, p.index_id

        order by b.database_id, buffer_count desc'

    exec(@cmd)

    fetch next from dbname into @name

  end

  close dbname

  deallocate dbname

  go

五. 和SQL相关的计数器:

  1. Buffer manager:

    page reads/sec  and page writes/sec

    Lazy writes/sec

    Checkpoint writes/sec

    Readahead pages/sec

  2. Access Methods:

    Freespace scans/sec

    Page splits/sec

    Page allocations/sec

    Workfiles/sec

    Worktables/sec

    Full scans/sec

    Index Searches/sec

  3. Database(Log Activity)

    Log flushes/sec

    Log Bytes flushed/sec

    Log flush wait time

    Log flush waits/sec

六. 硬盘压力测试:

  SQLIO 下载地址:http://www.microsoft.com/en-us/download/details.aspx?id=20163#QuickInfoContainer

SQLIO 已经升级成 DiskSPD。 在上面的链接中下载readme.pdf, 该文件中有下载地址。  Diskspd-v2.0.17.zip 解压之后如下图:

  

  UsingDiskspdforSQLServer.docx里面有详细的使用说明和分析方法。

 



SQL Server I/O 问题的诊断分的更多相关文章

  1. 【监控笔记】【2.4】SQL Server中的 Ring Buffer 诊断各种系统资源压力情况

    SQL Server 操作系统(SQLOS)负责管理特定于SQL Server的操作系统资源. 其中相关的动态管理试图sys.dm_os_ring_buffers将被标识为仅供参考.不提供支持.不保证 ...

  2. 搭建SQL server AwaysOn集群

    1.环境 系统:windows server 2012 R2 数据库版本:SQL server 2012 三台服务器,IP分别是:10.10.10.111,10.10.10.112,10.10.10. ...

  3. SQL Server安全(2/11):身份验证(Authentication)

    在保密你的服务器和数据,防备当前复杂的攻击,SQL Server有你需要的一切.但在你能有效使用这些安全功能前,你需要理解你面对的威胁和一些基本的安全概念.这篇文章提供了基础,因此你可以对SQL Se ...

  4. Oracle与SQL Server事务处理的比较

    事务处理是所有大型数据库产品的一个关键问题,各数据库厂商都在这个方面花费了很大精力,不同的事务处理方式会导致数据库性能和功能上的巨大差异.事务处理也是数据库管理员与数据库应用程序开发人员必须深刻理解的 ...

  5. SQL Server Log文件对磁盘的写操作大小是多少

    原文:SQL Server Log文件对磁盘的写操作大小是多少 SQL Server 数据库有三种文件类型,分别是数据文件.次要数据文件和日志文件,其中日志文件包含着用于恢复数据库的所有日志信息,SQ ...

  6. SQL Server 2012中快速插入批量数据的示例及疑惑

    SQL Server 2008中SQL应用系列--目录索引 今天在做一个案例演示时,在SQL Server 2012中使用Insert语句插入1万条数据,结果遇到了一个奇怪的现象,现将过程分享出来,以 ...

  7. 《Troubleshooting SQL Server》读书笔记-内存管理

    自调整的数据库引擎(Self-tuning Database Engine) 长期以来,微软都致力于自调整(Self-Tuning)的SQL Server数据库引擎,用以降低产品的总拥有成本.从SQL ...

  8. SQL Server 2012内部原理及故障排除(专栏)

    PROFESSIONAL SQL SERVER® 2012 INTERNALS AND TROUBLESHOOTING一书(可从这里下载).认为内容非常不错.自己也想对SQL Server 2012有 ...

  9. Sql Server 内存相关计数器以及内存压力诊断

    在数据库服务器中,内存是数据库对外提供服务最重要的资源之一, 不仅仅是Sql Server,包括其他数据库,比如Oracle,MySQL等,都是一类非常喜欢内存的应用. 在Sql Server服务器中 ...

随机推荐

  1. android 图片全屏

    方式一: 在xml的布局文件的根元素设置属性background 方式二: <ImageView         android:layout_width="fill_parent&q ...

  2. 介绍并扩展Fitnesse的测试模块化机制:ScenarioTable

    摘要:在验收测试框架Fitneese中,使用Scenario可以把最常用的测试步骤封装起来,从而达到模块化定义Fitnesse测试用例的能力.但Scenario仅限于封装Script测试步骤,Scri ...

  3. FZU 2127 养鸡场

     Problem Description Jason买来了n米长的竹篱笆,打算将n米长的竹篱笆全部用来围成一个三角形的养鸡场.为方便起见,养鸡场三条边的长度都为正整数.同时,他想让自己的养鸡场看起来更 ...

  4. Ext.useShims=true

    Extjs的panel中嵌套ActiveX的插件,如PDF,但是Ext控件被遮罩 eg.在panel的tbar中加入下拉框,结果其下拉值看不到,原因就是被PDF给遮住了, 此时只需设置Ext.useS ...

  5. sprintf的缓冲区溢出

    sprintf的缓冲区溢出 分类: 技术2010-03-07 15:26 362人阅读 评论(0) 收藏 举报 今天,调试sector的时候遇到一个特奇怪的问题,程序会在取string的c_str() ...

  6. RHEL6.x 删除Oracle11g

    1.停止数据库 $sqlplus /nolog SQL>conn /as sysdba SQL>shutdown immediate 2.停止Listener $lsnrctl stop ...

  7. MBProgressHUD not showing

    In my app, I am loading a resource heavy view that takes about 1 to 2 seconds to load. So I am loadi ...

  8. Java SAX Parser

    SAX is an abbreviation and means "Simple API for XML". A Java SAX XML parser is a stream o ...

  9. hdoj 2099 整除的尾数

    整除的尾数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  10. swift 内存管理,WEAK 和 UNOWNED

    因为 Playground 本身会持有所有声明在其中的东西,因此本节中的示例代码需要在 Xcode 项目环境中运行.在 Playground 中可能无法得到正确的结果. 不管在什么语言里,内存管理的内 ...