我现在有一程序需要从表A中查询出10000条记录,然后再插入另外一张表B,注意从表A中查询出的这是一个字段,然后插入表B的有近10个字段,其他字段是从程序中得来的。一个人这样操作时虽然没有什么问题, 但是也需要3-5s的时间,但是并发量大的时候,比如100个并发量的时候时间就猛增到40多s了每个人,这样的速度确实无法忍受。我想问下,如何才能提高速度呢?表A中有基础数据20万,另外对查询的部分关键字也做了索引
我现在有三个方案,分别如下:
1.直接查询表A,然后分批取结果集(一次查询出来不显示,分多次查询!),然后保存后插入到表B中;
2.使用事务型临时表,一次性从表A中查询出所有数据到临时表中,然后再从临时表中查询出来并插入到表B中。使用临时表可以避免每次查询都要匹配条件,而且数据量也减少了;
3.直接从表A中查询出所有的数据,并加上其他额外的数据后一次性插入到表B中,即使用一个SQL语句搞定查询插入操作,用insert into ....select 语句我目前实现的就是这三中方法,但是效率并没有太大的差别,我现在还在考虑是否用ORACLE的存储过程,也或者用JAVA写ORACLE的存储过程。我的查询语句类似:select 字段一 from 表A where c1=? and c2=? and c3=? and info1 in() and info2 in() and info3 in() and info4 in()......
这样的SQL语句,我对c1 c2都做了索引,另外还有当info1,info2,info3,info4只有一个值的时候用=比较,当有多个值的时候才用in操作符。而且info1到info4都是动态生成的,最多只能有info20,而且info的字段值一般都是中文汉字~~~不知道如何提高效率?还望大虾门多多指教啊~~~最近改了几天了,没什么进展啊~:(
我现在有三个方案,分别如下:
1.直接查询表A,然后分批取结果集(一次查询出来不显示,分多次查询!),然后保存后插入到表B中;
2.使用事务型临时表,一次性从表A中查询出所有数据到临时表中,然后再从临时表中查询出来并插入到表B中。使用临时表可以避免每次查询都要匹配条件,而且数据量也减少了;
3.直接从表A中查询出所有的数据,并加上其他额外的数据后一次性插入到表B中,即使用一个SQL语句搞定查询插入操作,用insert into ....select 语句我目前实现的就是这三中方法,但是效率并没有太大的差别,我现在还在考虑是否用ORACLE的存储过程,也或者用JAVA写ORACLE的存储过程。我的查询语句类似:select 字段一 from 表A where c1=? and c2=? and c3=? and info1 in() and info2 in() and info3 in() and info4 in()......
这样的SQL语句,我对c1 c2都做了索引,另外还有当info1,info2,info3,info4只有一个值的时候用=比较,当有多个值的时候才用in操作符。而且info1到info4都是动态生成的,最多只能有info20,而且info的字段值一般都是中文汉字~~~不知道如何提高效率?还望大虾门多多指教啊~~~最近改了几天了,没什么进展啊~:(
另外 用in的话效率明显会降低 但是看不到你的实际数据我也说不上什么来
比如info1有一年级和二年级的话,使用info1 in('一年级','二年级') 和使用 info1='一年级' or info1='二年级' 这样的语句有什么太大的差别么?不太清楚~~表结构都是比较简单的,表A主要就是一个m字段(要查询出来的),还有c1 c2 c3字段和info1 info2 info3……info20,结构如下:
table A:
id primary key
m char(20),
c1 number(10),
c2 number(10),
c3 number(1),
info1 varchar2(500),
info2 varchar2(500),
info3 varchar2(500),
……
info20 varchar2(500)
我就是要根据c1 c2 c3,这三个字段是必须的,然后再动态的根据info1 info2等字段获取记录,info等字段是动态的,可能有一个,二个,三个或多个~~
数据基本上是这样的啦~~~~~~~~~~~~~~~~~插入就是取出m字段,然后插入到表B中,插入到B中的记录中只有字段m是从表A中取出的,其他的字段都是直接从内存中获取的~~~基本情况就是这样了,再怎么优化呢???
增加一个info的table
primary key做两个
tableAID,infoID
可以试试看么
如果要做索引则应该是 i_abc on a(a,b,c),也许会好一些! 反复的察看explain就能够明白。
id primary key
m char(20),
c1 number(10),
c2 number(10),
c3 number(1)table info:
ID primary key
Aid primary key(foreign key REFERENCES A.ID)
info varchar2(500)