日期:2014-05-18  浏览次数:20435 次

我的数据库如何改善,请高手帮忙(高手进)
数据库服务器配置

dell PowerEdge 6800
CPU:4个双核(3160)
内存:4G
硬盘:300G
采用的是RAID1 存储方式

现在数据库经常出这样的情况:客户端经常反馈超时或死锁,数据库每天11点钟要准时计算MRP运算,这个时候就更加的慢了,我检查了CPU的使用率才17%左右,内存的使用也就2G.但我发现数据库的锁有900多个,甚至1000,而且有的已经被阻塞了。所以当碰到这样的情况的时候,我一般就是停止服务器,再启动,就会好点,但是这不是长久之计。

我查过具体是那些语句或存储过程引起了死锁,也计划修改一些代码,以避免死锁,但是又不知道如何下手?还有就是有900多个锁属于正常吗?可不可以限制,杀死锁对客户端有什么大的影响吗?数据库中的表有7百多个,高手还有什么好的方法吗?

------解决方案--------------------
呵呵,可能是SQL语句设计有问题,设计程序时尽量少用锁(只读除外),否则性能肯定不佳切调试麻烦。有900个锁在我看来是不正常的,除非有这麽多同时连接的客户,还是要说具体些,才能判断清楚
------解决方案--------------------
设计有问题!
------解决方案--------------------
设计问题,你得逐步诊断你的问题所在,查询执行最长的50个语句:
select top 50 
qs.plan_handle, 
qs.total_worker_time
from 
sys.dm_exec_query_stats qs
order by qs.total_worker_time desc
然后逐个检查,一步步调优
可以使用nolock提示去处理,但不是最好的,你需要是去做啄木鸟,找出毛毛虫来,呵呵
------解决方案--------------------
LZ 应该优化一下Sql语句,很多select语句建议根据情况加上 with(nolock) 或者是 能忽略行级锁的WITH(UPDLOCK, READPAST),这样能避免很多超时的情况


死锁的原因很多还是业务逻辑的原因,这个就比较麻烦了
------解决方案--------------------
转贴:
Sql Server 2000数据库死锁的解决
昨天下午准备给单位的服务器将趋势杀毒网络版换成服务器版。
因为趋势的杀毒网络版需要一些我以前有在服务器上关掉的一些属性:
一、注册表部分
1.系统自动启用管理共享
2.系统自动启用服务器共享
3.不能隐藏自己的共享文件夹
二、网卡部分
1.要安装NetBios协议
三、服务
1.需要远程注册表修改服务(Remote Registry)必须启动。
四、以前的网络版必须卸载掉
 
因为要安装趋势杀毒服务版以上的条件缺一不可,在安装过程中服务器就重启好几次,在一次重启中,发现趋势杀毒服务版安装到77%停了下来,在服务器上也登陆不进去,等待了大概3分钟进去后发现MS SQL Server 2000启动不起来。
经过几次重启服务器,MS SQL Server 2000依然不能启动。
察看C:\Program Files\Microsoft SQL Server\MSSQL\LOG下的错误日志,发现其中有一条:
... server 使用 dynamic 锁分配。[2500] 锁块,[5000] 锁所有者块。
我尝试着用单机(参数-m)或者最小模式(参数-f)来启动MS SQL Server 2000,但服务器系统中存在SQLSERVR的进程存在,启动失败。
使用“Windows 任务管理器”不能杀掉此进程,后利用Norton的任务管理器强制杀掉此进程。

C:\Program Files\Microsoft SQL Server\MSSQL\Binn\sqlservr.exe -m -f 
以单机、最小模式启动sqlservr,成功。
参看显示日志如下:
... server Warning: -f command line flag used...minimal server configured. 
... server SQL Server 正在以优先级“normal”(已检测到 2 CPUs)启动。
... server 已为 thread 模式处理而配置了 SQL Server。
... server 使用 dynamic 锁分配。[2500] 锁块,[5000] 锁所有者块。
... server 由于启动选项的原因跳过了 <a name="MS DTC"></a> 初始化。
... spid4 警告 ******************
... spid4 SQL Server 以单用户模式启动。允许对系统目录进行更新。

然后重启计算机,MS SQL Server 2000启动成功。
事后分析看来这是MS DTC(Microsoft Distributed Transaction Coordinator)冲突,也就是趋势杀毒服务版的安装过程和MS Sql Server 2000启动可能是利用了同一的组件对象模块 (COM),因此产生了事务冲突。
造成MS Sql Server 2000启动的事务冲突死锁。


------解决方案--------------------
个人认为正是因为没有合理使用事务和使用锁而造成的

例如在存储过程中使用事务,创建表,然后又进行复杂的事物操作,系统在执行该过程时历时相对会比较长时间一点
如果在这个时候去又又客户端使用DDL,DDL使用会等待该过程执行完毕,因为系统表被锁住了。

临时想几个注意点给你:
1.大事务,要限制其执行时间,超时就回滚,客户端捕抓该超时错误,稍后再自动提交给数据库处理
2.多事务相争同一资源的时候,设置牺牲事务,同样返回错误给客户端,让前台语言包处理错误,稍后再提交,这样就不会造成:你等我的资源,我等你的资源,彼此相持的局面
我认为前面两点比较重要
3.合理锁定资源粒度,行级锁就够的,不要锁页,甚至锁表,这样其他并发事务就只能等它释放锁后才能执行
4.一般少执行DDL,因为任何select查询在进行中,DDL只能等待;而一旦DDL在执行中又会让所有对该表操作的
session处于等待中。
5.定时使用的长事务,大事务,Job,数据库压缩等操作放在系统不忙得时间进行

已经很久不用mssql了,即时所想,希望对你有启发