'时间太长,1个5w条左右的事务执行完毕平均3分钟以上(我的pc需要7分半,用户的服务器需要3分钟)'
感觉楼主的这个速度已经不慢了,呵呵
我们的软件,某些事务只有300行左右,也得20秒左右.似乎比楼主的还慢.另外,楼主的事务也太大了,没有别的方法解决吗?

解决方案 »

  1.   

    zjcxc(邹建) 
    //这么宠大的事务, 首先想到的已经是设计不合理了.
    邹哥: 是这样,每一条sql语句本身就是insert或者update一条数据,从用户拿来的内容是一个报文,报文本身就是平均几万行信息,而我们采取的就是把所有的翻译完毕以后一起执行,考虑到事务
    的完整性,我们可以不用保证提交的事务之间产生冲突.
    当然这个方案是可以修改的,我自己的思想是如何把事务变成小事务集合,且最终用自己的机制保证这个没有具体化的大事务.这个我想是可以实现的.
    //无论是否用事务, 这样大量的处理, 可能实现到这个要求吗?
    这个可能是我的经验不足,不知道服务器的性能极限是什么样子的,我把这个东西量化一下.
    我的破机器是sy2.4+512m,自己作sqlserver服务器,测试一个35000行语句的报文,一起提交
    执行不完就终止了,报内存不够的错误,而运行态cpu开始的时候饱和90%以上,后来常驻1G内存
    cpu很低,瓶颈明显是内存.而我单独拿出3000行一下代码执行,大概是每秒100行,线性分布.
    这样3w行代码的理论时间在我的机器上就是300″=5分钟
    在10块cpu以上10G内存以上的客户机器上,理论值可达到多少呢?
      

  2.   

    netcup(茶杯) 
    见我上面的补充,呵呵,明显我对问题描述依然少了关键一句,一条语句仅insert或者update一条记录(非同表,最多可能20张表以上,树形层次结构的)
      

  3.   

    没有理论值, 因为你考虑的都是理想状况, 而且只跑你的这个事务处理, 另外, 你的语句还要求能在多个cpu上并行运行, 才能发挥多个cpu的功效
      

  4.   

    一次insert几万行不是难事吧? 直接用bcp导入, 不要insert一条一条插入一次update几万行, 如果每行数据量不大, update也不会太慢.而最关键的是, 这些似乎都只要一条语句就完成了, 怎么会需要多条语句呢? 
    你的方案不会是开启一个事务, 然后程序中翻译, 翻译完一条, 处理一条, 最终才提交事务吧?
      

  5.   

    zjcxc(邹建)
    一次insert几万行不是难事吧? 直接用bcp导入, 不要insert一条一条插入一次update几万行, 如果每行数据量不大, update也不会太慢.而最关键的是, 这些似乎都只要一条语句就完成了, 怎么会需要多条语句呢? 
    你的方案不会是开启一个事务, 然后程序中翻译, 翻译完一条, 处理一条, 最终才提交事务吧?
    ------------------------------------------------------------------------------------
    是这样的:我把整个背景讲一下
    我做的内容是EDI(电子数据交换).就是用户其它合作公司将其数据生成为平面文件(报文),用户接收到以后用我的程序把平面文件再次展开,生成对应的业务数据,双方合作公司的业务表完全不透明,无法直接导出导入,只能通过报文解析到数据库临时结构表中,再由翻译程序翻译到业务库中,而我做的内容就是把平面文件(报文)解析到数据库临时结构表中的工作.报文大小依合作公司业务内容大小来定,数量依sum(合作公司.办事处)来定,所以大公司,大点报文内容相当大.
    另一背景:报文结构随时可能变化,所以整个解析过程建立在结构定义基础上的,不能写死代码对报文进行逐行翻译.(此处可作为参考)
    由于整个临时结构库是树状的表结构,即总表对多个子表,每一个子表又可能对其它多个子表,层数和子表树均有报文结构决定,所以我用事务完成这个功能的时候使用了IDENT_CURRENT()系统函数,通过这个函数去知道当前上一级的id,然后进行整个树形结构深度和广度的遍历,正因为事务本身的特性,保证了IDENT_CURRENT()函数可以完成这个id的正确赋值,如果离开事务,这个就必然会产生冲突.
    而生成bcp恐怕是非常困难的事情,我们所作的事情本身就是去生成这些数据,如果有了这些数据生成的bcp文件,那么根本不需要再做上面的问题了.
    不知道这么解释你能不能更了解现在我面临的问题
      

  6.   

    我举个例子吧...
    因为不能透露太多内容,我只把一篇报文的前六行粘贴出来
    /////////////////////以下报文原文///////////////////////////////////
    UNB+UNOA:2+dcilxia+165014072+060603:1012+EB200606010080'
    UNH+EB200606010080+IFTMCS:D:96B:UN'
    BGM+786+KINNEB200606010080+9'
    DTM+182:20060603:102'
    TSR+11'
    RFF+BM:SYFZJHJX6217479::1'
    ///////////////////以下是程序生成的语句/////////////////////////////
    insert into edi_iftmcs_head( edifile,UNH_0062,UNH_s009_0065,UNH_s009_0052,UNH_s009_0054,UNH_s009_0051) values (IDENT_CURRENT('edi_importrecord'),'EB200606010080','IFTMCS','D','96B','UN') ;
    update edi_iftmcs_head set BGM_c002_1001='786',BGM_c106_1004='KINNEB200606010080',BGM_1225='9' where id = IDENT_CURRENT('edi_iftmcs_head');
    insert into edi_iftmcs_head_dtm( parent_id, dtm_c507_2005,dtm_c507_2380,dtm_c507_2379) values (IDENT_CURRENT('edi_iftmcs_head'),'182','20060603','102') ;
    insert into edi_iftmcs_head_tsr( parent_id, tsr_c536_4065) values (IDENT_CURRENT('edi_iftmcs_head'),'11') ;
    insert into edi_iftmcs_head_g3( parent_id, RFF_c506_1153,RFF_c506_1154,RFF_c506_1156,RFF_c506_4000) values (IDENT_CURRENT('edi_IFTMCS_head'),'BM','SYFZJHJX6217479',null,'1') ;
    说明:报文结构由独力机构统一定义,我们只能做微调.报文结构相当庞大,光定义报文的元素
    现在只有6种格式的报文就由1750种不同元素的累加,所以,如果写死代码去维护报文导入是
    不可能的.很抱歉我无法将报文格式定义粘贴出来,不好粘贴,如果希望看到,可以google IFTMCS
    也许可以得到一定信息.
      

  7.   

    下班前顶一下,现在我在考虑是否可以把这个东西向bcp导入方向转了,如果可以的话速度就会不成任何问题,希望可以成功.
      

  8.   

    我决定先按照邹建的意见,用bcp进行导入,我把生成sql语句的函数进行一下改造,让它生成一系列的bcp数据文件,然后统一生成一个bcp的bat文件,然后顺序导入得了,估计这个工作要几天时间,等我完成以后回来报告一下结果,然后再给分啊!想看一下结果的就一下,我会尽量把函数贴出来,大家研究.也希望能给大家带来一点有益的东西.
    promise:周五出结果.这几天就do它了.
      

  9.   

    雏形已经做完了,其实就是一个生成bcp文件的过程,现在对于错误检验还没有实现,不过不准备在这个帖子中问了.基本问题已经解决,思路就是把原来生成sql脚本的功夫拿出来生成bcp文件,只要有数据的就暂时放在一个数组中,根据系统库中表的字段排序方式把这个数组重新排序,如果某字段没有数据则直接tab跳过,因为语法太具体,也没有啥经典之处,我就不帖了,如果有想交流的,可以给我发email:[email protected]
      

  10.   

    解决了吗?我也遇到类似的问题
    MSN:[email protected]