# 标量子查询优化（用group by 代替distinct）

标量子查询优化

explain plan for SELECT B.EMP_NO,
B.CUST_NO,
B.CUST_NAME,
A.CARD_NO,
A.TRANS_AMT,
A.TRANS_ATTR,
/*(0 ?? 1 鲁盲 2 鲁盲?禄?4 ??)*/
A.TRANS_TIME,
A.SEQNO,
A.OLD_TRANSDATE
FROM (SELECT * FROM DWF.F_EVT_REAL_JOURLIST WHERE TRANS_TYPE = '00') A
LEFT JOIN (SELECT AGMT_ID,
CUST_MAGR EMP_NO,
CUST_NO,
(SELECT DISTINCT PTY_NAME
FROM DWF.F_PTY_TABLE
WHERE PTY_ID = A.CUST_NO
AND START_DT <= TO_DATE('2012-09-30', 'YYYY-MM-DD')
AND END_DT > TO_DATE('2012-09-30', 'YYYY-MM-DD')) CUST_NAME
WHERE START_DT <= TO_DATE('2012-09-30', 'YYYY-MM-DD')
AND END_DT > TO_DATE('2012-09-30', 'YYYY-MM-DD')) B ON A.CARD_NO =
B.AGMT_ID;
--220109

SELECT AGMT_ID,
CUST_MAGR EMP_NO,
CUST_NO,
(SELECT DISTINCT PTY_NAME
FROM DWF.F_PTY_TABLE
WHERE PTY_ID = A.CUST_NO
AND START_DT <= TO_DATE('2012-09-30', 'YYYY-MM-DD')
AND END_DT > TO_DATE('2012-09-30', 'YYYY-MM-DD')) CUST_NAME
WHERE START_DT <= TO_DATE('2012-09-30', 'YYYY-MM-DD')
AND END_DT > TO_DATE('2012-09-30', 'YYYY-MM-DD')

###########################################################################################################################
Plan hash value: 579615344

---------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation		         | Name		         | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |  OMem |  1Mem | Used-Mem |
---------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT	         |			 |	1 |	     |	  220K|00:00:12.12 |	 781K|	  280K|       |       |       |
|   1 |  SORT UNIQUE		         |			 |155K    |	   1 |	  155K|00:00:06.52 |	 501K|	 2882 |  2048 |  2048 | 2048  (0)|
|*  2 |   TABLE ACCESS BY INDEX ROWID    | F_PTY_TABLE	         |155K    |	   1 |	  155K|00:00:05.41 |	 501K|	 2882 |       |       |       |
|*  3 |    INDEX RANGE SCAN	         | SYS_C0052731	         |155K    |	   1 |	  188K|00:00:04.17 |	 313K|	  448 |       |       |       |
|*  4 |  HASH JOIN OUTER	         |			 |      1 |	1399K|	  220K|00:00:12.12 |	 781K|	  280K|    20M|  2674K|   25M (0)|
|*  5 |   TABLE ACCESS FULL	         | F_EVT_REAL_JOURLIST   |  1     |	 145K|	  220K|00:00:00.08 |	7904 |	 7900 |       |       |       |
|   6 |   VIEW			         |			 |      1 |	3929K|	  204K|00:00:11.54 |	 773K|	  272K|       |       |       |
|*  7 |    TABLE ACCESS FULL	         | F_AGT_CADB_BOOK_H     |      1 |	3929K|	  204K|00:00:04.68 |	 272K|	  270K|       |       |       |
--------------------------------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - filter("END_DT">TO_DATE(' 2012-09-30 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
3 - access("PTY_ID"=:B1 AND "START_DT"<=TO_DATE(' 2012-09-30 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
filter("START_DT"<=TO_DATE(' 2012-09-30 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
4 - access("F_EVT_REAL_JOURLIST"."CARD_NO"="B"."AGMT_ID")
5 - filter("TRANS_TYPE"='00')
7 - filter(("START_DT"<=TO_DATE(' 2012-09-30 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "END_DT">TO_DATE(' 2012-09-30 00:00:00',
'syyyy-mm-dd hh24:mi:ss')))

43 rows selected.

###########################################################################################
SELECT b.emp_no,
b.cust_no,
b.cust_name,
a.card_no,
a.trans_amt,
a.trans_attr,
a.trans_time,
a.seqno,
a.old_transdate
FROM (SELECT * FROM dwf.f_evt_real_jourlist WHERE trans_type = '00') a
LEFT JOIN (SELECT agmt_id,
cust_magr    emp_no,
cust_no,
c_n.pty_name AS cust_name
LEFT JOIN (SELECT pty_name, pty_id
FROM dwf.f_pty_table
WHERE start_dt <=
to_date('2012-09-30', 'YYYY-MM-DD')
AND end_dt > to_date('2012-09-30', 'YYYY-MM-DD')
GROUP BY pty_name, pty_id) c_n
ON c_n.pty_id = a.cust_no
WHERE start_dt <= to_date('2012-09-30', 'YYYY-MM-DD')
AND end_dt > to_date('2012-09-30', 'YYYY-MM-DD')) b
ON a.card_no = b.agmt_id;



• 本文已收录于以下专栏：

## MySQL查询子句（group by,limit,union,order by等）

Order by按照字段值进行排序，默认升序(asc)。校对规则决定排序关系。 order by 字段 升序|降序（asc|desc）,Order by允许多字段排序。 指的是，先按第一个字段排序...

QGIS中快速建立金字塔

## mysql GROUP BY 代替DISTINCT 遇到的问题及解决

mysql上group by 代替distinct 分析及实现
• Veebo
• 2016年07月09日 19:22
• 608

## 解析mysql中:单表distinct、多表group by查询去除重复记录

• Hollboy
• 2014年02月24日 10:45
• 862

## 通过转成SQL来进行查询，解决hql不能在distinct，group by结果集上使用count的问题

public Long getDataTotal(String hql,Map alias,Object[] args) { QueryTranslatorImpl queryTranslato...

## distinct 和 group by 在查询多列数据去重复时的区别在哪？

distinct 和 group by 在查询多列数据去重复时的区别在哪？ [问题点数：40分，结帖人luxer_1985]             不显示删除回复           显示所...

## group by与distinct效率分析及优化措施

举报原因： 您举报文章：标量子查询优化（用group by 代替distinct） 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)