oracle中使用group by优化distinct
今天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 是分组,但有时候在优化的时候,在没有聚合函数的时候,他们查出来的结果也一样。
我想要获取技术服务或软件
服务范围:MySQL、ORACLE、SQLSERVER、MongoDB、PostgreSQL 、程序问题
服务方式:远程服务、电话支持、现场服务,沟通指定方式服务
技术标签:数据恢复、安装配置、数据迁移、集群容灾、异常处理、其它问题
本站部分文章参考或来源于网络,如有侵权请联系站长。
数据库远程运维 oracle中使用group by优化distinct
相关文章
- ump一步到位:使用 Oracle Dump 快速导入数据(oracle导入dp)
- Oracle 视图 DBA_SQL_PLAN_BASELINES 官方解释,作用,如何使用详细说明
- Oracle 等待事件 instance state change 官方解释,作用,如何使用及优化方法
- 精通Oracle开窗函数,实现随心所欲的数据处理(oracle开窗函数)
- 数据轻松切割:使用 Oracle 解决方案(oracle数据切割)
- Oracle数据库触发器类型简介(oracle触发器类型)
- Oracle数据库聘用:机会等待你来把握(oracle数据库招聘)
- Oracle 引入新技术,优化大表更新问题。(oracle更新大表)
- 利用Oracle多表索引实现数据优化(oracle多表索引)
- 用友与Oracle共同开创新时代(用友oracle)
- Oracle数据库优化存储过程研究(oracle优化存储过程)
- 利用Oracle数据表轻松优化空间占用(oracle数据表大小)
- 使用Oracle内连接关键字组织数据库结构(oracle内连接关键字)
- Oracle使用关联删除语句删除记录(oracle关联删除语句)
- C语言操作Oracle视图一种实现方式(c 调用oracle视图)
- 如何使用C语言连接Oracle数据库(c 代码链接oracle)
- 数据使用CMD命令备份Oracle数据库(cmd oracle备份)
- 使用Oracle让iJ变得更加优秀(ij使用oracle)
- Oracle主服务器IP探索一段创新之旅(oracle主服务器ip)
- Oracle事务日志清理一种优化数据库性能的方法(oracle事物日志清理)
- 器Oracle采用最佳编辑器之旅(oracle使用什么编辑)
- Oracle数据库优化搜索无压力(oracle优化搜索)
- Oracle中使用注释让程序更易阅读(oracle 中注释)
- Oracle中改变主机名的步骤(oracle中改变主机名)
- Oracle中启动Job的简单方法(oracle中启动job)
- 在Oracle中使用循环实现更多功能(oracle中写循环)
- Oracle求两列和的方式总结(oracle 两列求和6)
- Oracle中使用上取整函数实现数值四舍五入(oracle 上取整函数)
- Oracle Flume带来的变革轻松解决大数据问题(oracle flume)
- 掌握Oracle EBS的使用技巧,完成更多任务(oracle ebs使用)