本帖最后由 icefaces 于 2014-03-11 07:39:09 编辑

解决方案 »

  1.   

    我想不到有什么业务需求要对一个报表循环10万次?本来就不是这样用的,你还要用,却要追求性能,有点强人所难。游标加循环,不到最后一步就不要用了,load到内存倒可以试试
      

  2.   

    谢谢各位。
    1. 表记录数 98000 row, 大小54M
    2. 大家提到的业务需求简单描述:
       首先从表中查找满足条件的居民,然后分别就查询出来的每个居民,查询与其相似的居民,100000次查询就是做这个的。这些相似的居民记录以子报表的方式展示。
       当前业务执行的顺序就是这样,查询主数据 -> 遍历 -> 执行子数据查询, 耗时主要在100000次的子报表查询3. 加载到内存估计可行,但用到了一些特殊函数,如SOUNDEX。在内存中遍历也存在一定难度。 
      

  3.   

    全表扫,6秒左右。select * from table1;
      

  4.   

    循环内的SQL基本没有余地了,CPU cost 0.001左右,IO cost最高0.11, 耗费在了order by.
      

  5.   

    order by可以借用聚集索引去除,问题是不能一次性匹配?非要一个一个?
      

  6.   


    尽量生成一个大sql(多个select)再一次性执行
    或者把过程2写成存储过程
      

  7.   


    尽量生成一个大sql(多个select)再一次性执行
    或者把过程2写成存储过程
    谢谢。目前看存储过程是最靠谱的,虽然可能不是最好。但多个select性能估计也不会好。这个经过匿名块测试过。
      

  8.   

    相似的条件是什么?循环内花销小为什么时间会这么长?order by又是出现在哪里?给的信息太少了。
      

  9.   

    select ... from table as a,table as b where a.xxx [...] b.xxx;
    括号实现所谓的"类似"这个逻辑,取出了全集