pg执行计划分析小笔记
开发同事问,为什么一个标量子查询,放在where子句后进行大小判断,比不放在where子句后进行判断大小运行的更快?按道理加了一次判断,不是应该变慢么?
把语句拿过来,看了一下两个语句的执行计划:
语句1和执行计划1:
SELECT A.*,
/*剩余量*/
(A.q_basic -
(SELECT COALESCE(SUM(d.q_basic), 0.00)
FROM e_order d
WHERE CAST(d.r_item AS INT) = A.ID
AND d.req_status NOT IN ('FZ'))) AS surplus
FROM e_order A
LEFT JOIN e_requirement b
ON A.requirement_no = b.requirement_no
LEFT JOIN erp_project C
ON b.factory = C.project_no
WHERE 1 = 1
AND A.status IN ('WC')
AND (A.q_basic -
(SELECT COALESCE(SUM(d.q_basic), 0.00)
FROM e_order d
WHERE CAST(d.r_item AS INT) = A.ID
AND d.req_status NOT IN ('FZ'))) > 0.00
AND (C.project_name LIKE CONCAT('%', 'csg18098', '%') OR
C.project_no LIKE CONCAT('%', 'csg18098', '%'))
AND A.requirement_no LIKE CONCAT('%', '0000004390', '%');

语句2和执行计划2:
SELECT A.*,
/*剩余量*/
(A.q_basic -
(SELECT COALESCE(SUM(d.q_basic), 0.00)
FROM e_order d
WHERE CAST(d.r_item AS INT) = A.ID
AND d.req_status NOT IN ('FZ'))) AS surplus
FROM e_order A
LEFT JOIN e_requirement b
ON A.requirement_no = b.requirement_no
LEFT JOIN erp_project C
ON b.factory = C.project_no
WHERE 1 = 1
AND A.status IN ('WC')
AND (C.project_name LIKE CONCAT('%', 'csg18098', '%') OR
C.project_no LIKE CONCAT('%', 'csg18098', '%'))
AND A.requirement_no LIKE CONCAT('%', '0000004390', '%')

从上面的执行计划看,在where之后进行大小判断后,执行时间是662.954 ms;去掉判断后执行时间是1549.644 ms。的确如开发所说。
现在分别来看上面的两个执行计划。
语句1在where子句后增加判断,表关联的顺序是((((a,d_1),b),c),d)。语句2不在where子句后加判断的关联顺序是(((a,b),c),d)。
其实这里d_1就是表示在where子句后的表e_order。这一点,可以将语句修改一下,就可以得到验证:
SELECT A.*,
/*剩余量*/
(A.q_basic -
(SELECT COALESCE(SUM(d.q_basic), 0.00)
FROM e_order d
WHERE CAST(d.r_item AS INT) = A.ID
AND d.req_status NOT IN ('FZ'))) AS surplus
FROM e_order A
LEFT JOIN e_requirement b
ON A.requirement_no = b.requirement_no
LEFT JOIN erp_project C
ON b.factory = C.project_no
WHERE 1 = 1
AND A.status IN ('WC')
AND (A.q_basic -
(SELECT COALESCE(SUM(e.q_basic), 0.00)
FROM e_order e
WHERE CAST(e.r_item AS INT) = A.ID
AND e.req_status NOT IN ('FZ'))) > 0.00
AND (C.project_name LIKE CONCAT('%', 'csg18098', '%') OR
C.project_no LIKE CONCAT('%', 'csg18098', '%'))
AND A.requirement_no LIKE CONCAT('%', '0000004390', '%');

修改后,关联的顺序就是表关联的顺序是((((a,e),b),c),d)。故d_1就是表示在where子句后的表e_order。
回看执行计划1,可以看到很多关键字(never executed)。其实在执行计划1中,(a,d_1)两个表关联后,返回的行数是0,所以之后加入连接的表其实并未执行实际连接操作,即b,c,d并未真的执行join操作。这个语句执行(a,d_1)两个表关联后就结束了。
而在where子句后删除对子查询结果大小判断后,表的连接顺序是(((a,b),c),d)。从执行计划2中可以看到,每个表都参与的join操作后,整个语句才执行结束。因此,时间比第一个执行计划的时间长了。
这里,子查询结果判断后返回的结果是0行。如果,不是0行呢?
我们把语句1中>0.00换成=0.000000,看看执行计划:

这个执行计划3,就比执行计划1和执行计划2都慢了。
pg执行计划分析小笔记的更多相关文章
- SQLServer查询执行计划分析 - 案例
SQLServer查询执行计划分析 - 案例 http://pan.baidu.com/s/1pJ0gLjP 包括学习笔记.书.样例库
- MySQL学习系列2--MySQL执行计划分析EXPLAIN
原文:MySQL学习系列2--MySQL执行计划分析EXPLAIN 1.Explain语法 EXPLAIN SELECT …… 变体: EXPLAIN EXTENDED SELECT …… 将执行 ...
- MongoDB执行计划分析详解
要保证数据库处于高效.稳定的状态,除了良好的硬件基础.高效高可用的数据库架构.贴合业务的数据模型之外,高效的查询语句也是不可少的.那么,如何查看并判断我们的执行计划呢?我们今天就来谈论下MongoDB ...
- MySQL学习系列2--MySQL执行计划分析EXPLAIN [原创]
1.Explain语法 EXPLAIN SELECT …… 变体: EXPLAIN EXTENDED SELECT …… 将执行计划“反编译”成SELECT语句,运行SHOW WARNINGS 可 ...
- MySQL执行计划分析
原文:MySQL执行计划分析 一. 执行计划能告诉我们什么? SQL如何使用索引 联接查询的执行顺序 查询扫描的数据函数 二. 执行计划中的内容 SQL执行计划的输出可能为多行,每一行代表对一个数据库 ...
- MongoDB干货系列2-MongoDB执行计划分析详解(2)(转载)
写在之前的话 作为近年最为火热的文档型数据库,MongoDB受到了越来越多人的关注,但是由于国内的MongoDB相关技术分享屈指可数,不少朋友向我抱怨无从下手. <MongoDB干货系列> ...
- oracle sql 执行计划分析
转自http://itindex.net/detail/45962-oracle-sql-%E8%AE%A1%E5%88%92 一.首先创建表 SQL> show user USER is &q ...
- SQL执行计划分析
explain执行计划中的字段以及含义在下面的博客中有详细讲述: https://blog.csdn.net/da_guo_li/article/details/79008016 执行计划能告诉我们什 ...
- mysql系列八、mysql数据库优化、慢查询优化、执行计划分析
mysql的性能优化无法一蹴而就,必须一步一步慢慢来,从各个方面进行优化,最终性能就会有大的提升. 一.介绍 对mysql优化是一个综合性的技术,主要包括 表的设计合理化(符合3NF) 添加适当索引( ...
随机推荐
- Linux理论小结
1.Linux是什么 2.Linux的种类 3.Linux的软件安装方法 4.Linux的软卸载方法 5.Linux的目录功能 1.Linux是什么 2.Linux的种类 3.Linux的软件安装方法 ...
- MYSQL慢查询优化方法及优化原则
1.日期大小的比较,传到xml中的日期格式要符合'yyyy-MM-dd',这样才能走索引,如:'yyyy'改为'yyyy-MM-dd','yyyy-MM'改为'yyyy-MM-dd'[这样MYSQL会 ...
- 【HICP Gauss】数据库 数据库管理(数据库对象 表空间 索引 序列 分区 视图)-8
什么是数据库对象 数据库对象包括 表 索引 分区 视图 序列 同义词 数据库支持对象存储过程 自定义函数 触发器 表空间 高级包 表 数据库中的数据结构 存储数据以及描述数据间的关系 表由行和列组成 ...
- 排序接口与抽象类(java)
定义一个ISort接口,方法有升序(sortAsc),有降序(sortDesc),传入参数是一个实现Comparable接口的对象数组,即不仅仅只对数字排序,还定义了两个默认方法: compare方法 ...
- python使用 pdb 进行调试--- python -m pdb xxx.py 即可 和gdb使用一样
使用 pdb 进行调试 pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点.单步调试.进入函数调试.查看当前代码.查看栈片段.动态改变变 ...
- swagger2 注解说明
整体说明 用于controller类上 注解 说明 @Api 协议集描述 方法上 注解 说明 @ApiOperation - @ApiImplicitParams 方法上 @ApiImplicitPa ...
- member_template_function
#include <iostream> using namespace std; template<class T> class MyClass{ private: T val ...
- xshell连接不上阿里云服务器Could not connect to 'ip' (port 22): Connection failed.解决过程
记一次xshell阿里云服务器突然连接不上的解决办法: 1, 确认阿里云服务器安全组出入都有22,百度出来都说的这个和ip拦截设置,以防万一都设置了:但楼主设置后,还是连不上服务器: 只好下一步 2, ...
- 7-html列表
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- hdu2643&&hdu2512——斯特林数&&贝尔数
hdu2643 题意:$n$ 个人的排名情况数($n \leq 100$) 分析:考虑 $n$ 个有区别的球放到 $m$ 个有区别的盒子里.无空盒的方案数为 $m!\cdot S(n, m)$. 这题 ...