各位大侠:
    先描述一下我的需求:
    第三方软件产生数据,每分钟产生几千笔,通过我方提供的DLL接口写入到我方的资料库。数据格式大致如下:
    Product_ID    Items           Properties      Property_Value
    ---------------------------------------------------------------------
    001           Item1           Porper10001     Proper_Val10001
    001           Item1           Porper10002     Proper_Val10002
    001           Item1           Porper10003     Proper_Val10003
    ......
    001           Item1           Porper1N        Proper_ValN
    001           Item2           Porper20001     Proper_Val20001
    001           Item2           Porper20002     Proper_Val20002
    001           Item2           Porper20003     Proper_Val20003
    ......
    001           Item2           Porper2N        Proper_Val2N  
  
    002           Item1           Porper10001     Proper_Val10001 
    002           Item1           Porper10002     Proper_Val10002 
    002           Item1           Porper10003     Proper_Val10003
    ......
    002           Item1           Porper1N        Proper_ValN
    002           Item2           Porper20001     Proper_Val20001
    002           Item2           Porper20002     Proper_Val20002
    002           Item2           Porper20003     Proper_Val20003
    ......
    002           Item2           Porper2N        Proper_Val2N      ......    我写了一个存储过程,在PL/SQL里面调用1W次的执行时间是8秒多,但是通过DLL(Delphi开发,其中用ADOStoredProc执行存储过程写资料)调用需要3分钟以上才能写入1W数据!这样的效能会影响第三方软件的执行速度!
    由于这样的数据是时时都在Client端产生,所以外部表(External Table)和SQLLDR的方式我认为都不适用!
    各位大侠有没有更好的解决办法,能满足下面的条件:
    1. 第三方软件不能直接连数据库(Oracle 10g)
    2. 3秒钟可以写1千笔资料到数据库,如果做不到,满足第3个条件也可以。
    3. 第三方产生的测试数据都能够保存在数据库,可以不用很及时,允许10分钟的Buffer,也就是10分钟之前的数据一定都保存在了DB里面(如果能满足条件2,这个基本上也就可以满足了。)
    
    期望各位大侠建议更好方式!
    非常感谢!分数可以另外开贴追加!

解决方案 »

  1.   

    产生的数据如果以文本方式保存,可以考虑SQLLOAD
      

  2.   

    SQLLoad需要文件在DB服务器上对吗?而我的这个需求是文件在很多个(现在大概20个)客户端上,而且时时都有新数据生成。所以我觉得SQLLoad有局限!
      

  3.   

    调用OCI接口访问数据库是最快的,
    delphi下有一个控件Direct Oracle Access
    可以试一下,效率比ODAC和ADO都快使用sql*loader是最快的,sql*loader不需要将数据文件放在服务器上,放在任何客户端都可以。
    你可以考虑集中上传到一台机器,然后使用sql*loader加载,也可以在多台机器上建立任务来分别加载!使用sql*loader时,可以考虑直接加载方式
    sqlldr 用户名/密码@连接串 control=控制文件 direct=true streamsize=10485760在普通双核e2200服务器本机上测试,19秒内加载138万行记录!!
      

  4.   


    谢谢兵哥的回复!对我帮助很大!同时还有下面的疑问:
    1. Direct Oracle Access:可以安装在Delphi6上吗?我先自己测!
    2. 对sqlldr不是很了解,它必须在DB Server上执行对吗,在客户端也可以执行吗?那客户端要配置什么?因为数据文件是每分钟每个客户端产生好几个,而且名称也不固定,所以用sqlldr可能先要要解决这些文件的整合问题!
      

  5.   

    2. 对sqlldr不是很了解,它必须在DB Server上执行对吗,在客户端也可以执行吗?那客户端要配置什么?可以在任何装了ORACLE客户端的机子上执行。
      

  6.   

    1:驱动造成的,换个其他驱动看看效率如何,
    2:调用需要3分钟以上才能写入1W数据是如何写入的?使用批量提交的方式?瓶颈是在哪里?数据缓冲?
    3:3秒钟可以写1千笔资料到数据库  或者   10分钟之前的数据一定都保存在了DB里面???你 的要求是10分钟,那你提到的3分钟应该是满足你的需求的啊、4:首先建议你多次测试查看瓶颈是什么地方,然后再针对性的解决,
    试过分批批量提交?
      

  7.   

    1. 想換成兵哥提到的DOA(Direct Oracle Access)试试,不知道这个是否收费?
    2. 在Delphi6中调用1W次存储过程,每次写一笔资料,要花3分钟以上,在PL/SQL DEV里面调用1W次存储过程,只要8秒。未使用批量提交(如果使用批量提交,要如何做?)。瓶颈应该在驱动这里。条件3是考虑数据缓冲的问题。
    3. 这只是对实时行的要求,如果一个客户端产生的数据1W笔要3分钟才能写入数据库,那实际是不能满足要求的,就采用第3种类似数据缓冲的方式,在不影响客户端程式的前提下,能把用户端产生的数据在10分钟内写到数据库里面。
    4. 建议非常好,我正在做,初步估计是驱动的问题!以上非常感谢java3344520的回复以及大家的关注!需求的简单描述是:  第三方软件产生数据(所有的客户端算上每秒1W笔左右)在不了解我方数据库的前提下,写到我方的数据库(通过调用我方的接口)。 这种接口要如何设计,效率才能最快?
      

  8.   

    据我以前参与的一个项目,是在delphi中封装sqlloader,记得当时测试结果是每秒插入三万行
      

  9.   

    insert into table()
    select 一行的值 from dual
    union all
    select 一行的值 from dual
    union all 
    可以这样一次插入1000条
      

  10.   


    在delphi中封装sqlloader,请问有更详细的说明吗?
      

  11.   

    建议到DELPHI板块去问问把,那里可能更多DELPHI建议
      

  12.   

    sqlloader是个命令行工具,当时项目的delphi代码我没见过,我想无非是通过delphi执行其命令行,并捕获输出并分析。你可以先单独用sqlloader测试一下它的用法,开发起来估计容易得多。
      

  13.   

    首先谢谢楼上各位的关注!
    经过DOA测试,效能有所提升,但是期望客户端执行sqlLoader的Demo!
      

  14.   

    能远程连接第三方数据库吗
    在我方数据库创建dblink
    然后通过job的形式定时调用存储过程从第三方数据库获取数据。这样是最快的了。  
    而且最高效,最稳定。。
      

  15.   

    各位大俠瞭解TEXT_IO包如何使用嗎?
      

  16.   

    用ODAC中的oraloader控件 速度很快的