各位大侠:
先描述一下我的需求:
第三方软件产生数据,每分钟产生几千笔,通过我方提供的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,这个基本上也就可以满足了。)
期望各位大侠建议更好方式!
非常感谢!分数可以另外开贴追加!
先描述一下我的需求:
第三方软件产生数据,每分钟产生几千笔,通过我方提供的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,这个基本上也就可以满足了。)
期望各位大侠建议更好方式!
非常感谢!分数可以另外开贴追加!
delphi下有一个控件Direct Oracle Access
可以试一下,效率比ODAC和ADO都快使用sql*loader是最快的,sql*loader不需要将数据文件放在服务器上,放在任何客户端都可以。
你可以考虑集中上传到一台机器,然后使用sql*loader加载,也可以在多台机器上建立任务来分别加载!使用sql*loader时,可以考虑直接加载方式
sqlldr 用户名/密码@连接串 control=控制文件 direct=true streamsize=10485760在普通双核e2200服务器本机上测试,19秒内加载138万行记录!!
谢谢兵哥的回复!对我帮助很大!同时还有下面的疑问:
1. Direct Oracle Access:可以安装在Delphi6上吗?我先自己测!
2. 对sqlldr不是很了解,它必须在DB Server上执行对吗,在客户端也可以执行吗?那客户端要配置什么?因为数据文件是每分钟每个客户端产生好几个,而且名称也不固定,所以用sqlldr可能先要要解决这些文件的整合问题!
2:调用需要3分钟以上才能写入1W数据是如何写入的?使用批量提交的方式?瓶颈是在哪里?数据缓冲?
3:3秒钟可以写1千笔资料到数据库 或者 10分钟之前的数据一定都保存在了DB里面???你 的要求是10分钟,那你提到的3分钟应该是满足你的需求的啊、4:首先建议你多次测试查看瓶颈是什么地方,然后再针对性的解决,
试过分批批量提交?
2. 在Delphi6中调用1W次存储过程,每次写一笔资料,要花3分钟以上,在PL/SQL DEV里面调用1W次存储过程,只要8秒。未使用批量提交(如果使用批量提交,要如何做?)。瓶颈应该在驱动这里。条件3是考虑数据缓冲的问题。
3. 这只是对实时行的要求,如果一个客户端产生的数据1W笔要3分钟才能写入数据库,那实际是不能满足要求的,就采用第3种类似数据缓冲的方式,在不影响客户端程式的前提下,能把用户端产生的数据在10分钟内写到数据库里面。
4. 建议非常好,我正在做,初步估计是驱动的问题!以上非常感谢java3344520的回复以及大家的关注!需求的简单描述是: 第三方软件产生数据(所有的客户端算上每秒1W笔左右)在不了解我方数据库的前提下,写到我方的数据库(通过调用我方的接口)。 这种接口要如何设计,效率才能最快?
select 一行的值 from dual
union all
select 一行的值 from dual
union all
可以这样一次插入1000条
在delphi中封装sqlloader,请问有更详细的说明吗?
经过DOA测试,效能有所提升,但是期望客户端执行sqlLoader的Demo!
在我方数据库创建dblink
然后通过job的形式定时调用存储过程从第三方数据库获取数据。这样是最快的了。
而且最高效,最稳定。。