数据保存速度变得很慢,我面临失职危险!!!
事情是这样的:
某企业的数据库数据丢失了(MS SQL SERVER),我将以前备份的数据恢复后,最近几个月的数据不全
公司里的各部门正加班加点地补输数据,最开始的时候都保存得很快,但就是不能计算出合格率和不合格数来,这下这个公司的老总很生气,要我一定要搞出来,我流了很多汗,终于在那天晚上(9-25,通宵)搞定了,原因是每个生产部的数据表都应该有触发器来计算合格率等,找到原因后我但补上了。本以为可以放松一下,但这触发器加了之后,保存速度好慢。他们不停地向我反应,我也束手无策,他们老总说,如果今天晚上搞不好,就叫我公司把我炒了我晕了,我也是刚进这个公司,也想生活稳定下来,还是很担心的。
我努力地向他们解释:由于数据库的数据一下丢失,我想对硬盘肯定有损耗的,并且这个服务器是2000年装的(HP NetServer LH 3000 U3),他们用我们公司的ERP有很多年了,服务器硬盘转动耗损减慢是可能发生的。还有就是每个部门的大量输入和在触发器里的运算,我想这也是很大的原因。我的解释只有这里的管理员还理解,他们老总硬生生地要我搞好,要不然我就会被炒。我无赖,只好上CSDN来问问大伙了,在这种情况下,我的看法有误吗?还是数据库另有原因????
希望大伙给我力量,让我闯过这一关,好吗?
谢过了。
先给点意见好吗?

解决方案 »

  1.   

    触发器的内容是这样的
    CREATE TRIGGER [cj_lcdnrb01_update] ON dbo.CJ_LCDNRB01 
    FOR INSERT, UPDATE 
    AS    
        update cj_lcdnrb01 set cj_lcdnrb01.cchgs=inserted.hga+inserted.hgb+inserted.hgc,
    cj_lcdnrb01.bhgs=inserted.zs+inserted.zr+inserted.fk,
    cj_lcdnrb01.hgl=round((inserted.hga+inserted.hgb+inserted.hgc+inserted.hj)/cast(inserted.trs as float(24)),4)
    from cj_lcdnrb01,inserted
    where cj_lcdnrb01.id=inserted.id and cj_lcdnrb01.lcdh=inserted.lcdh and
    cj_lcdnrb01.gxdm=inserted.gxdm and cj_lcdnrb01.gh=inserted.gh and cj_lcdnrb01.cplbh=inserted.cplbh
    and inserted.trs>0
      

  2.   

    你的触发器是没有什么问题的,问题所在是客户端代码过于频繁触发该触发器。
      如果数据库中记录增长比较猛,这种计算代码可以考虑在客户端实现,可控制性更强,可以减少数据库服务器的负载。UPDATE 触发方式暂时(在录入数据期间)可以考虑去掉,如果客户端存在一些代码不合理的东西,比如用户修改了一条记录的一部分内容,就开始提交,该触发器被触发的机率就更高了。
      如果手头有应用程序源代码,建议你检查一下代码,是否存在一些过于频繁update记录。
      

  3.   

    四舍五入的函数
    function myround(const yuan: Extended; const pp: Integer): Extended;
    //yuan:原浮点数,PP保留 小数点后第几位
    var
    p,l,m,l2:Longint;
    s:string; // 原浮点数
    sq:string; // 小数点前
    sh:string;//小数点后
    begin
    if yuan=0 then exit;// 原浮点数 0
    if pp<0 then exit; //非法小数点后第几位
    s:=floattostr(yuan);
    p:=pos('.',s); //小数点位置
    sq:=midstr(s,1,p-1);
    sh:=midstr(s,p+1,length(s)-length(sq)-1);
    l:=length(sh);//小数位数
    l2:=length(sq);//整数位数
    if pp>=l then
    begin//0
    result:=strtofloat(s);
    exit;//比如 11。06 要保留到 小数点后第3位显然 不合理
    end;//
    { if pp=l then //比如 11。06 要保留到 小数点后第2位不用处理 直接返回
    begin//1
    Result:=s;
    exit;
    end;//1 }
    if pp<l then //比如 11。06 要保留到 小数点后第1位 ,
    begin//2
    m:=strtoint(sh[pp+1]);
    if m>=5 then
    begin
    if pp>=1 then //保留到 小数点后第1,2位
    begin//3
    sh:=midstr(sh,1,pp);
    sh := inttostr(strtoint(sh)+1);
    if length(sh)>pp then
    begin
    sh:= midstr(sh,2,pp);
    sq:= inttostr(strtoint(sq)+1);
    end;
    Result:=strtofloat(sq+'.'+sh);
    exit;
    end//3
    else //保留到 小数点后第0位
    begin//4
    sq[l2]:=chr(ord(sq[l2])+1);
    Result:=strtofloat(sq);
    exit;
    end;//4
    end
    else
    begin
    if pp>=1 then //保留到 小数点后第1,2位
    begin//3
    sh:=midstr(sh,1,pp);
    Result:=strtofloat(sq+'.'+sh);
    exit;
    end//3
    else //保留到 小数点后第0位
    begin//4
    Result:=strtofloat(sq);
    exit;
    end;//4
    end;
    end;//2
    end;
      

  4.   

    跟大家分享。。
    function my(x:real):real;
    var
    str,str1,str2:string;
    begin
       str:='';str2:='';str1:='';
       str:=floattostr(x);
       if length(str)<7 then
         result:=x
       else
       begin
       str1:=str[7];
       str2:=copy(str,0,7);
       if strtoint(str1)>=5 then
       begin
          str2:=floattostr(strtofloat(str2)+0.0001);
          result:=strtofloat(copy(str2,0,6));
       end
       else
          result:=strtofloat(copy(str2,0,6));
       end;
    end;
      

  5.   

    先做好数据库备份,然后把1.8G日志的数据库分离,最后找到日志文件,默认情况下在:
    D:\Program Files\Microsoft SQL Server\MSSQL\Data\xxx_log.ldf,可以毫不犹豫删除它。最后,回到控制台,用附加数据库完成数据库恢复,这个时候sql server会提示你是否创建日志文件,点击确定,初始创建的日志540k还是504k,应该很小了吧。 :)
      

  6.   

    更正以下:C:\Program Files\Microsoft SQL Server\MSSQL\Data\xxx_log.ldf
    呵呵,不好意思,我的sql安装在D盘。