另外:有个表的数据量是100万级的 怎么优化这个表(自己本地测试了下在150万数据表上面建立索引 查询速度反而比没有索引的查询速度慢)

解决方案 »

  1.   

    CPU占用率高的九种可能 
    1、防杀毒软件造成故障 
    由于新版的KV、金山、瑞星都加入了对网页、插件、邮件的随机监控,无疑增大了系统负担。处理方式:基本上没有合理的处理方式,尽量使用最少的监控服务吧,者,升级你的硬件配备。 
    2、驱动没有经过认证,造成CPU资源占用100% 
    大量的测试版的驱动在网上泛滥,造成了难以发现的故障原因。 处理方式:尤其是显卡驱动特别要注意,建议使用微软认证的或由官方发布的驱动,并且严格核对型号、版本。 
    3、病毒、木马造成 
    大量的蠕虫病毒在系统内部迅速复制,造成CPU占用资源率据高不下。解决办法:用可靠的杀毒软件彻底清理系统内存和本地硬盘,并且打开系统设置软件,察看有无异常启动的程序。经常性更新升级杀毒软件和防火墙,加强防毒意识,掌握正确的防杀毒知识。 
    4、控制面板—管理工具—服务—RISING REALTIME MONITOR SERVICE点鼠标右键,改为手动。 
    5、开始->;运行->;msconfig->;启动,关闭不必要的启动项,重启。 
    6、查看“svchost”进程。 
    svchost.exe是Windows XP系统的一个核心进程。svchost.exe不单单只出现在Windows XP中,在使用NT内核的Windows系统中都会有svchost.exe的存在。一般在Windows 2000中svchost.exe进程的数目为2个,而在Windows XP中svchost.exe进程的数目就上升到了4个及4个以上。 
    7、查看网络连接。主要是网卡。 
    8、查看网络连接 
    当安装了Windows XP的计算机做服务器的时候,收到端口 445 上的连接请求时,它将分配内存和少量地调配 CPU资源来为这些连接提供服务。当负荷过重的时候,CPU占用率可能过高,这是因为在工作项的数目和响应能力之间存在固有的权衡关系。你要确定合适的 MaxWorkItems 设置以提高系统响应能力。如果设置的值不正确,服务器的响应能力可能会受到影响,或者某个用户独占太多系统资源。 
    要解决此问题,我们可以通过修改注册表来解决:在注册表编辑器中依次展开[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServiceslanmanserver ]分支,在右侧窗口中新建一个名为“maxworkitems”的DWORD值。然后双击该值,在打开的窗口中键入下列数值并保存退出: 
    9、看看是不是Windows XP使用鼠标右键引起CPU占用100% 
    在资源管理器里面,当你右键点击一个目录或一个文件,你将有可能出现下面所列问题: 
    任何文件的拷贝操作在那个时间将有可能停止相应 
    网络连接速度将显著性的降低 
    所有的流输入/输出操作例如使用Windows Media Player听音乐将有可能是音乐失真成因: 
    当你在资源管理器里面右键点击一个文件或目录的时候,当快捷菜单显示的时候,CPU占用率将增加到100%,当你关闭快捷菜单的时候才返回正常水平。 
      

  2.   

    先说一下你的环境吧,免得乱猜.
    反正我觉得有一点不会错,加CPU,加内存,加RAID缓存,加RAID硬盘
      

  3.   

    服务器配置CPU双核2.0 2GB内存
    现在主要的问题是连接数太多了 同时有200人连着
      

  4.   

    内存并不多.最好有个6块硬盘做RAID5,
    连接数多,建议还是优化客户端程序
      

  5.   

    生产环境和查询分开,如果实时性高,就用复制吧。如果数据变化不大,加视图,用上 with (no_lock)解决锁的问题
      

  6.   

    建议升级硬件,200个以上的连接,得服务器级的才能跟得上速度,我们机房的数据库服务器有210多个连接,但服务器用的是IBM服务器(16核,64G内存),呵呵,跑起来一点问题都没有啦
      

  7.   

    我用邹建大哥的存储过程查找到了死锁的进程 以及超成死锁的SQL:select min(mtime)from gw_missions where mtype=0 and tuserid='1122'
    这个表里面的数据:100万 
    有什么办法能定时查杀死锁的进程吗?
      

  8.   


    /*--调用示例exec p_lockinfo
    --*/
    create proc p_lockinfo
    @kill_lock_spid bit=0, --是否杀掉死锁的进程,1 杀掉, 0 仅显示
    @show_spid_if_nolock bit=1 --如果没有死锁的进程,是否显示正常进程信息,1 显示,0 不显示
    as
    declare @count int,@s nvarchar(1000),@i int
    select id=identity(int,1,1),标志,
    进程ID=spid,线程ID=kpid,块进程ID=blocked,数据库ID=dbid,
    数据库名=db_name(dbid),用户ID=uid,用户名=loginame,累计CPU时间=cpu,
    登陆时间=login_time,打开事务数=open_tran, 进程状态=status,
    工作站名=hostname,应用程序名=program_name,工作站进程ID=hostprocess,
    域名=nt_domain,网卡地址=net_address
    into #t from(
    select 标志='死锁的进程',
    spid,kpid,a.blocked,dbid,uid,loginame,cpu,login_time,open_tran,
    status,hostname,program_name,hostprocess,nt_domain,net_address,
    s1=a.spid,s2=0
    from master..sysprocesses a join (
    select blocked from master..sysprocesses group by blocked
    )b on a.spid=b.blocked where a.blocked=0
    union all
    select '|_牺牲品_>',
    spid,kpid,blocked,dbid,uid,loginame,cpu,login_time,open_tran,
    status,hostname,program_name,hostprocess,nt_domain,net_address,
    s1=blocked,s2=1
    from master..sysprocesses a where blocked<>0
    )a order by s1,s2select @count=@@rowcount,@i=1if @count=0 and @show_spid_if_nolock=1
    begin
    insert #t
    select 标志='正常的进程',
    spid,kpid,blocked,dbid,db_name(dbid),uid,loginame,cpu,login_time,
    open_tran,status,hostname,program_name,hostprocess,nt_domain,net_address
    from master..sysprocesses
    set @count=@@rowcount
    endif @count>0
    begin
    create table #t1(id int identity(1,1),a nvarchar(30),b Int,EventInfo nvarchar(255))
    if @kill_lock_spid=1
    begin
    declare @spid varchar(10),@标志 varchar(10)
    while @i<=@count
    begin
    select @spid=进程ID,@标志=标志 from #t where id=@i
    insert #t1 exec('dbcc inputbuffer('+@spid+')')
    if @标志='死锁的进程' exec('kill '+@spid)
    set @i=@i+1
    end
    end
    else
    while @i<=@count
    begin
    select @s='dbcc inputbuffer('+cast(进程ID as varchar)+')' from #t where id=@i
    insert #t1 exec(@s)
    set @i=@i+1
    end
    select a.*,进程的SQL语句=b.EventInfo
    from #t a join #t1 b on a.id=b.id
    end
    go
    用这个过程杀死锁进程 会不会影响数据库的正常运行 
      

  9.   


    哎 代码不是我写的啊写代码的人离职了 他自己早知道 死锁这个BUG。。可他无从下手
      

  10.   

    问个问题,有必要那么多连接数吗?你们的并发用户数在多少量级?
    我记得以前我们有一个sun的小型机在150人连接的时候也跑不动。当然数据量比你们的大了n倍。
    我觉得你们那机器配置,70-90人的连接数差不多了。
    关于死锁的问题,建议好好查一下,怀疑索引或者逻辑有问题。
      

  11.   

    select * from t(nolock) indeX 的建立有问题 查询的时候是用了你建立的那个index吗? 如果不是 强制使用  index = ix_。。
      

  12.   


    至强4颗CUP2.0 内存由2G增加至现在的6GB
      

  13.   

    我也准备用这个方法去试试
    可不知道(nolock)会不会引起其他问题。。因为系统的使用时间很宝贵 如果有点点差错就可能造成经济损失一直不敢动同事的代码;
      

  14.   

    0-确认一下,SQL中所能使用的最大内存.
    1-能让数据库完成的就用数据库完成,比如有些客户端的事务可以用触发器完成,忽略掉客户端的一点时间就是胜利.
    2-建立索引,定期维护,注意一下索引的填充因子,这样可以解决客户端查询的资源占用.
    3-重新分析业务流程,做好流程分析,然后重建业务,当然了,这得花很多很多的时间,相当于重新开发一个系统来替代老的系统了.
      

  15.   

    0-- 怎么查看SQL能够使用的最大内存
    2-- 填充因子 不太理解。。有劳解释下。。