热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MSSQLServer访问特别慢

我是一家公司的技术人员,自己用delphi开发了一套小型ERP系统。问题描述:周一大概十点开始卡,访问数据特别地慢,周二至周五是下午一点开始卡。晚上访问正常。
我是一家公司的技术人员,自己用delphi开发了一套小型ERP系统。
问题描述:
         周一大概十点开始卡,访问数据特别地慢,周二至周五是下午一点开始卡。晚上访问正常。
        在查询分析器执行下列语句
       select   request_session_id   spid,OBJECT_NAME(resource_associated_entity_id) tableName   
       from   sys.dm_tran_locks where resource_type='OBJECT'
      有时没有数据,有时就会有大量地表被锁住,而这些表根本就没有加事务,有时候执行一条Sql语句也会把表锁住,卡的时候在客户执行sql语句后面加上 with (nolock)也没有用。表都加了索引。
服务器配置:
           普通台式机,操作系统:windows 2003
           CPU:双核
           内存:4G
           数据库:MS SQLServer 2008
           服务器上放了一个快驴中间件,(delphi的中间件),tomcat

现在公司运行ERP系统的时候速度特别地慢,我一直找不到原因,如果是服务器配制低了,我就直接跟老板申请购买专业服务器,但我怀疑是不是技术上的问题。请高手指点迷津

7 个解决方案

#1


如果数据量小比如几十G,并发量少(几十个客户端),初步估计是设计质量问题
换台好服务器能起的作用有限

#2


但是前一段时间还很正常,就最近一个多星期出现这种情况。。。。。。

#3


你还应该看一下锁的类似和模式
select 
request_session_id,
OBJECT_NAME( resource_associated_entity_id),
request_mode,request_type
from sys.dm_tran_locks
where resource_type='OBJECT'

造成阻塞不是加不加事务的问题,比如你一个更新很慢,如果用不到合理的索引,他就要执行很长时间
此时你其他回话再做查询的话,极有可能被阻塞

我觉得你的大表的增删改查要优化一下,看看是不是能合理地用到索引

#4


另外你说“表都加了索引。”加了索引并不等于能用到索引,关键是看你怎么操作的

像你这中情况,我怀疑是个别大表的操作引起的,
小表的话,几千条几万条数据的那种,怎么玩都没关系,
就怕是大表,哪里设计或者是操作不合理的话,可以拖慢整个系统的

#5


想看阻塞的话,用这个

alter procedure sp_who_lock
as
begin
declare @spid int,@bl int,
@intTransactionCountOnEntry int,
@intRowcount int,
@intCountProperties int,
@intCounter int
create table #tmp_lock_who (
id int identity(1,1),
spid smallint,
bl smallint)
IF @@ERROR>0 RETURN @@ERROR
insert into #tmp_lock_who(spid,bl) 
select 0 as  spid,blocked
from (select * from sys.sysprocesses where blocked>0 ) a
where not exists(select * from (select * from sys.sysprocesses
where blocked>0 ) b
where a.blocked=spid)
union select spid,blocked from sys.sysprocesses where blocked>0
IF @@ERROR>0 RETURN @@ERROR
-- 找到临时表的记录数
select @intCountProperties = Count(*),@intCounter = 1
from #tmp_lock_who
IF @@ERROR>0 RETURN @@ERROR
if @intCountProperties=0
select '现在没有阻塞和死锁信息' as message
-- 循环开始
while @intCounter <= @intCountProperties
begin
-- 取第一条记录
select @spid = spid,@bl = bl
from #tmp_lock_who where Id = @intCounter
begin
if @spid =0
select '引起数据库死锁的是: '+ CAST(@bl AS VARCHAR(10))
+ '进程号,其执行的SQL语法如下'
else
select '进程号SPID:'+ CAST(@spid AS VARCHAR(10))+ '被'
+ '进程号SPID:'+ CAST(@bl AS VARCHAR(10)) +'阻塞,其当前进程执行的SQL语法如下'
DBCC INPUTBUFFER (@bl )
end
-- 循环指针下移
set @intCounter = @intCounter + 1
end
drop table #tmp_lock_who
return 0
end

 

#6


还是要分析慢的地方,是因为CPU,IO,还是语句问题产生了错误。来进行定位锁的原因。 

根据不同的错误继续深入来查找问题的瓶颈点。 从时间上看,lz这个问题发生在业务高峰时段,可以跟踪一下高峰时段的基本线,看看跟平时的差异。

看问题点,可以发生在IO上,如果发生在IO上,注意高发语句的索引使用问题。以及表碎片的问题。 

#7


谢谢tk各位的热心回答,换了专业服务器,一切都正常了。

推荐阅读
author-avatar
xia
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有