公司刚接到一个电信行业的项目,要求是能够快速将从网络传过来的数据写入数据库(数万条/秒),同时还要进行查询、删除操作。现在通过OTL流的批量提交方式,可以实现对无索引表的近10万条记录/秒的插入操作,但查询操作显得太慢了。表里只有几十万条数据还好,但当表里有上千万条记录的时候,查询和删除操作要等十几分钟。
请问各位大侠:
1. 有没有实现能够快速插入,同时又高效查询、删除操作的建议?
2. 现在我通过三个线程分别处理插入、查询、删除操作,以下操作流程会不会引起问题?说明一下:因公司对代码有管控,上班的时候不能发贴,只能在家把大致流程写出来,各位多多原谅啊。CCritialSection cs; //全局锁
otl_connect db;
otl_connect::otl_initialize(1); //指定多线程环境
db.rlogon(...);...
//插入操作线程...
cs.Lock();
otl_stream outStream(5000, "insert into test values(:f1<int>, :f2<char[20]>, ...", db);//构造数据并写缓冲区
while(...)
{
outStream << x << "123";
}
cs.unlock();//查询操作线程...
cs.Lock();
otl_stream inStream(5000, "select * from test where ...", db);//解析数据
while(...)
{
inStream >> i;
inStream >> str;
....
}
cs.unlock();
//删除操作线程...
cs.Lock();otl_cursor::direct_exec(db, "delete from test where ...");cs.unlock();
请问各位大侠:
1. 有没有实现能够快速插入,同时又高效查询、删除操作的建议?
2. 现在我通过三个线程分别处理插入、查询、删除操作,以下操作流程会不会引起问题?说明一下:因公司对代码有管控,上班的时候不能发贴,只能在家把大致流程写出来,各位多多原谅啊。CCritialSection cs; //全局锁
otl_connect db;
otl_connect::otl_initialize(1); //指定多线程环境
db.rlogon(...);...
//插入操作线程...
cs.Lock();
otl_stream outStream(5000, "insert into test values(:f1<int>, :f2<char[20]>, ...", db);//构造数据并写缓冲区
while(...)
{
outStream << x << "123";
}
cs.unlock();//查询操作线程...
cs.Lock();
otl_stream inStream(5000, "select * from test where ...", db);//解析数据
while(...)
{
inStream >> i;
inStream >> str;
....
}
cs.unlock();
//删除操作线程...
cs.Lock();otl_cursor::direct_exec(db, "delete from test where ...");cs.unlock();
解决方案 »
- ORACLE的问题
- oracle中database link的问题
- 不能登录数据库的问题
- 关于Pl/sql Developer测试的问题
- oracle10g 的命名规则(sid,user,TNSname,listener,instance)
- sqlplus /nolog 中的nolog表示什么意思?
- 请高手数据库导入导出错误
- ASP如何调用oracle的存储过程?
- 查询条件失败:[Oracle][ODBC][Ora]Ora-00904:invalid column name
- [建议]大家收集所有关于Oracle的电子版,方便大家使用。众人捡材火力越旺!
- 求助:oralce中怎么一行转成一列
- oracle 关于 父节点左关联所有子节点问题
不光需要插入,同时还有查询和删除操作呢,处理并发操作,用NoSQL速度会可以吗?
2.查询速度问题:
(1)因为表里数据量很大的时候,即使不通过程序,本身去数据库里直接执行SELECT语句就是很慢的,所以如果每次查询都访问数据库查,一定也是很慢的,这个好象不太好解决。除非使用内存数据库,就是TimesTen数据库,它会把大量的数据存到内存里,这样存取很快。但是你们已经定了使用Oracle数据库,也不能改了。
(2)如果说把INSERT或者UPDATE的数据先临时写到内存里,然后隔断时间再去真正操作数据库,写数据库的表,这样倒是可以,就类似于Oracle本身的写数据Buffer的机制。但是可能不太好实现。
(3)如果上述两种方法,都不行,那只能给表建索引,或者分区,在SELECT语句中,走索引,走分区。这样可能比较简单,效率可以提高一些,但是效果不是很明显。
还是不能解决根本的锁的问题。
http://topic.csdn.net/u/20110831/00/e041462f-411d-490c-97d0-b91921a39963.html