当前位置: 代码迷 >> Oracle管理 >> in与exists 的有关问题。
  详细解决方案

in与exists 的有关问题。

热度:181   发布时间:2016-04-24 04:13:08.0
in与exists 的问题。。。
select *
  from (select DA_COMMENT_TEST.*,
               row_number() over(order by DC_RCRE_DATE desc) as rn
          from DA_COMMENT_TEST
         where DC_ID in
               (select DC_ID
                  from DA_COMMENT_KEY_DATA_TEST
                 group by DC_ID
                having sum(decode(DCKD_KEY_TYPE, 'C', 0, 'FU', 0, 1)) = 0 and sum(decode(DCKD_KEY_VALUE, '金逸', 0, '55555', 0, 1)) = 0 and count(distinct DCKD_KEY_TYPE) = '2' and count(distinct DCKD_KEY_VALUE) = '2'))
 where rn >= '1'
   and rn <= '20'
   and DC_RCRE_USER = 'JXY';

求帮忙把上面那条语句改为用exists ,并且加索引优化查询速度。。。现在是用in 的
这是我自己改的:
select *
  from (select DA_COMMENT_TEST.*,
               row_number() over(order by DC_RCRE_DATE desc) as rn
          from DA_COMMENT_TEST
         where exists
         (select DC_ID
                  from DA_COMMENT_KEY_DATA_TEST
                 group by DC_ID
                having sum(decode(DCKD_KEY_TYPE, 'C', 0, 'FU', 0, 1)) = 0 and sum(decode(DCKD_KEY_VALUE, '金逸', 0, '55555', 0, 1)) = 0 and count(distinct DCKD_KEY_TYPE) = '2' and count(distinct DCKD_KEY_VALUE) = '2' and DA_COMMENT_TEST. DC_ID = DA_COMMENT_KEY_DATA_TEST .DC_ID ))
 where rn >= '1'
   and rn <= '20'
   and DC_RCRE_USER = 'JXY'
  运行这两条语句在1W数据中取20条数据,in 的那个语句用了0.5秒,exists 的语句用了1100多秒,我想吐血啊!!有木有、是不是那里错了?不懂这个、。还有在一个表中存了300W数据,用in的 取20条也就是用了差不多400秒,那条exists 语句我真不敢试。。。
------解决思路----------------------
DA_COMMENT_KEY_DATA_TEST
表增加DC_ID、DCKD_KEY_TYPE、DCKD_KEY_VALUE组合索引
  相关解决方案