表A:a_id(pk), a_name, a_bid表B:b_id(pk), b_priority, b_weightness假设A的数据是B的20倍,B表200w数据,现在要取2w或5w B的记录,且要关联A(主要是取关联后a_name字段)sql:select * from 
  (select b_id,rownum as num from     (select b_id from B order by b_priority desc,b_weightness desc)   ) tmp,A a where tmp.b_id=a.a_bid and num<=50000问题:
rownum和order by在一起的时候,order by不是主键,就先取值再排序,就导致需要用上面的语句来解决问题但是在上述语句中,查询套查询,还要全表扫描,排序,根据假设的数据量,效率是不是很低有没有更好的办法达到要求呢

解决方案 »

  1.   

    还有一种就是采用inselect * from a,b where a_bid=b_id a_bid in (select b_id from B order by b_priority desc,b_weightness desc)需要连b表是因为还有字段没列出来,但是也要取出来
    ------------这种方式经测试在oracle中贼慢,但是db2中相当的快!
      

  2.   

    分两步考虑这个问题:
    1. 取5万B表的记录
       条件根据业务需求定,可使用临时表保存该结果集,以便使用空间换时间。
    2. 使用第一步结果集关联A表,取到约100万记录。
       记得A表的a_bid字段建立索引。