sqlserver2005 数据库服务器cpu和内存占用率很高

jgchenhunter 2008-11-19 11:47:31
我的数据库服务器就只装了一个sqlserver2005(sp2)和杀度软件,配置了一个实列.两个库,一个库用于网站,另一个库用于存放从网上抓取下来的数据
网站用的库,访问量很小.而自从加了后面这个库后,数据库服务器的cpu常时间在95%以上,内存使用一直在1.5G以上,服务器本来使用的内存就是两个G,所以现在很慢,
cpu经常被sqlserver 进程冲到100%,这种情况怎么处理呢?请大家出出注意.
用于存放网上数据的这个库,工作最繁忙的地方就是程序调用这个库里的一个存储过程,这个存储过程是查询现在库里是否有抓取下来的数据库,如果没有就把抓取下来的数据插入库中,数据表越来越大,现在单表大概有60万的数据,我也做相应的优化,如果单独去执行这个存储过程,速度还可以,但是程序循环调用时,速度就很慢了,内存也越来越高,cpu也是越来越高,这中情况我该怎么处理呢?是不是只能增加硬件设备啊?还是有什么其他的办法?

有没有可以控制当cup和内存达到一定量我就释放内存或者cpu资源的方法或者软件啊?我怕这样常时间运行下去,服务器会抗不住
...全文
1495 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wzy_love_sly 2008-11-19
  • 打赏
  • 举报
回复
监视下哪些语句的cpu占用大,读硬盘次数多,找到优化就可以解决
mochencui 2008-11-19
  • 打赏
  • 举报
回复
我想可以用些工具看下屏颈在那里,服务器的存储过程是个问题
jgchenhunter 2008-11-19
  • 打赏
  • 举报
回复
3楼的,我按你方法查了 ,返回信息是 没有阻塞和死锁信息
看来我的情况和你的还不一样

4楼的,我一直循环是因为我要把从网上抓下来的信息,插到库里,严格意义上不是循环,是一个队列,程序在网上抓的东西很快,都压到一个队列中,然后从队列里取出来,去数据库判断,有就插入,没有不望库里查了.是这么一个过程,如果我把这个服务停掉,服务器cpu和内存就下来了

5楼的,我不知道你说的什么意思,我能不能给细说一下 谢谢
Rory_Tang 2008-11-19
  • 打赏
  • 举报
回复
Hello:你如果很在意你的程序运行情况,可以用事件探测器进行情况收集,然后利用分析数据库优化顾问进行分析,若分析的结果发现程序没有问题。
你可以考虑是不是你的OS出了问题。
hyde100 2008-11-19
  • 打赏
  • 举报
回复
现在关键不是这个存储过程语句的优化,我觉的是程序一直在循环执行这个存储过程,但我程序又不能改,我怎么能控制呢?
------------
为什么一值循环?做成定时的了?
hwlinux 2008-11-19
  • 打赏
  • 举报
回复
下面是查询有无死锁和阻塞的存储过程代码,你可以试试,我自己的站也是30W数据。2G内存,CPU老是很高,用下面代码查了下,有很多阻塞和死锁,后来论坛里的人让我加了条索引,奇迹般的好了,不过现在还是有一些阻塞和死锁,不过CPU占用率基本上都1%-10%,以前可是99%啊

create 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 ,blocked
from (select * from sysprocesses where blocked>0 ) a
where not exists(select * from (select * from sysprocesses
where blocked>0 ) b
where a.blocked=spid)
union select spid,blocked from 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
GO
jgchenhunter 2008-11-19
  • 打赏
  • 举报
回复
执行一个存储过程比较频繁,占用cpu比较大,关键是存储过程不能在优化了,因为他要完成的功能很简单,就是判断表里是否有这个数据,没有就把采来的数据插进去.

现在关键不是这个存储过程语句的优化,我觉的是程序一直在循环执行这个存储过程,但我程序又不能改,我怎么能控制呢?

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧