优化案例--改写IN条件为INNER JOIN
--======================================
--原始语句
SET STATISTICS IO ON
SELECT COUNT(DISTINCT parent_commender_id) AS COUNT
FROM t_commend_day_total_info c WITH(NOLOCK)
WHERE 1 = 1
AND c.product_id IN (1,2,4,5,6,7,8,9)
AND parent_commender_id IN (
SELECT id
FROM t_commender_user_property
WHERE status=4)
AND parent_commender_id IN (
SELECT id
FROM t_commender_user_property
WHERE cooperation_way=0)
AND c.datetime >= 20140103
AND c.datetime <= 20140103
/*
(1 行受影响)
表 'Worktable'。扫描计数 1,逻辑读取 883 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 't_commender_user_property'。扫描计数 2,逻辑读取 38 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 't_commend_day_total_info'。扫描计数 200,逻辑读取 398042 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
*/
/*
--===================================
--由于满足以下条件中一个或多个
--1.条件IN中外部数据与子查询数据是一对一的关系
--2.对查询结果排重
--因此可以将IN条件改写为INNDE JOIN
--===================================
--==================================
--改写后语句
SET STATISTICS IO ON
SELECT COUNT(DISTINCT parent_commender_id) AS COUNT
FROM t_commend_day_total_info c WITH(NOLOCK)
INNER JOIN t_commender_user_property T1
ON T1.id=parent_commender_id
WHERE T1.status=4 AND T1.cooperation_way=0
AND c.product_id IN (1,2,4,5,6,7,8,9)
AND c.datetime >= 20140103
AND c.datetime <= 20140103
/*
表 't_commender_user_property'。扫描计数 1,逻辑读取 19 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 't_commend_day_total_info'。扫描计数 1,逻辑读取 2082 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
*/
/*
在将IN条件改成INNER JOIN 时,一定要考虑数据是一对一还还是一对多以及多对一的关系, 如果是一对多的关系,需要对查询结果集排重。
如果除IN条件外的条件可以过滤掉大部分数据,则考虑使用IN 如果需要依赖IN条件来过滤大部分数据,则考虑使用INNER JOIN 在改写语句前需检查统计是否过期,预估执行行数和实际执行行数之间差距。
优化案例--改写IN条件为INNER JOIN的更多相关文章
- 数栈SQL优化案例:隐式转换
MySQL是当下最流行的关系型数据库之一,互联网高速发展的今天,MySQL数据库在电商.金融等诸多行业的生产系统中被广泛使用. 在实际的开发运维过程中,想必大家也常常会碰到慢SQL的困扰.一条性能不好 ...
- Hive优化案例
1.Hadoop计算框架的特点 数据量大不是问题,数据倾斜是个问题. jobs数比较多的作业效率相对比较低,比如即使有几百万的表,如果多次关联多次汇总,产生十几个jobs,耗时很长.原因是map re ...
- 记一次mysql多表查询(left jion)优化案例
一次mysql多表查询(left jion)优化案例 在新上线的供需模块中,发现某一个查询按钮点击后,出不来结果,找到该按钮对应sql手动执行,发现需要20-30秒才能出结果,所以服务端程序判断超时, ...
- mysql优化案例
MySQL优化案例 Mysql5.1大表分区效率测试 Mysql5.1大表分区效率测试MySQL | add at 2009-03-27 12:29:31 by PConline | view:60, ...
- MySQL的索引单表优化案例分析
建表 建立本次优化案例中所需的数据库及数据表 CREATE DATABASE db0206; USE db0206; CREATE TABLE `db0206`.`article`( `id` INT ...
- 数据库优化案例——————某市中心医院HIS系统
记得在自己学习数据库知识的时候特别喜欢看案例,因为优化的手段是容易掌握的,但是整体的优化思想是很难学会的.这也是为什么自己特别喜欢看案例,今天也开始分享自己做的优化案例. 最近一直很忙,博客产出也少的 ...
- 条件放在left join后面和where后面
有这样一个查询的差异: 两张表如下: 语句在这里: create table #AA ( ID int, Name nvarchar() ) insert into #AA ,'项目1' union ...
- SQL 优化案例 1
create or replace procedure SP_GET_NEWEST_CAPTCHA( v_ACCOUNT_ID in VARCHAR2, --接收短信的手机号 v_Tail_num i ...
- 老李案例分享:Weblogic性能优化案例
老李案例分享:Weblogic性能优化案例 POPTEST的测试技术交流qq群:450192312 网站应用首页大小在130K左右,在之前的测试过程中,其百用户并发的平均响应能力在6.5秒,性能优化后 ...
随机推荐
- 一分钟学会 ConstraintLayout 之从属性角度理解布局
ConstraintLayout 在 Android 开发中,我们通常是手写布局,很少会用拖动来写布局,虽然 ConstraintLayout 在 I/O 上以拖动来展现了各种功能,我估计在以后开发中 ...
- 流程管理软件(BPM)功能简介
易协流程管理系统实现将人为控制的业务活动,通过信息化手段实现系统控制,降低人为控制管理的风险以及促进企业的各项决策方针的顺利实施. 系统目标: 实现管理的规范化.制度化.程序化: 帮助企业将内控制度流 ...
- C#条形码生成(五)----Web下的测试
Html部分 <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server" ...
- 基于 DirectX11 的 MMDViewer 03-渲染管线
准备工作: 开始搭建框架之前,你需要确保已经进行了 D3D 开发环境的搭建,相关教程可以阅读这篇文章.不了解 DirectX11 的人,这个作者有关 DirectX11 的教程最好阅读一下,虽然文章不 ...
- Ubuntu更新命令 <转>
apt-cache search package 搜索包 apt-cache show package 获取包的相关信息,如说明.大小.版本等 sudo apt-get install package ...
- Spring 学习记录6 BeanFactory(2)
主题 除了Spring 学习记录5 BeanFactory 里写的几个接口外,BeanFactory的实现类还实现了一些其他接口,这篇文章主要介绍这些接口和实现类. 结构 DefaultListabl ...
- springMVC环境搭建(1)
工作一年以来,写的都是.net,最近比较闲,想把之前学过的java相关的东西捡起来,也学点新的东西.以前做过SSH架构,一直好奇spring mvc是怎么样的,所以今天试试看. 总体的代码结构 手动输 ...
- FreeSWITCH 客户端fs_cli连接设置(acl)
FreeSWITCH 默认配置只能 在本机连接, 要从 外面连接, 就要配置: acl.conf.xml::network-lists/list event_socket.conf.xml::appl ...
- GLSL in ShaderLab
[Syntax] However, use of raw GLSL is only recommended for testing, or when you know you will only ta ...
- Scala基础:闭包、柯里化、隐式转换和隐式参数
闭包,和js中的闭包一样,返回值依赖于声明在函数外部的一个或多个变量,那么这个函数就是闭包函数. val i: Int = 20 //函数func的方法体中使用了在func外部定义的变量 那func就 ...