blogArticle 是BLOG 文章表, comment 是BLOG文章评论表,entry_id分别是blogArticle ,comment 的主键, sql 语句是找出最近更新的BLOG文章, 包括有评论的更新,l_upd_date是更新日期, 所以找出blogArticle , comment 的最大更新日期,然后倒序排列就可以了,怎么去优化这条SQL语句呢?   select entry_id
                   from (select be.entry_id,
                                max(be.l_upd_date) L1,
                                max(bc.l_upd_date) L2
                           from blogArticle be
                           left join comment bc on be.entry_id =
                                                        bc.entry_id
                                              
                    
                         
                          group by be.entry_id)
                  order by decode(sign(L1 - L2), -1, L2, L1) desc

解决方案 »

  1.   

    entry_id分别是blogArticle ,comment 的主键?
    那group by还有意义吗?select ... from ... be left join ... bc ... order by ...
    就可以了
      

  2.   

    group by 是为了算出最大更新日期
      

  3.   

    首先:“entry_id分别是blogArticle ,comment 的主键” 这个描述有问题
    其次:可以尝试如下sql
    SELECT *
      FROM (
            
            SELECT BE.ENTRY_ID,
                    GREATEST(MAX(BE.L_UPD_DATE),
                             MAX(BC.L_UPD_DATE)) AS L
              FROM BLOGARTICLE BE
              LEFT JOIN COMMENT BC ON BE.ENTRY_ID = BC.ENTRY_ID
             GROUP BY BE.ENTRY_ID 
            )
     ORDER BY L
      

  4.   

    max(be.l_upd_date) L1, 
    max(bc.l_upd_date) L2 如果哪个表数据量大的话,先进行分组,然后在连接
      

  5.   

    考虑left join ,做一修改:
    SELECT *
      FROM (
            
            SELECT BE.ENTRY_ID,
                    DECODE(MAX(BC.L_UPD_DATE),
                           NULL,
                           MAX(BE.L_UPD_DATE),
                           GREATEST(MAX(BE.L_UPD_DATE),
                                    MAX(BC.L_UPD_DATE))) AS L
              FROM BLOGARTICLE BE
              LEFT JOIN COMMENT BC ON BE.ENTRY_ID = BC.ENTRY_ID
             GROUP BY BE.ENTRY_ID)
     ORDER BY L
      

  6.   

    理解错了,entry_id是comment的外键article表最好加上一个最新comment的时间字段,然后加上索引否则时间字段直接排序是很慢的,记录数多的话根本没法跑,比count还慢
      

  7.   

       其实现在语句怎么写不是最重要的了,oracle会选择最优的方案去执行!最重要的是你要给他加上索引,不然两次全表扫描。数据量小点还行,大了跑不出来了都!