HAHA库如下
NAME   RQ         something
张三  2009/11/01  正常
张三  2009/11/02  正常
张三  2009/11/03  正常
...
...李四  2009/10/31  正常
李四  2009/11/01  正常
李四  2009/11/02  正常
李四  2009/11/03  正常
..
..希望选出张三,李四每个人的头10条记录...张三  2009/11/01  正常
张三  2009/11/02  正常
....
张三  2009/11/10  正常
李四  2009/10/31  正常
李四  2009/11/01  正常
...
李四  2009/11/09  正常(共选中20行)
目前写法为
 SELECT *
FROM HAHA A,(SELECT NAME,MIN(RQ) RRQQ FROM HAHA WHERE NAME in ('张三','李四') GROUP BY NAME) B
WHERE B.NAME=A.NAME
AND A.RQ-B.RRQQ<=10第一个问题...因为库相当的巨大,光是B一步,就要33多秒.而且是只搜索两个用户.目前要搜索600多用户.. 
第二个问题...测试时候只用张三,李四这两个用户测试.完整的语句超过3分钟没有反应...除了把B部分创建新表以外,有什么好办法么?目前估计库是2000万行的表..希望高手帮忙~~~

解决方案 »

  1.   

    那把SQL换个写法试试呢
    SQL> select * from haha;NAME                 RQ         SOMETHING
    -------------------- ---------- --------------------
    张三                   2009/11/01 正常
    张三                   2009/11/02 正常
    张三                   2009/11/03 正常
    李四                  2009/11/01 正常
    李四                  2009/11/02 正常
    李四                  2009/11/03 正常6 rows selected.
    SQL> select name,rq,something from
      2  (
      3  select name,rq,something,
      4  row_number() over(partition by name order by rq) rn
      5  from haha
      6  )
      7  where rn<=2;   --这里我数据少 就把你的10换为2了NAME                 RQ         SOMETHING
    -------------------- ---------- --------------------
    李四                  2009/11/01 正常
    李四                  2009/11/02 正常
    张三                   2009/11/01 正常
    张三                   2009/11/02 正常
      

  2.   

    1:NAME字段上加一个索引
    2:不要使用 in 方式查询,因为 a in(1,2)会被解释成a=1 or a=2,这样会引起索引失效
    3:建议使用如下方式查询
    select NAME,RQ,something from(
      select NAME,RQ,something,rownum id from 表名 where NAME='张三'
    )where id < 10
    union
    select NAME,RQ,something from(
      select NAME,RQ,something,rownum id from 表名 where NAME='李四'
    )where id < 10;
    试试吧,期待成功。。
      

  3.   

    你的架构是hibernate,hibernate中可以设置查询的条数啊
      

  4.   

    9楼的方法我试验过...可是sql语句有点过长.在excel中无法完整.要用C#来生成么?然后刷新么?我再试试
    10楼...随便写写的...难道写..临时性路过打个酱油做个俯卧撑.然后回家吃饭?嘿嘿~~~
    11楼..可以说的详细点么?你说的单词我不太懂...地区性断网...查询不到..老断老断
      

  5.   

    select name,rq,something from
    (select name,rq,something,row_number() over(partition by name order by rq) rn from haha where name in ('张三','李四'))
    where rn <= 10; 
      

  6.   

    我来改一下他的:
    select name, rq, something
      from (select name,
                   rq,
                   something,
                   row_number() over(partition by name order by rq) rn
              from haha
             where name in ('张三', '李四'))
     where rn <= 10;
      

  7.   

    之前做专案用SQL Server的时候也遇到过这么多数据,查询页优化了,没好办法解决,就建议客户增加费用换台性能好的服务器,结果成功。嘿嘿。你也试试
      

  8.   

    每个用户才4000行,那么只查2个用户用到的数据量并不大
    建个临时表create global temporary table on commit proserve rows as select ....
    取出2个用户的记录,1W不到的数据,再进行3楼的操作就很快了
      

  9.   

    上面的preserve写错了
    600多个用户大概有200多万条记录,取出放到临时表中再查询速度会快很多
      

  10.   

    坚持自己的观点不要使用 in 方式查询,因为 a in(1,2)会被解释成a=1 or a=2,这样会引起索引失效