公司的内部网站,以前都没有这种情况出现,现在sqlservr这个进程占用CPU比较高,导致网站所有模块都比较慢,尤其是站内信部分更是慢。
        想问下是什么原因造成的。解决方法。。

解决方案 »

  1.   

    数据库版本?如果是2005的,可以用DMV查询占用CPU高的查询
    select
    top 50
    SUM(qs.total_worker_time) as total_cpu_time,
    SUM(qs.execution_count) as total_execution_count,
    COUNT(*) as number_of_statements,
    qs.plan_handle
    from sys.dm_exec_query_stats qs
    group by qs.plan_handle
    order by SUM(qs.total_worker_time) desc如果是2000的,就用profiler跟踪下吧。
      

  2.   

     补充一句,服务器内存4G。
      是sql server 2005。
      

  3.   

    如果大内存,再参考如下文章.
    http://topic.csdn.net/u/20080314/10/513ff771-fafe-4e78-8978-fae0f2c575b8.html?950019447在 Windows 2000 或 Windows Server 2003 下运行的进程最多可以访问 2 GB 的内存地址空间(假设未使用 /3GB 参数),其中一些内存是物理内存,另一些是虚拟内存。运行的程序越多(因而进程也越多),占用的内存地址空间也就越接近 2 GB 这一最大值。 
         当出现这种情况时,分页进程将显著增加并且会对性能产生负面影响。Windows 2000 和 Windows Server 2003 内存管理器使用 PAE 向程序提供更多的物理内存。这会降低对交换页面文件内存的需要,从而提高了性能。程序本身并不知道实际的内存大小。所有的内存管理和 PAE 内存分配都由内存管理器处理,与运行的程序无关。不过这是32位windows特性,如果改用64位windows的话,由于可管理内存增大,系统自动内存要求支持大于2gb应用程序。 
    解决方案 
    1、修改启动文件,添加/pae和/3gb开关,步骤为: 
    右击我的电脑 -->  属性 -->  高级 -->  启动和恢复 -->  设置 -->  手工编辑启动文件,加入开关, 
    以下是一个 Boot.ini 文件的示例,其中已添加了 PAE 和3gb开关: 
    [boot loader] 
    timeout=30 
    default=multi(0)disk(0)rdisk(0)partition(2)\WINDOWS 
    [operating systems] 
    multi(0)disk(0)rdisk(0)partition(2)\WINDOWS="Windows Server 2003, Enterprise" /fastdetect /PAE /3gb
      

  4.   

    看一下这个进程是否产生了阻塞。
    曾经遇到一个低性能的查询产生了严重的Block,导致整台服务器速度极慢,CPU使用率100%的情况。
    如果有block,再进一步去检查该进程相关对象的锁情况,可能存在冲突。
      

  5.   

     查询了,但是一些数据看不懂的最多的就是这个了total_cpu_time121099625,total_execution_count1180494 这能说明什么啊
      

  6.   

    再用select * from sys.dm_exec_sql_text(@plan_handle)select * from sys.dm_exec_query_plan(@plan_handle)这就可以知道是哪个语句占用较高的CPU,然后抓出来分析,看是否正常。然后,该改代码,重建索引什么的。。造成CPU使用率高的原因有很多,1.不合适的查询语句
    2.不合理的存储过程重编译
    3.存在一定的并发;
    4.游标问题你一个个去排除吧。。
      

  7.   


    最简单的办法: select * from sys.sysprocesses where blocked<>0
    看一下阻塞的Spid,然后执行 DBCC inputbuffer(spid)命令,可以看到这些进程在做什么事情。
    然后分析一下句子,在锁分类里查看这个进程对所用到的表对象持有什么锁。
      

  8.   

      Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)   Nov 24 2008 13:01:59   Copyright (c) 1988-2005 Microsoft Corporation  Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2) 
     这句话是不sp2补丁吧,没有sp3的。需要更新成sp3吗,谁有给个地址。谢谢
      

  9.   


    做日志记录,分析发生进程占用CPU比较高的时段,是否是一直高占用率,之前没有,最近才有,可能是病毒引起。启动Profiler,建Trace来追踪下执行的SQL表达式,看哪一块Duration值高,或哪里发生死锁。
      

  10.   


    把占用CPU时间前五位的查询抓出来,自己分析分析了。
    没办法一步到位的,只能一步步来。
      

  11.   

    sp_who2 看大于50的线程谁的CPU时间最多,把他kill掉看看有没有帮助。
      

  12.   

    此外,还可以看SQL Server内部的等待在什么地方。建议你创建一个数据库来收集等待信息。
    1.    Create WaitStats table for storing waiting information=================
    use class100
    go
    If object_id('dbo.WaitStats') is not null
    drop table dbo.WaitStats
    goselect getdate() as dt,
    wait_type,waiting_tasks_count,wait_time_ms,Max_wait_time_ms, signal_wait_time_ms
    into dbo.WaitStats
    from. sys.dm_os_wait_stats
    where 1=2Alter table dbo.WaitStats
    add constraint PK_WaitStats primary key(dt,wait_type);
    create index idx_type_dt on dbo.WaitStats(Wait_type,dt);
    =====================2.    Create a scheduled(5 minutes) job to load the waiting information from DMV TO WaitStats table.======================
    insert into dbo.WaitStats
    select getdate(), wait_type, waiting_tasks_count,
    wait_time_ms, max_wait_time_ms, signal_wait_time_ms
    from sys.dm_os_wait_stats;
    ======================3. 过一个小时把class100备份下来,发送给我帮你看看:
    .谢谢(防止邮件尺寸太大被block)
      

  13.   


     出现这个了 
    消息 102,级别 15,状态 1,第 1 行
    'WaitStats' 附近有语法错误。
    消息 911,级别 16,状态 1,第 3 行
    在 sysdatabases 中找不到数据库 'class100' 所对应的条目。没有找到具有该名称的条目。请确保正确地输入了该名称。(0 行受影响)
      怎么解决
      

  14.   

     如果是page_select这个存储过程占用cpu比较高,应该怎么kill呢
      

  15.   


    你还没有create class 100数据库啊,create 了后,在运行。
      

  16.   

    SELECT usecounts, cacheobjtype, objtype, text ,plan_handle
    FROM sys.dm_exec_cached_plans 
    CROSS APPLY sys.dm_exec_sql_text(plan_handle) 
    WHERE usecounts > 1 
    ORDER BY usecounts DESC;
    GO找到plan_handle后,查询select *session_id 
    from sys.dm_exec_requests 
    where plan_handle=目标值