write log、PAGELATCH_SH、PAGELATCH_EX
>>>(1) 尝试着将 TempDB放到一个单独的磁盤上(2) 将数据库的 Log文件跟数据文件分开放在不同的磁盤.(3) 如果每天都有备份,那试着将恢复模式改成"Simple".
>>>(1) 尝试着将 TempDB放到一个单独的磁盤上(2) 将数据库的 Log文件跟数据文件分开放在不同的磁盤.(3) 如果每天都有备份,那试着将恢复模式改成"Simple".
2:再找到IO等待,占用最多的库以及库文件.
3:接着就细化到对象了,这个只有PROFILE去跟踪和统计.
........等等
这个东西,综合技能要求特别高,我也没有很好的具体的一些步骤代码.如果是2005,有很多动态视图关于IO的可以查和统计,2000就不太好弄,就只能PROFILE.
(
SELECT
DB_NAME(IVFS.database_id) AS db,
CASE WHEN MF.type = 1 THEN 'log' ELSE 'data' END AS file_type,
SUM(IVFS.num_of_bytes_read + IVFS.num_of_bytes_written) AS io,
SUM(IVFS.io_stall) AS io_stall
FROM sys.dm_io_virtual_file_stats(NULL,NULL) AS IVFS
JOIN sys.master_files AS MF
ON IVFS.database_Id = MF.database_id
AND IVFS.file_id = MF.file_id
GROUP BY DB_NAME(IVFS.database_id),MF.type
)
SELECT
*,
ROW_NUMBER() OVER(ORDER BY io_stall_pct DESC) AS rn
FROM(
SELECT
db,
file_type,
CAST(1. * io / (1024 * 1024) AS DECIMAL(12,2)) AS io_mb,
CAST(io_stall / 1000. AS DECIMAL(12,2)) AS io_stall_s,
CAST(100. * io_stall / SUM(io_stall) OVER() AS DECIMAL(10,2)) AS io_stall_pct
FROM DBIO
)A
WHERE io_stall_pct > 1
AND db NOT IN('msdb','master','distribution','tempdb')
ORDER BY io_stall_pct DESC--给你一个代码,如果你是在2005下,这个可以查出各数据库文件IO读写,等待的统计
--当然很有很多你需要去检查的,这个工作复杂性太高,还是要根据具体的环境来应变和判断,说也说不清楚.
PhysicalDisk Avg. Disk sec/Write 磁盘写操作平均延迟时间(秒) <0.008
---------------------
1、这个问题在系统业务量较小时,不会存在这样的问题,当随着业务量大,并发多了后才出现;至于“改动”方面人为的没有;数据库补定是SP3。2、当问题发生时,cpu利用率很低(即CPU繁忙率30%左右)3、很多表基于查询的需要,都已经建立了对应索引。
楼主你再关注一下blocked ,waittime、WaitResources、status、phyiscal_io 这几个字段当出现阻塞时,这几个字段的值是否在发生变化.查到最终引起阻塞的那个SPID, 它到底是在等待什么资源.这样才好下结论。
你的数据库模式是否有设成"Simple"呀?
你只有一个硬盘
如果你不增加硬盘,唯一的办法是减少I/O操作
可能不前只有一个有效方法,把你的恢复模式改成简单,用个job调度好备份
呵呵,只能是自己注意缩小事务的范圍咯。若要对大数据量的table做操作,就分批次进行像.这种事务也会分批提交的.SET ROWCOUNT 5000
DELETE TABLE WHERE 条件...
WHILE @@ROWCOUNT>0
DELETE TABLE WHERE 条件...
SET ROWCOUNT 0另
simple模式下,日志若涨到70%的话会截斷的。
碰到阻塞时,手动执行一下 CHECKPOINT 看有没效果.------
以上都是些边角料料,最主要还是要找到引起阻塞的SPID所等待的资源.
一般情况下,对过程的优化有时会收到一些效果,不过,最重要的还是事务日志和TEMPDB上,只要将SQLSERVER的日志文件移到一个独立的磁盘中,把TEMPDB移到另一个独立的磁盘中,这种等待的时间将会减少很多.一.移动TEMPDB方法.--确定逻辑路径名。
use tempdb
go
sp_helpfile
go
use tempdb
go
sp_helpfile
go--移动 TEMPDB ,重启SQLSERVER会删除旧文件。
use master
go
Alter database tempdb modify file (name = tempdev, filename = 'C:\SqlServerTempdb\tempdb.mdf')
go
Alter database tempdb modify file (name = templog, filename = 'C:\SqlServerTempdb\templog.ldf')
go
二.移动SQLSERVER日志文件的方法.首先,右击企业管理器中的SQL Server并选择属性。然后,单击开始参数如图A所示。正如我们在图A中所看到的,有以下参数出现在对话框中:-d 是指保存master数据库数据文件的路径全名。-e 是指保存错误日志文件的路径名。-l 是指保存master数据库日志文件的路径全名。现在,如果你要移动文件,那么需要移除当前入口并利用正确的路径重新创建新入口。例如,我们打算将Master数据库日志文件移动到(C:Test)。这样的话,我们将会通过突出高亮显示旧参数并选择移除来删除-l [path](如图B所示)。然后,我们将会添加下面的入口(如图C)-l (c:Testmastlog.ldf)并单击两次确定。现在,将会停止SQL Server并将mastlog.ldf移动到新位置。注意:请务必确保将mastlog.ldf移动到在开始参数中配置的位置。如果移动到了一个未在开始参数中指明的位置,SQL Server将不能启动。最后,开启SQL Server,你已经成功地移动了Master数据库.
1.首先你说的“物理IO满负荷”,指的那些计数器,具体的值是多少?
2.你反映的“此时系统操作响应很慢”,更像是CPU负荷较重时的状态。
3.你列出的主要等待类型中的:PAGELATCH_SH,PAGELATCH_EX 并不是IO相关的典型等待,这类等待主要是
Buffer Pool中页的访问冲突,不涉及物理IO,物理IO相关(典型)应该是这样一类PAGEIOLATCH_*等待。
要解决这一类等待(PAGELATCH_*),必要的时候要去分析,到底是那些页上的等待(即:这个页是那个表或者是索引所拥有的)
这样有助于你分析出,为什么会在这些页上有较重的访问冲突。
4.你的数据库规模如何?当前的硬件配置是否能胜任工作负荷?有建立性能基线嘛?
5.在出现性能问题时,执行这两个语句DBCC SQLPERF(WAITSTATS) ,DBCC MEMORYSTATUS
可以对当前的数据库状态有个了解,也有助于分析问题(最好能和基线做比较)。当然还有一些深入到session(request,task)级分析,不过前提是你已经对发生的问题有了初步判断了。
1.SQL Server Inside 系列(7.0,2k,2k5)都是值得一看的。
2.胡百敬的关于SQL Server效能调校的书
单块硬盘明显影响了你的事务和程序的读写
我猜是是服务器内存资源耗光光了,因为大量阻塞,导至每个spid都持有大量的锁,都在等待。我之前有个客户就是这样,sp_lock查出二十多万条记录,服务器几乎动弹不得。
内存 Memory Available Mbytes
磁盘 PhysicalDisk Avg. Disk sec/Read
PhysicalDisk Avg. Disk sec/Write
SQL批处理统计 SQLServer:SQL Statistics Batch Requests/Sec
SQLServer:SQL Statistics SQL Compilations/sec
SQL Server缓存 SQLServer:Buffer Manager Lazy writes/sec
SQLServer:Buffer Manager Page life expectancy
SQLServer:Buffer Manager Page reads/sec
问题出现之前,和出现时, 各抓最少1小时