求助比赛网站的SQL数据库CPU一直占用100%的解决办法?--附详细说明最近公司和主办单位协同举办了一场大型比赛.比赛项目包含了"网络投票".其中 投票的服务器就是现在出了问题的服务器.需要各位的帮助?1.服务器比赛网站是 .net+SQL2000  比赛投票这几天 SQL占用CPU一直>90%,如果没其他程序的话,它绝对要占用100%.
2.我用事件探察器跟踪了下.发现SQL中有三个执行过程对CPU占用很高,这是截图:下面分别对应三个存储过程的内容:
------------------------------------
--用途:统计一小时内此IP对此ID的投票数
--项目名称:CodematicDemo
--说明:
--时间:2008-7-16 9:28:40
------------------------------------

CREATE PROCEDURE UP_V_ConditionIpUser
@PassportID int,
@vote_ip varchar(50)
 AS 
SELECT 
count(*) as countCondition
FROM V_Condition where DATEDIFF(minute,Pubdatetime,getdate()) <60 and vote_ip=@vote_ip and PassportID=@PassportID
GO

------------------------------------
--用途:统计一分钟内此IP对此ID的投票数
--项目名称:CodematicDemo
--说明:
--时间:2008-7-16 9:28:40
------------------------------------

create PROCEDURE UP_V_ConditionsecondUser
@PassportID int
AS 
SELECT 
count(*) as countsecondCondition
FROM V_Condition where DATEDIFF(second,Pubdatetime,getdate()) <60 and  PassportID=@PassportID
GO
3.这几个存储过程最终的目的就是: 1小时内相同IP不能给同一个ID投6票
                                 1分钟内所有IP不能给同一个ID投30票
现在我有两个问题要请教大家:
1.怎么用事件探察器查看 具体的CPU占用率? 上面的CPU是使用时间.
2.怎么知道SQL究竟是不是这三个存储过程引起呢?
3.如果是这三个存储过程引起,怎么来改正这三个存储过程?

解决方案 »

  1.   

    放在客户端好象不能实现 1分钟内所有IP不能给同一个ID投30票 这样的功能吧?
      

  2.   

    DATEDIFF(second,Pubdatetime,getdate()) <60 and  PassportID=@PassportID如果数据量很大,这个是无法使用索引,cpu肯定100%
      

  3.   

    使用Pubdatetime<dateadd(...)把函数移到=右边,对Pubdatetime和PassportID加索引
      

  4.   

    DATEDIFF(second,Pubdatetime,getdate()) <60 and  PassportID=@PassportID 
    其中 Pubdatetime 我数据库中其中一个表 TB_Record 中一个字段.
    TB_Record 是 每一个成功的投票都会在TB_Record中产生记录.Pubdatetime是当前投票成功时的时间.那我该怎么做优化呢?把他们放到客户端好象是不现实的吧?
    忘记给多分了,只能明天把分加起来.
      

  5.   

    这3条语句的CPU很正常,只是I/O稍大,楼主你看看是否还有其它的CPu数比这个大的?
      

  6.   


    我觉的你说的很对. 
    不过我没明白你说把函数移到=右边 是什么意思?另外,我现在对Pubdatetime和PassportID加索引 ,中途不会出问题吧?因为比赛已经进行到一半时间了,表 TB_Record 产生的数据记录已经很大了,现在再加索引可以吗?如果可以我就去试试了.
      

  7.   

    where Pubdatetime between dateadd(h,-1,getdate()) and getdate()
      

  8.   

     where DATEDIFF(second,Pubdatetime,getdate()) <60这里直接table scan了 ,大问题
      

  9.   

    楼上讲的都有道理,但是有一点忽视了
    根据以往项目中的经验,感觉你的视图V_Condition效率如何。是否该优化。楼主可以考虑下建议
      

  10.   


    这里我要说明下,V_Condition 可能是程序以前是视图,所以取了以V开头的名字,其实他是表.另外我想知道11楼说这里有大问题,那么改怎么解决呢?