通过调整表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 ...
随机推荐
- SDPLR的安装过程(matlab)
SDPLR 半正定规划优化工具的安装过程很简单,只要按照SDPLR 1.03-beta User's Guide (short version).pdf的介绍安装就可以. 运行在下载的工具包目录里运行 ...
- js函数参数设置默认值
php有个很方便的用法是在定义函数时可以直接给参数设默认值,如: function simue ($a=1,$b=2){ return $a+$b;}echo simue(); //输出3echo ...
- 27 Best Free Eclipse Plug-ins for Java Developer to be Productive
Eclipse offers an integrated development environment having an extensible plug-in system. This enabl ...
- Web开发,如何从小工到专家
最近在研读关于“整体性学习”的一些东西,收获颇丰. 整体性学习强调的东西有三样:结构.模型.与高速通道.特别是关于结构的篇章: 理解是什么?理解就是结构高度发达完善的结果. 是不是有些学科你可以轻松“ ...
- Java反射机制学习
Java 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”. 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答 ...
- IOS开发之UINavigationController详解
UINavigationController是IOS编程中比较常用的一种容器view controller,很多系统的控件(如UIImagePickerViewController)以及很多有名的AP ...
- CentOS源码安装搭建LNMP全过程(包括nginx,mysql,php,svn)【转】
转自:http://blog.csdn.net/yanzi1225627/article/details/49123659 服务器环境为:CentOS6.5 64位 目标:搭建LNMP(Linux + ...
- PowerShell常用的.Net 、COM对象(New-Object、Assembly)、加载程序集
#新建随机数对象实例:$Ran = New-Object System.Random$Ran.NextDouble() 有时候,要使用的实例的类保存在独立的库文件中,PowerShell默认未加载,会 ...
- 像C++一样写JavaScript
像C++一样写JavaScript C/C++/Java的include或import可以引用第3方文件和包. 这个功能在Html/Js里没有默认的实现. 假设我们有这样一个HTML文件index.h ...
- 底部菜单栏(三)Fragment+FragmentTabHost实现仿新浪微博底部菜单栏
一.实现效果图 二.项目工程结构 三.详细代码编写 1.主tab布局界面,main_tab_layout: 双击代码全选 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...