通过调整表union all的顺序优化SQL
操作系统:Windows XP
数据库版本:SQL Server 2005
今天遇到一个SQL,过滤条件是自动生成的,因此,没法通过调整SQL的谓词达到优化的目的,只能去找SQL中的“大表”。有一个视图返回的结果集比较大,如果能调整的话,也只能调整该视图了。
看了一下该视图的结构,里面还套用了另一层视图,直接看最里层视图的查询SQL。
SELECT a.dfeesum_no ,
a.opr_amt - ISNULL(b.dec_pay, 0) - ISNULL(b.dec_corrpay, 0)
- ISNULL(b.dec_deduamt, 0) dec_amt ,
a.dec_camt - ISNULL(b.dec_pay, 0) - a.dec_comprate
* ISNULL(b.dec_deduamt, 0) dec_compamt ,
a.dec_ramt - ISNULL(b.dec_corrpay, 0) - ( a.dec_comprate - 1 )
* ISNULL(b.dec_deduamt, 0) dec_corramt ,
a.dec_qty - ISNULL(b.dec_qty, 0) - ISNULL(b.dec_deduqty, 0) opr_qty ,
ISNULL(b.dec_pay, 0) dec_pay ,
ISNULL(b.dec_corrpay, 0) dec_corrpay ,
ISNULL(b.dec_deduqty, 0) dec_deduqty ,
ISNULL(b.dec_deduamt, 0) dec_deduamt ,
ISNULL(b.dec_qty, 0) dec_qty
FROM ctlm8686 a
LEFT JOIN ( SELECT dfeesum_no ,
SUM(dec_ramt) dec_pay ,
SUM(dec_corramt) dec_corrpay ,
SUM(dec_qty) dec_qty ,
SUM(CASE WHEN flag_dedu = '1' THEN dec_deduamt
ELSE 0
END) dec_deduamt ,
SUM(CASE WHEN flag_dedu = '1' THEN dec_deduqty
ELSE 0
END) dec_deduqty
FROM dfeepay_03
GROUP BY dfeesum_no
) b ON a.dfeesum_no = b.dfeesum_no
UNION ALL
SELECT a.dfeesum_no ,
a.dec_amt - ISNULL(b.dec_pay, 0) - ISNULL(b.dec_corrpay, 0)
- ISNULL(b.dec_deduamt, 0) dec_amt ,
a.dec_compamt - ISNULL(b.dec_pay, 0) - a.dec_comprate
* ISNULL(b.dec_deduamt, 0) dec_compamt ,
a.dec_corramt - ISNULL(b.dec_corrpay, 0) - ( a.dec_comprate - 1 )
* ISNULL(b.dec_deduamt, 0) dec_corramt ,
a.opr_qty - ISNULL(b.dec_qty, 0) - ISNULL(b.dec_deduqty, 0) opr_qty ,
ISNULL(b.dec_pay, 0) dec_pay ,
ISNULL(b.dec_corrpay, 0) dec_corrpay ,
ISNULL(b.dec_deduqty, 0) dec_deduqty ,
ISNULL(b.dec_deduamt, 0) dec_deduamt ,
ISNULL(b.dec_qty, 0) dec_qty
FROM dfeeapp_03 a
LEFT JOIN ( SELECT dfeesum_no ,
SUM(dec_ramt) dec_pay ,
SUM(dec_corramt) dec_corrpay ,
SUM(dec_qty) dec_qty ,
SUM(CASE WHEN flag_dedu = '1' THEN dec_deduamt
ELSE 0
END) dec_deduamt ,
SUM(CASE WHEN flag_dedu = '1' THEN dec_deduqty
ELSE 0
END) dec_deduqty
FROM dfeepay_03
GROUP BY dfeesum_no
) b ON a.dfeesum_no = b.dfeesum_no
返回结果集有1433891行,其中
SELECT COUNT(*) FROM dfeepay_03 --1103914
SELECT COUNT(*) FROM ctlm8686 --1131586
SELECT COUNT(*) FROM dfeeapp_03--302305
上述SQL脚本中,子查询是相同的,即对子查询进行了两次扫描,可以考虑先让dfeeapp_03和ctlm8686union all,再left join dfeepay_03 。同时,对于子查询,先让dfeepay_03 表先查询出flag_dedu = '1'的数据,就不用再进行case when判断了。
改写后的SQL如下
SELECT a.dfeesum_no ,
a.opr_amt - ISNULL(b.dec_pay, 0) - ISNULL(b.dec_corrpay, 0)
- ISNULL(b.dec_deduamt, 0) dec_amt ,
a.dec_camt - ISNULL(b.dec_pay, 0) - a.dec_comprate
* ISNULL(b.dec_deduamt, 0) dec_compamt ,
a.dec_ramt - ISNULL(b.dec_corrpay, 0) - ( a.dec_comprate - 1 )
* ISNULL(b.dec_deduamt, 0) dec_corramt ,
a.dec_qty - ISNULL(b.dec_qty, 0) - ISNULL(b.dec_deduqty, 0) opr_qty ,
ISNULL(b.dec_pay, 0) dec_pay ,
ISNULL(b.dec_corrpay, 0) dec_corrpay ,
ISNULL(b.dec_deduqty, 0) dec_deduqty ,
ISNULL(b.dec_deduamt, 0) dec_deduamt ,
ISNULL(b.dec_qty, 0) dec_qty
FROM ( SELECT a.dfeesum_no ,
a.opr_amt ,
a.dec_camt ,
a.dec_comprate ,
a.dec_ramt ,
a.dec_qty
FROM ctlm8686 a
UNION ALL
SELECT a.dfeesum_no ,
a.dec_amt ,
a.dec_compamt ,
a.dec_comprate ,
a.dec_corramt ,
a.opr_qty
FROM dfeeapp_03 a
) a
LEFT JOIN ( SELECT dfeesum_no ,
SUM(dec_ramt) dec_pay ,
SUM(dec_corramt) dec_corrpay ,
SUM(dec_qty) dec_qty ,
SUM(dec_deduamt) dec_deduamt,
SUM(dec_deduqty) dec_deduqty
FROM dfeepay_03
WHERE flag_dedu = '1'
GROUP BY dfeesum_no
) b ON a.dfeesum_no = b.dfeesum_no
跑这个视图的查询语句,从原来的一分半钟降到一分钟,对于整个SQL而言,则从原来跑几分钟的直接10S出结果。
通过调整表union all的顺序优化SQL的更多相关文章
- sql语句优化SQL Server
MS SQL Server查询优化方法查询速度慢的原因很多,常见如下几种 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了 ...
- mysql优化SQL语句的一般步骤及常用方法
一.优化SQL语句的一般步骤 1. 通过show status命令了解各种SQL的执行频率 mysqladmin extended-status 或: show [session|global]sta ...
- 转载 50种方法优化SQL Server数据库查询
原文地址 http://www.cnblogs.com/zhycyq/articles/2636748.html 50种方法优化SQL Server数据库查询 查询速度慢的原因很多,常见如下几种: 1 ...
- MySQL查询不使用索引汇总 + 如何优化sql语句
不使用索引原文 : http://itlab.idcquan.com/linux/MYSQL/918330.html MySQL查询不使用索引汇总 众所周知,增加索引是提高查询速度的有效途径,但是很多 ...
- 浅谈MySQL中优化sql语句查询常用的30种方法 - 转载
浅谈MySQL中优化sql语句查询常用的30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使 ...
- mysql优化sql语句
mysql优化sql语句 常见误区 www.2cto.com 误区1: count(1)和count(primary_key) 优于 count(*) 很多人为了统计记录条数,就使 ...
- 数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优.但是一些"不好"的SQL也会导致数据库查询变慢,影响业务流程.本文从SQL角度进行数据库优化,提升SQ ...
- 转载 数据库优化 - SQL优化
判断问题SQL判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象CPU消耗严重IO等待严重页面响应时间过长应用的日志出现超时等错误可以使用sar命令,top命令查看当前系统状态. 也可以通 ...
- MySql(五)SQL优化-优化SQL语句的一般步骤
MySql(五)SQL优化-优化SQL语句的一般步骤 一.优化SQL语句的一般步骤 1.1 通过show status命令了解各种SQL的执行频率 1.2 定位执行效率较低的SQL语句 1.3 通过e ...
随机推荐
- 数学类杂志SCI2013-2014影响因子
ISSN Abbreviated Journal Title Full Title Category Subcategory Country total Cites IF 2013-20 ...
- ASCII,Unicode和UTF-8字符编码
ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte).也就是 ...
- 破解安装 SecureCRT 7.0.2 for mac完美破解版,mac secureCRT , apple secureCRT
mac secureCRT , apple secureCRT 下载地址:http://download.csdn.net/detail/guolichun/7733069 破解安装 SecureC ...
- Android核心基础(手机卫士的一个知识点总结)
注意:有些功能是需要权限的,在这里并没有写出来,在程序运行中,根据程序报的错误,添加相应的权限即可,里面的具体里面可能有一些小细节,没有明确的写出来,具体的需要在程序中自己调试,解决. 这个总结涵盖了 ...
- lightoj 1094 Farthest Nodes in a Tree 【树的直径 裸题】
1094 - Farthest Nodes in a Tree PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: ...
- HighCharts 后台加载数据的时候去掉默认的 series
var chart; var options = { chart: { renderTo: 'container', type:'line' }, title: { text: '历史趋势时序图', ...
- 探讨Web组件化的实现
CMS组件化,简单架构示意图: Web组件使用WebPage+WebAPI的好处: Ø 组件复用(组件条件管理页面复用+获取组件数据API复用). Ø 组件是分布式的第三方应用,本身高内聚.组件之 ...
- listview加载图片显示
Adapter: ---- //adapter的构造方法: 参数1 为url数组: public static String[] mList;// 讲url保村在静态的String[] 中 在 ...
- LINUX下mysql的大小写是否区分设置 转
一.Linux中MySQL大小写详情:1.数据库名严格区分大小写2.表名严格区分大小写的3.表的别名严格区分大小写4.变量名严格区分大小写5.列名在所有的情况下均忽略大小写6.列的别名在所有的情况下均 ...
- NOIP-2003 加分二叉树
题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都 ...