本帖最后由 kaoh1631 于 2010-09-13 13:08:38 编辑

解决方案 »

  1.   

    SELECT x.*
      FROM (SELECT message_title, create_date, message_type_id,
                   row_number() OVER(PARTITION BY message_type_id ORDER BY create_date desc) AS rn
              FROM bank_msg_info) x
     WHERE x.rn <= 6;
      

  2.   


    嗯 这个确实可以 ,就是少了个where 条件 呵呵10000条记录的时候 测试了两个SQL,貌似效率没有提升使用union all   0.047秒使用火龙果的SQL  0.092秒
      

  3.   

    SQL code    SELECT x.* FROM (SELECT message_title, create_date, message_type_id, row_number() OVER(PARTITION BY message_type_id ORDER BY create_date desc) AS rn FROM bank_msg_info) x WHERE x.rn <= 6;顶下
      

  4.   


    比对了两个SQL 的速度吗?~
      

  5.   

    bank_msg_info 表记录:6万条,message_type_id 有索引:select message_title,create_date,message_type_id  from (select * from bank_msg_info where  message_type_id='1' order by create_date desc) where rownum<=6
    union all
    select message_title,create_date,message_type_id  from (select * from bank_msg_info where  message_type_id='2' order by create_date desc) where rownum<=6
    union all
    select message_title,create_date,message_type_id  from (select * from bank_msg_info where  message_type_id='3' order by create_date desc) where rownum<=6
    union all
    select message_title,create_date,message_type_id  from (select * from bank_msg_info where  message_type_id='4' order by create_date desc) where rownum<=6
    union all
    select message_title,create_date,message_type_id  from (select * from bank_msg_info where  message_type_id='5' order by create_date desc) where rownum<=6
    union all
    select message_title,create_date,message_type_id  from (select * from bank_msg_info where  message_type_id='6' order by create_date desc) where rownum<=6耗时:
    0.172秒-----------------------------------------------------------------------------SELECT x.*
      FROM (SELECT message_title, create_date, message_type_id,
                   row_number() OVER(PARTITION BY message_type_id ORDER BY create_date desc) AS rn
              FROM bank_msg_info where message_type_id in('1','2','3','4','5','6') ) x
     WHERE x.rn <= 6;耗时:
    0.45秒
      

  6.   

     - - 我的那个SQL 看起来丑!
      

  7.   

    order by create_date desc
    在create_date列上建个索引吧。
      

  8.   

    因为在 message_type_id 条件用了 IN,那就不走索引了。用 UNION ALL 的话会走索引的。如果这样的话,就用你那个吧,基本上没有优化的余地了。