webservcie取的数据集如果比较大的话,是非常占用资源的,服务器的cpu占用率非常高。在.net 1.1就是这个样子。在.net 2.0中可以对dataset xml进行压缩,但是1.1不可以。如果自己写语句来压缩,(使用二进制),又不能利用xml的优势。至于为什么Sql Server一直有语句在运行,这个需要查看程序是如何设计的。另外,也有可能是Sql代理服务定时运行某些任务。需要区分下。

解决方案 »

  1.   

    后来我又发现了一个问题,数据库重启或关机重启后,用跟踪探查器也发现同样的语句在运行,把IIS停掉后,也有语句同样运行。
    说明数据库在有未完成任务时,他会自动启动上次的任务???
      

  2.   

    恩,是有个定时任务在执行,看来原因还不是上面我提到的,我又跟踪了一下,发现和这个帖子讨论的是一个问题http://www.cnblogs.com/dudu/archive/2004/08/04/29939.html主要是audit login 和 audit logout耗时较长
      

  3.   

    audit logout的Duration标识的是 自用户登录后用去的大概时间。
    不是查询执行这个语句查询的耗时,请注意
      

  4.   

    哪一组TSQL或过程占用了最多的CPU时间:
    SELECT TOP 50 sum(qs.total_worker_time)/1000 AS total_cpu_time,
                  sum(qs.execution_count)/1000 AS total_execution_count,
                  count(*) AS number_of_statements,
                  qs.plan_handle,qs.sql_handle
    FROM sys.dm_exec_query_stats qs
    GROUP BY qs.plan_handle
    ORDER BY sum(qs.total_worker_time) DESC
      

  5.   

    --谁阻塞了我
    SELECT blocked_query.session_id AS blocked_session_id,
           blocking_query.session_id AS blocking_session_id,
           sql_text.text AS blocking_text,
           waits.wait_type AS blocking_resource
    FROM sys.dm_exec_requests AS blocked_query
    INNER JOIN
         sys.dm_exec_requests AS blocking_query
    ON blocked_query.blocking_session_id=blocking_query.session_id
    CROSS APPLY
    (SELECT * FROM sys.dm_exec_sql_text(blocking_query.sql_handle)) AS sql_text
    INNER JOIN
    sys.dm_os_waiting_tasks AS waits
    ON waits.session_id=blocking_query.session_id
      

  6.   

    --单次执行耗费CPU时间最长的查询计划
    SELECT TOP 5 total_worker_time,last_worker_time,max_worker_time,min_worker_time,
           SUBSTRING(st.text,(qs.statement_start_offset/2)+1,
                    ((CASE statement_end_offset WHEN -1 THEN DATALENGTH(st.text)
                      ELSE qs.statement_end_offset END
                      -qs.statement_start_offset)/2)+1) AS statement_text
    FROM sys.dm_exec_query_stats AS qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
    ORDER BY max_worker_time DESC
    --执行次数最多的查询计划
    SELECT TOP 5 creation_time,last_execution_time,execution_count,
           SUBSTRING(st.text,(qs.statement_start_offset/2)+1,
             ((CASE statement_end_offset WHEN -1 THEN DATALENGTH(st.text)
               ELSE qs.statement_end_offset END
               -qs.statement_start_offset)/2)+1) AS statement_text
    FROM sys.dm_exec_query_stats AS qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
    ORDER BY execution_count DESC
      

  7.   

    sys.dm_exec_query_stats 有这个表吗?我换成DBO也不行
      

  8.   

    说明数据库在有未完成任务时,他会自动启动上次的任务???
    -----------------------------------------------------
    不会的。数据库服务停止时如果有没有完成的任务会被取消并回滚的。
    应该是什么任务被设置为SQL服务启动就开始运行而造成的。
    sys.dm_exec_query_stats   有这个表吗?我换成DBO也不行
    ------------------------------------------------------
    这是2005里面的动态管理信息,2000里面没有。zefuzhang 的那几个查询非常不错,收藏了。
      

  9.   

    应该看看 master.dbo.sysprocesses 这个表里面的记录
    看看当前有那些处理, 它们的 status 是什么, 分别是由谁发起的 request事件探察器出来的结果只能做为参考(而且基本上是从结果的角度出发), 你应该更多的关注出问题的时候, 服务器都在做些什么, 这些操作在什么状态