oracle中使用group by优化distinct_oracle

今天mentor给了一个sql语句优化的任务。(环境是sql developer)有一个语句执行很慢,查询出来的结果有17544条记录,但需970秒,速度很慢。语句是这样的:

SELECT DISTINCT  'AMEND_NEW',
       reporttitle,
       reportsubtitle,
       cab_cab_transactions.branchcode,
       cab_cab_transactions.prtfo_cd,
       cab_cab_transactions.sstm_scrty_id,
       cab_cab_transactions.sstm_trx_id,
       cab_cab_transactions.trde_dttm,
       cab_cab_transactions.efcte_dttm,
       cab_cab_transactions.due_stlmnt_dt,
       cab_cab_transactions.cncl_efcte_dttm,
       cab_cab_transactions.trde_sstm_id,
       cab_cab_transactions.trx_type_cd,
       cab_cab_transactions.trx_type_dscrn,
       cab_cab_transactions.trx_subtype_cd,
       cab_cab_transactions.trde_stat_flg,
       cab_cab_transactions.csh_cr_dr_indcr,
       cab_cab_transactions.long_shrt_indcr,
       cab_cab_transactions.lcl_crncy,
       cab_cab_transactions.stlmt_crncy,
       cab_cab_transactions.nomin_qty,
       cab_cab_transactions.price,
       cab_cab_transactions.lcl_cst,
       cab_cab_transactions.prtfo_cst,
       cab_cab_transactions.lcl_book_cst,
       cab_cab_transactions.prtfo_book_cst,
       cab_cab_transactions.lcl_sell_prcds,
       cab_cab_transactions.prtfo_sell_prcds,
       cab_cab_transactions.lcl_gnls,
       cab_cab_transactions.prtfo_gnls,
       cab_cab_transactions.lcl_acrd_intrt,
       cab_cab_transactions.prtfo_acrd_intrt,
       cab_cab_transactions.stlmt_crncy_stlmt_amt,
       cab_cab_transactions.lcl_net_amt,
       cab_cab_transactions.prtfo_net_amt,
       cab_cab_transactions.fx_bght_amt,
       cab_cab_transactions.fx_sold_amt,
       cab_cab_transactions.prtfo_crncy_stlmt_amt,
       cab_cab_transactions.prtfo_net_incme,
       cab_cab_transactions.dvnd_crncy_net_incme,
       cab_cab_transactions.dvnd_type_cd,
       cab_cab_transactions.lcl_intrt_pd_rec,
       cab_cab_transactions.prtfo_intrt_pd_rec,
       cab_cab_transactions.lcl_dvdnd_pd_rec,
       cab_cab_transactions.prtfo_dvdnd_pd_rec,
       cab_cab_transactions.lcl_sundry_inc_pd_rec,
       cab_cab_transactions.prtfo_sundry_inc_pd_rec,
       cab_cab_transactions.bnk_csh_cptl_secid,
       cab_cab_transactions.bnk_csh_inc_secid,
       cab_cab_transactions.reportdate,
       cab_cab_transactions.filename,
        sysdate,
       'e483448'
   FROM cab_cfg_trx_type_mapping RIGHT JOIN(cab_cab_tran_adjustments
      INNER JOIN cab_cab_transactions ON(cab_cab_transactions.branchcode = cab_cab_tran_adjustments.branchcode )
       AND(cab_cab_tran_adjustments.sstm_trx_id = cab_cab_transactions.sstm_trx_id)) ON(cab_cfg_trx_type_mapping.cab_trx_type_cd = cab_cab_transactions.trx_type_cd)
       AND(nvl(cab_cfg_trx_type_mapping.cab_trx_subtype_cd,' ') = nvl(cab_cab_transactions.trx_subtype_cd,' ')
       AND (cab_cfg_trx_type_mapping.branchcode=cab_cab_transactions.branchcode))
      WHERE cab_cab_transactions.prtfo_cd IN
       (SELECT DISTINCT prtfo_cd
        FROM cab_cab_valuations_working
        WHERE created_by = 'e483448'
          AND branchcode='ISA')
       AND cab_cab_tran_adjustments.efcte_dttm > '2011-07-31'
       AND cab_cab_tran_adjustments.efcte_dttm <= '2011-08-31'
       AND eff_trde_stat_flg <> 'X'
       AND cab_cab_transactions.branchcode = 'ISA'
       AND cab_cab_tran_adjustments.branchcode = 'ISA'
       AND(cab_cfg_trx_type_mapping.cab_reportgroup = 'CABValuation' OR cab_cfg_trx_type_mapping.cab_reportgroup IS NULL) 

问题在distinct上面,它会导致对全表扫描,而且会导致排序,然后删除重复的记录,所以速度很慢,因此需要优化distinct。查了不少资料,并逐一尝试,最后发现了一个非常可观的优化结果,用group by。语句如下:

SELECT   'AMEND_NEW',
       reporttitle,
       reportsubtitle,
       cab_cab_transactions.branchcode,
       cab_cab_transactions.prtfo_cd,
       cab_cab_transactions.sstm_scrty_id,
       cab_cab_transactions.sstm_trx_id,
       cab_cab_transactions.trde_dttm,
       cab_cab_transactions.efcte_dttm,
       cab_cab_transactions.due_stlmnt_dt,
       cab_cab_transactions.cncl_efcte_dttm,
       cab_cab_transactions.trde_sstm_id,
       cab_cab_transactions.trx_type_cd,
       cab_cab_transactions.trx_type_dscrn,
       cab_cab_transactions.trx_subtype_cd,
       cab_cab_transactions.trde_stat_flg,
       cab_cab_transactions.csh_cr_dr_indcr,
       cab_cab_transactions.long_shrt_indcr,
       cab_cab_transactions.lcl_crncy,
       cab_cab_transactions.stlmt_crncy,
       cab_cab_transactions.nomin_qty,
       cab_cab_transactions.price,
       cab_cab_transactions.lcl_cst,
       cab_cab_transactions.prtfo_cst,
       cab_cab_transactions.lcl_book_cst,
       cab_cab_transactions.prtfo_book_cst,
       cab_cab_transactions.lcl_sell_prcds,
       cab_cab_transactions.prtfo_sell_prcds,
       cab_cab_transactions.lcl_gnls,
       cab_cab_transactions.prtfo_gnls,
       cab_cab_transactions.lcl_acrd_intrt,
       cab_cab_transactions.prtfo_acrd_intrt,
       cab_cab_transactions.stlmt_crncy_stlmt_amt,
       cab_cab_transactions.lcl_net_amt,
       cab_cab_transactions.prtfo_net_amt,
       cab_cab_transactions.fx_bght_amt,
       cab_cab_transactions.fx_sold_amt,
       cab_cab_transactions.prtfo_crncy_stlmt_amt,
       cab_cab_transactions.prtfo_net_incme,
       cab_cab_transactions.dvnd_crncy_net_incme,
       cab_cab_transactions.dvnd_type_cd,
       cab_cab_transactions.lcl_intrt_pd_rec,
       cab_cab_transactions.prtfo_intrt_pd_rec,
       cab_cab_transactions.lcl_dvdnd_pd_rec,
       cab_cab_transactions.prtfo_dvdnd_pd_rec,
       cab_cab_transactions.lcl_sundry_inc_pd_rec,
       cab_cab_transactions.prtfo_sundry_inc_pd_rec,
       cab_cab_transactions.bnk_csh_cptl_secid,
       cab_cab_transactions.bnk_csh_inc_secid,
       cab_cab_transactions.reportdate,
       cab_cab_transactions.filename,
        sysdate,
       'e483448'
   FROM cab_cfg_trx_type_mapping RIGHT JOIN(cab_cab_tran_adjustments
      INNER JOIN cab_cab_transactions ON(cab_cab_transactions.branchcode = cab_cab_tran_adjustments.branchcode )
       AND(cab_cab_tran_adjustments.sstm_trx_id = cab_cab_transactions.sstm_trx_id)) ON(cab_cfg_trx_type_mapping.cab_trx_type_cd = cab_cab_transactions.trx_type_cd)
       AND(nvl(cab_cfg_trx_type_mapping.cab_trx_subtype_cd,' ') = nvl(cab_cab_transactions.trx_subtype_cd,' ')
       AND (cab_cfg_trx_type_mapping.branchcode=cab_cab_transactions.branchcode))
      WHERE cab_cab_transactions.prtfo_cd IN
       (SELECT DISTINCT prtfo_cd
        FROM cab_cab_valuations_working
        WHERE created_by = 'e483448'
          AND branchcode='ISA')
       AND cab_cab_tran_adjustments.efcte_dttm > '2011-07-31'
       AND cab_cab_tran_adjustments.efcte_dttm <= '2011-08-31'
       AND eff_trde_stat_flg <> 'X'
       AND cab_cab_transactions.branchcode = 'ISA'
       AND cab_cab_tran_adjustments.branchcode = 'ISA'
       AND(cab_cfg_trx_type_mapping.cab_reportgroup = 'CABValuation' OR cab_cfg_trx_type_mapping.cab_reportgroup IS NULL)
       GROUP BY  reporttitle,
       reportsubtitle,
       cab_cab_transactions.branchcode,
       cab_cab_transactions.prtfo_cd,
       cab_cab_transactions.sstm_scrty_id,
       cab_cab_transactions.sstm_trx_id,
       cab_cab_transactions.trde_dttm,
       cab_cab_transactions.efcte_dttm,
       cab_cab_transactions.due_stlmnt_dt,
       cab_cab_transactions.cncl_efcte_dttm,
       cab_cab_transactions.trde_sstm_id,
       cab_cab_transactions.trx_type_cd,
       cab_cab_transactions.trx_type_dscrn,
       cab_cab_transactions.trx_subtype_cd,
       cab_cab_transactions.trde_stat_flg,
       cab_cab_transactions.csh_cr_dr_indcr,
       cab_cab_transactions.long_shrt_indcr,
       cab_cab_transactions.lcl_crncy,
       cab_cab_transactions.stlmt_crncy,
       cab_cab_transactions.nomin_qty,
       cab_cab_transactions.price,
       cab_cab_transactions.lcl_cst,
       cab_cab_transactions.prtfo_cst,
       cab_cab_transactions.lcl_book_cst,
       cab_cab_transactions.prtfo_book_cst,
       cab_cab_transactions.lcl_sell_prcds,
       cab_cab_transactions.prtfo_sell_prcds,
       cab_cab_transactions.lcl_gnls,
       cab_cab_transactions.prtfo_gnls,
       cab_cab_transactions.lcl_acrd_intrt,
       cab_cab_transactions.prtfo_acrd_intrt,
       cab_cab_transactions.stlmt_crncy_stlmt_amt,
       cab_cab_transactions.lcl_net_amt,
       cab_cab_transactions.prtfo_net_amt,
       cab_cab_transactions.fx_bght_amt,
       cab_cab_transactions.fx_sold_amt,
       cab_cab_transactions.prtfo_crncy_stlmt_amt,
       cab_cab_transactions.prtfo_net_incme,
       cab_cab_transactions.dvnd_crncy_net_incme,
       cab_cab_transactions.dvnd_type_cd,
       cab_cab_transactions.lcl_intrt_pd_rec,
       cab_cab_transactions.prtfo_intrt_pd_rec,
       cab_cab_transactions.lcl_dvdnd_pd_rec,
       cab_cab_transactions.prtfo_dvdnd_pd_rec,
       cab_cab_transactions.lcl_sundry_inc_pd_rec,
       cab_cab_transactions.prtfo_sundry_inc_pd_rec,
       cab_cab_transactions.bnk_csh_cptl_secid,
       cab_cab_transactions.bnk_csh_inc_secid,
       cab_cab_transactions.reportdate,
       cab_cab_transactions.filename 

最后执行时间只有15.1秒,快了60多倍,不得不说这优化效果还是很可观的。不过查了很多资料,仍然没有发现合理地解释:为什么distinct 和group by的效率会有这么大差别。查的很多资料,讲的基本都是两者相差不大,实现也差不多。有待解决。

DISTINCT和GROUP BY这两者本质上应该没有可比性,distinct 取出唯一列,group by 是分组,但有时候在优化的时候,在没有聚合函数的时候,他们查出来的结果也一样。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索group
, oracle_distinct优化
, by优化distinct
oracle_group_by优化
oracle group by 优化、oracle distinct 优化、distinct group by、group by与distinct、group by和distinct,以便于您获取更多的相关知识。

时间: 2024-08-30 19:46:23

oracle中使用group by优化distinct_oracle的相关文章

关联-关于oracle中查询sql的优化

问题描述 关于oracle中查询sql的优化 在数据库中的某个表中有几百万条数据,现在要用这张表关联别的表去查询,查询速度很慢,如何优化才能使查询速度快一些. 解决方案 先优化SQL,然后再优化业务逻辑.最后优化数据库数据存储.起码得把SQL贴出来看看吧,几百万的数据不算多呀. 解决方案二: oracle的权值查询 解决方案三: 用一个相关联的ID,直接查那个表,这样就简单了!

数据统计-oracle中如何进行sql优化

问题描述 oracle中如何进行sql优化 在oracle中如何进行sql优化,not in以及not null,in,请各位大侠指教,谢谢. 解决方案 http://zhidao.baidu.com/link?url=ys3SrPa01XA7QSVwKnZfQzCgXJ7wkWH6_A5Xnb1vSRoyDmlfqCyY2W-K4le1Vgku4wVxNc8A69H8LESrJxWlsK

Oracle中的sql语句优化

1.选择最有效率的表名顺序(只在基于规则的优化器中有效)ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表driving table)将被最先处理,在FROM子句中包含多个表的情况下,必须选择记录条数最少的表作为基础表.如果有3个以上的表连接查询,那就需要选择交叉表(intersection table)作为基础表 , 交叉表是指那个被其他表所引用的表. 2.WHERE子句中的连接顺序ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理表

Oracle中SQL的性能优化

[IT168技术文档]1.用EXISTS替代IN,NOT EXISTS替代NOT IN: 在子查询中,NOT在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下,使用EXISTS(或NOTEXISTS)通常将提高查询的效率.     SELECT AND EXISTS (SELECT 'X' FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO  AND LOC = 'MELB')     2.用Where子句替换HAVING子句:  

Oracle数据库中SQL语句的优化技巧_oracle

在SQL语句优化过程中,我们经常会用到hint,现总结一下在SQL优化过程中常见Oracle HINT的用法: 1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化. 例如: SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT'; 2. /*+FIRST_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳响应时间,使资源消耗最小化.

Oracle中的优化器--CBO和RBO

Oracle中的优化器--CBO和RBO Oracle数据库中的优化器又叫查询优化器(Query Optimizer).它是SQL分析和执行的优化工具,它负责生成.制定SQL的执行计划.Oracle的优化器有两种,基于规则的优化器(RBO)与基于代价的优化器(CBO)          RBO: Rule-Based Optimization 基于规则的优化器          CBO: Cost-Based Optimization 基于代价的优化器 RBO自ORACLE 6以来被采用,一直沿

oracle中或者or和左连接left join 怎么一起使用????

问题描述 oracle中或者or和左连接left join 怎么一起使用???? 语句 select a.owner_id,count(b1.ship_id) cnt,nvl(sum(b1.dwt),0) dwt from so_shipowner_info a left join order_info_secondhand_formal b1 on b1.ship_business_date>to_char(sysdate,'yyyy') and (b1.buyer_id=a.owner_id

Oracle之SQL语句性能优化(34条优化方法)_oracle

好多同学对sql的优化好像是知道的甚少,最近总结了以下34条仅供参考. (1)选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. (2) WH

关于oracle中的反连接

在之前的章节中见到讨论过oracle中的半连接 http://blog.itpub.net/23718752/viewspace-1334483/ 与半连接相对应的是反连接,简而言之半连接就是查询条件中的in,exists,反连接就是not in, not exists这种类型的连接. 在asktom中,tom也对大家关心的in,exists,not in, not exists的问题进行了大量的佐证和解释.因为问题是在2001年左右提出来的,当时还是oracle 8的时代,帖子也沉里许久,在2