服务器运行缓慢,查看原因是SQL占用了服务器CPU资源的接近百分百,但是内存足够,公司门户网站,在六月一号前一直运行正常,最近才出现的问题,时好时不好,求各位大侠帮忙解决!!!
说明一下服务器情况:IIS 6.0
.netframeword SNK 1.1
SQLSERVER 2000

解决方案 »

  1.   

    看一下--当前正在消耗CPU的SQLSELECT substring(p.text,statement_start_offset/2,CASE WHEN statement_end_offset>0 THEN (statement_end_offset-statement_start_offset)/2 ELSE LEN(p.text) END),
    r.status,r.cpu_time,r.logical_reads,wait_resource,wait_type,LEFT(p.text,500)
     --r.* 
    FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.plan_handle) p
    WHERE r.session_id>=50
    ORDER BY cpu_time DESC
      

  2.   

    1.看一下任务管理器是否有其它进程占用CPU
    2.从事件探查器跟踪一下SQL语句,分析出占用高CPU的语句,再进行相关处理。
      

  3.   

    sql 2000 用这个看--2000--查看CPU利用率
    CREATE PROCEDURE sp_GetTop10_CPU  AS 
    BEGIN
      SET NOCOUNT ON 
      DECLARE @cinterval char(8) 
      DECLARE @interval int
      SET @cinterval = '00:00:10'
      CREATE TABLE #thread
      (
        RUN INT NOT NULL, 
        SPID INT NOT NULL, 
        THREAD INT NULL, 
        STATUS varchar(30) NOT NULL, 
        [IO] INT NOT NULL, 
        CPU INT NOT NULL, 
        MEM INT NOT NULL, 
        LOCKS int NOT NULL, 
        BLK INT NOT NULL,
        hostname varchar(30) NOT NULL, 
        hostprocess INT NOT NULL 
        CONSTRAINT PK_thread1 PRIMARY KEY CLUSTERED (RUN,SPID)
      ) 
      INSERT #thread
      SELECT 1,pr.spid,pr.kpid,pr.status,pr.physical_io,pr.cpu, pr.memusage,ISNULL(count(lk.spid),0),pr.blocked , max(pr.hostname), max(pr.hostprocess)
      FROM   master.dbo.sysprocesses pr 
      LEFT OUTER JOIN  master.dbo.syslocks  lk
      ON pr.spid = lk.spid 
      WHERE pr.spid>=50 AND pr.spid<>@@SPID 
      GROUP BY pr.spid,pr.kpid,pr.status,pr.physical_io, pr.cpu,pr.memusage,pr.blocked   WAITFOR DELAY @cinterval 
      INSERT #thread
      SELECT 2,pr.spid,pr.kpid,pr.status,pr.physical_io,pr.cpu, pr.memusage,ISNULL(count(lk.spid),0),pr.blocked , max(pr.hostname), max(pr.hostprocess)
      FROM   master.dbo.sysprocesses pr 
      LEFT OUTER JOIN  master.dbo.syslocks  lk
      ON pr.spid = lk.spid 
      WHERE pr.spid>=50 AND pr.spid<>@@SPID 
      GROUP BY pr.spid,pr.kpid,pr.status,pr.physical_io, pr.cpu,pr.memusage,pr.blocked 
      SELECT TOP 10 T.*
      FROM
      (
        SELECT a.SPID, a.hostname, b.hostprocess, b.STATUS, (b.CPU-a.CPU) as 'CPU'
        FROM #thread a 
        JOIN #thread b 
        ON a.SPID=b.SPID and a.RUN=1 and b.RUN=2
       ) T
       ORDER BY CPU DESC 
       DROP TABLE #thread 
    RETURN 
    ENDGO --
    sp_GetTop10_CPU/*
    警告: 聚合或其它 SET 操作消除了空值。
    警告: 聚合或其它 SET 操作消除了空值。
    SPID        hostname                       hostprocess STATUS                         CPU         
    ----------- ------------------------------ ----------- ------------------------------ ----------- 
    55          LANDSEA-8CC1455                2440        runnable                       141
    54          LANDSEA-8CC1455                2440        sleeping                       0
    52          LANDSEA-8CC1455                2764        runnable                       0
    51          LANDSEA-8CC1455                2764        sleeping                       0*/
      

  4.   

    用事件管理器捕获一下长时间的查询,添加事件sql:batchcompleted,rpc:completed和sp:stmtcompleted,按duration分组,且过滤的时间大于等于2000毫秒,运行跟踪。跟踪后会按时间从小到大排序,去掉最后一行,倒数第二行就是最长时间查询,然后再向前看一下执行的次数,有的查询时间不长但查询次数多的也要考虑。长时间的查询会导致cpu使用率高且io读取量大。捕获后再优化