标量子查询优化(用group by 代替distinct)
标量子查询优化 当使用另外一个SELECT 语句来产生结果中的一列的值的时候,这个查询必须只能返回一行一列的值。这种类型的子查询被称为标量子查询 在某些情况下可以进行优化以减少标量子查询的重复执行,但更糟糕的场景是每一行都需要标量子查询的执行。 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
FROM DWF.F_AGT_CADB_BOOK_H A
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
FROM DWF.F_AGT_CADB_BOOK_H A
WHERE START_DT <= TO_DATE('2012-09-30', 'YYYY-MM-DD')
AND END_DT > TO_DATE('2012-09-30', 'YYYY-MM-DD')
查询返回了204947条记录 ###########################################################################################################################
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.
此时对F_PTY_TABLE索引扫描了155K次,回表了155K次 这种效率能高吗?
改写为关联
###########################################################################################
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
FROM dwf.f_agt_cadb_book_h a
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; 这里巧妙的运用了group by 来去除重复数据,像伟大的教主致敬.
标量子查询优化(用group by 代替distinct)的更多相关文章
- 【MySQL】MySQL中针对大数据量常用技术_创建索引+缓存配置+分库分表+子查询优化(转载)
原文地址:http://blog.csdn.net/zwan0518/article/details/11972853 目录(?)[-] 一查询优化 1创建索引 2缓存的配置 3slow_query_ ...
- postgresql子查询优化(提升子查询)
问题背景 在开发项目过程中,客户要求使用gbase8s数据库(基于informix),简单的分页页面响应很慢.排查发现分页sql是先查询出数据在外面套一层后再取多少条,如果去掉嵌套的一层,直接获取则很 ...
- 子查询优化 - Hyper
Unnesting Arbitrary Queries - T Neumann, A KemperThe Complete Story of Joins (in HyPer) - Thomas Neu ...
- Mysql单表访问方法,索引合并,多表连接原理,基于规则的优化,子查询优化
参考书籍<mysql是怎样运行的> 非常推荐这本书,通俗易懂,但是没有讲mysql主从等内容 书中还讲解了本文没有提到的子查询优化内容, 本文只总结了常见的子查询是如何优化的 系列文章目录 ...
- 优化有标量子查询的SQL
数据库环境:SQL SERVER 2008R2 今天在数据库中抓出一条比较耗费资源的SQL,只返回904条数据,居然跑了40多分钟.SQL及对应的数据量如下图: SELECT saft04.cur_y ...
- [20180626]函数与标量子查询14.txt
[20180626]函数与标量子查询14.txt --//前面看http://www.cnblogs.com/kerrycode/p/9099507.html链接,里面提到: 通俗来将,当使用标量子查 ...
- SELECT列表中的标量子查询
发现了一种表连接新的写法,以前还没有这样写过或者见别人写过.跟同学聊天他们公司却很多人这样写,看来真的要学学sql了 表 CREATE TABLE `t_book` ( `FId` ) NOT NUL ...
- WHERE 子句中的标量子查询
标量子查询不仅可以用在SELECT 语句的列表中,它还可以用在WHERE 子句中,而且实际应用中子查询很多的时候都是用在WHERE子句中的. 先来看一个简单的例子,我们要检索喜欢“Story”的读者主 ...
- 彻底搞懂oracle的标量子查询
oracle标量子查询和自己定义函数有时用起来比較方便,并且开发者也常常使用.数据量小还无所谓.数据量大,往往存在性能问题. 下面測试帮助大家彻底搞懂标量子查询. SQL> create tab ...
随机推荐
- C#中的两种debug方法
这篇文章主要介绍了C#中的两种debug方法介绍,本文讲解了代码用 #if DEBUG 包裹.利用宏定义两种方法,需要的朋友可以参考下 第一种:需要把调试方法改成debug代码用 #if DEBU ...
- C#面向对象(二)
一:抽象方法 1. 在面向对象编程语言中抽象方法指一些只有方法声明,而没有具体方法体的方法.抽象方法一般存在于抽象类或接口中. 在一些父类中,某些行为不是非常明确,因此无法用代码来具体实现,但是类还必 ...
- web程序记录当前在线人数
在页面上显示当前在线人数 效果: 1.Global.asax文件: <%@ Application Language="C#" %><%@ Import Name ...
- (转)javascript中的this
JavaScript中的this总是让人迷惑,应该是js众所周知的坑之一. 个人也觉得js中的this不是一个好的设计,由于this晚绑定的特性,它可以是全局对象,当前对象,或者…有人甚至因为坑大而不 ...
- C#语法糖之第三篇: 匿名类 & 匿名方法
今天时间有点早,所以上来在写一篇文章吧,继续上一篇的文章,在我们平时编程过程中有没有遇到过这样的一个情景,你定义的类只是用来封装一些相关的数据,但并不需要相关联的方法.事件和其他自定义的功能.同时,这 ...
- iOS 正则表达式-判断邮箱、手机号
判断是否是邮箱 -(BOOL)isValidateEmail:(NSString *)email { NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[ ...
- O-C相关04:类方法的概述与定义和调用
类方法的概述与定义和调用 1, 类方法的概述 类方法(class method)在其他编程语言中常常称为静态方法(例如 Java 或 C# 等). 与实例方法不同的是,类方法只需要使用类名即可调用, ...
- 初尝 MVC4
文章内容参考 http://www.cnblogs.com/leoo2sk/archive/2008/10/27/1320285.html 开发环境 VS2010 ,VS2010 开发 MVC4 需下 ...
- Linq XML
写得比较啰嗦,自己记载备用 1 public class XmlFunction 2 { 3 private static XDocument _doc = new ...
- ES 中文分词
一.大名鼎鼎的中文插件IK的安装配置 1. 在插件目录中建立IK的目录 mkdir $ES_HOME/plugins/analysis-ik 2. 下载IK 的类库jar 文件到IK目录 cd $ES ...