我现在有一程序需要从表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.   

    楼主最好列举一下table structure和sample data 不然别人看起来费劲
    另外 用in的话效率明显会降低 但是看不到你的实际数据我也说不上什么来
      

  2.   

    这个不用in的话,如何判断有两个值的情况,用or么?感觉or和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中取出的,其他的字段都是直接从内存中获取的~~~基本情况就是这样了,再怎么优化呢???
      

  3.   

    这个表的设计不是很好 能否改一下呢
    增加一个info的table
    primary key做两个
    tableAID,infoID
    可以试试看么
      

  4.   

    增加一个info的表?这样查询的时候不是要连接查询么?效率会怎么样,而且不光是我这一个程序用到这样的数据,如果改表结果的话, 那么其他很多程序都是需要改的~~你能具体讲讲这样设计的原因么?我的理解是如果将info分开存储的话,那么查询表A的速度肯定是会提高,但是连接info表再查询的话,我就觉得效率上不会有提升,或许有降低的也说不定~~还望指教啊~
      

  5.   

    我也觉得在语句上比较难于优化了。最重要的是简化设计,或者为查询而改变设计。 程序只有做到最简单才是好的。如果不能从这个方向出发,可能解决的有限的很。
      如果要做索引则应该是 i_abc on a(a,b,c),也许会好一些! 反复的察看explain就能够明白。
      

  6.   

    table A:
    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)
      

  7.   

    简化设计?关键这是个通用型的,不能作成死的,所以简化方面不太好做了~~~如果要做索引则应该是 i_abc on a(a,b,c),也许会好一些! 反复的察看explain就能够明白?至于索引方面,联合索引不会比建单个的索引快吧?~~这点我待会可以考证一下。小虫的这个表设计的很合理,不过如果这样改了表结构的话,我的很多程序代码都要动了,闷啊,但是为了提高效率又不得不试下,我待会看看这个设计的执行计划么样~~~在语句方面我也觉得优化的可能性不太高了,或许俺是没想到~呵