怎么样向oracle高速插入记录
现在程序每秒大概会收到几百条数据,要求将收到的数据全都插入到数据库中,在数据插入时会有一个触发器触发,其它没有任何处理。
我现在是开个线程,收到一条就实时插入一条,数据量小的情况下还好一点,大数据量就会出现数据丢失的情况,而且这样明显效率不高。
请各位给个思路,有具体代码更好。
[解决办法]
如果是mssql,可以每几十或几百条生成一个sql,一次提交
[解决办法]
你的FSQLs在哪?需要作保护么?
我觉得你应当用事务,把FSQLs的语句拼到一个事务中,然后将事务定时提交,
[解决办法]
建议干掉触发器,慢得要死
[解决办法]
你这样写是一条一条记录的去提交的,可以改为插入全部完成后才提交。另外,建议你把插入的部分放在DB的存储过程里面,并在存储过程里面捕捉所有的异常,你可以把有异常的信息记录到一个ERRORTABLE里面。
[解决办法]
建议:自己写个先进先出队列。最起码将这个可能影响性能的问题先排除。
[解决办法]
有遇到过类似的情况,一条条插入数据的效率很低。 解决办法是用oracle的OCI接口批量提交数据, 建立一个数组达到一定数据量就一次提交上去。
[解决办法]
不加事务如何提交到数据库,oracle数据库可以置成自动提交(可能就是你所说的不加事务),但这样每一条都会提交一次,这样效率会更低。
可以选择适当的条件提交事务。
另外,你的sql用绑定变量了吗,索引什么的都建好了吗,这些也是很关键的。
[解决办法]
delphi里用的是odac控件,可以参考一下下面批量插入数据的做法:
表名
create table TEST_RY
(
RYMC VARCHAR2(20),
AGE NUMBER(2),
VAL NUMBER
)
类型
create or replace type TEST_RY_TYPE is object
(
mc varchar(20),
age number(2),
val number
)
create or replace type TEST_RY_ARR is table of TEST_RY_TYPE
存储过程
create or replace procedure TEST_ADD_RY(valarr in TEST_RY_ARR) as
begin
insert into TEST_RY(Rymc, age, val)
select mc, age, val from table(valarr);
end;
uses OraObjects;var oNestTable: TOraNestTable;begin with OraQuery1 do begin Close; sql.Clear; SQL.Text := ' begin ' + ' TEST_ADD_RY(:test); ' + ' end; '; with OraQuery1.ParamByName('test').AsArray do begin ObjectType:=TOraType.Create(OraSession1.OCISvcCtx,'TEST_RY_ARR'); ItemAsObject[0].AttrAsString['MC']:= 'Bruce'; ItemAsObject[0].AttrAsInteger['age']:= 18; ItemAsObject[0].AttrAsInteger['val']:= 25; ItemAsObject[1].AttrAsString['MC']:= 'Tom'; ItemAsObject[1].AttrAsInteger['age']:= 17; ItemAsObject[1].AttrAsInteger['val']:= 20; ItemAsObject[2].AttrAsString['MC']:= 'John'; ItemAsObject[2].AttrAsInteger['age']:= 22; ItemAsObject[2].AttrAsInteger['val']:= 31; end; ExecSQL; Close; end;end;