sql中用EXISTS替代IN、用NOT EXISTS替代NOT IN显著变化
sql如下所示:
SELECT SUM(T.F1), SUM(T.F2), SUM(T.F3), SUM(T.F4), SUM(T.F5), SUM(T.F6), SUM(T.F7), SUM(T.F8), SUM(T.F9), SUM(T.F10), SUM(T.F11), SUM(T.F12)
INTO V_CONT_RECORD
FROM (SELECT SUM(DECODE(BF.FLOOR_NUM, '-1', COUNT(*), 0)) F1, SUM(DECODE(BF.FLOOR_NUM, '1', COUNT(*), 0)) F2,
SUM(DECODE(BF.FLOOR_NUM, '2', COUNT(*), 0)) F3, SUM(DECODE(BF.FLOOR_NUM, '3', COUNT(*), 0)) F4,
SUM(DECODE(BF.FLOOR_NUM, '4', COUNT(*), 0)) F5, SUM(DECODE(BF.FLOOR_NUM, '5', COUNT(*), 0)) F6,
SUM(DECODE(BF.FLOOR_NUM, '-1', BS.SQUARE_REAL, 0)) F7, SUM(DECODE(BF.FLOOR_NUM, '1', BS.SQUARE_REAL, 0)) F8,
SUM(DECODE(BF.FLOOR_NUM, '2', BS.SQUARE_REAL, 0)) F9, SUM(DECODE(BF.FLOOR_NUM, '3', BS.SQUARE_REAL, 0)) F10,
SUM(DECODE(BF.FLOOR_NUM, '4', BS.SQUARE_REAL, 0)) F11, SUM(DECODE(BF.FLOOR_NUM, '5', BS.SQUARE_REAL, 0)) F12
FROM BIS_CONT BC
LEFT JOIN BIS_STORE_CONT_REL BSCR ON BC.BIS_CONT_ID = BSCR.BIS_CONT_ID
LEFT JOIN BIS_STORE BS ON BSCR.BIS_STORE_ID = BS.BIS_STORE_ID
LEFT JOIN BIS_FLOOR BF ON BS.BIS_FLOOR_ID = BF.BIS_FLOOR_ID
WHERE BC.CONT_TYPE_CD = '1' --合同类型为租赁
AND BC.STORE_TYPE = '1' --物业类型为购物中心
AND BC.MANAGE_CD='2' --商铺类型为小商铺
AND BC.BIS_PROJECT_ID = P_BIS_PROJECT_ID
AND BC.STATUS_CD ='3'
AND (BF.FLOOR_NUM='-1' OR BF.FLOOR_NUM='1' OR BF.FLOOR_NUM='2' OR
BF.FLOOR_NUM='3' OR BF.FLOOR_NUM='4' OR BF.FLOOR_NUM='5')
AND SUBSTR(BC.PROPORTION_NAMES,0,
DECODE(INSTR(BC.PROPORTION_NAMES, '-', 1, 1),0,LENGTH(BC.PROPORTION_NAMES),
INSTR(BC.PROPORTION_NAMES, '-', 1, 1) - 1)) =V_OPREATE_TYPE
AND P_YMD >= TO_CHAR(BC.RENT_DATE, 'YYYY-MM-DD')
AND ((BC.CONT_TO_FAIL_DATE IS NOT NULL AND
P_YMD <= TO_CHAR(BC.CONT_TO_FAIL_DATE, 'YYYY-MM-DD')) OR
(BC.CONT_TO_FAIL_DATE IS NULL AND
P_YMD <= TO_CHAR(BC.CONT_END_DATE, 'YYYY-MM-DD')))
GROUP BY BF.FLOOR_NUM, BS.SQUARE_REAL
UNION ALL
SELECT SUM(DECODE(BFR.FLOOR_NUM, '-1', COUNT(*), 0)) F1, SUM(DECODE(BFR.FLOOR_NUM, '1', COUNT(*), 0)) F2,
SUM(DECODE(BFR.FLOOR_NUM, '2', COUNT(*), 0)) F3, SUM(DECODE(BFR.FLOOR_NUM, '3', COUNT(*), 0)) F4,
SUM(DECODE(BFR.FLOOR_NUM, '4', COUNT(*), 0)) F5, SUM(DECODE(BFR.FLOOR_NUM, '5', COUNT(*), 0)) F6,
SUM(DECODE(BFR.FLOOR_NUM, '-1', BST.SQUARE_REAL, 0)) F7, SUM(DECODE(BFR.FLOOR_NUM, '1', BST.SQUARE_REAL, 0)) F8,
SUM(DECODE(BFR.FLOOR_NUM, '2', BST.SQUARE_REAL, 0)) F9, SUM(DECODE(BFR.FLOOR_NUM, '3', BST.SQUARE_REAL, 0)) F10,
SUM(DECODE(BFR.FLOOR_NUM, '4', BST.SQUARE_REAL, 0)) F11, SUM(DECODE(BFR.FLOOR_NUM, '5', BST.SQUARE_REAL, 0)) F12
FROM BIS_STORE BST
LEFT JOIN BIS_FLOOR BFR ON BST.BIS_FLOOR_ID = BFR.BIS_FLOOR_ID
WHERE BST.LAYOUT_CD = ITEM
AND (BFR.FLOOR_NUM='-1' OR BFR.FLOOR_NUM='1' OR BFR.FLOOR_NUM='2' OR
BFR.FLOOR_NUM='3' OR BFR.FLOOR_NUM='4' OR BFR.FLOOR_NUM='5')
AND BFR.CHARGE_TYPE='1' --物业类型为购物中心
AND BST.STORE_POSITION='2'--商铺类型为小商铺
AND BST.BIS_PROJECT_ID = P_BIS_PROJECT_ID
AND (BST.SPLIT_STATUS IS NULL OR BST.SPLIT_STATUS = '0')
AND (BST.IF_SUBMIT = '1' OR BST.IF_SUBMIT = '2' OR
BST.IF_SUBMIT IS NULL)
--AND BST.STORE_NO NOT IN
AND NOT EXISTS
(SELECT 1 FROM
BIS_CONT BT LEFT JOIN BIS_STORE_CONT_REL BSCR
ON BT.BIS_CONT_ID = BSCR.BIS_CONT_ID
LEFT JOIN BIS_STORE BSA ON
BSCR.BIS_STORE_ID = BSA.BIS_STORE_ID
WHERE BT.BIS_PROJECT_ID = P_BIS_PROJECT_ID
AND BT.CONT_TYPE_CD = '1' --合同类型为租赁
AND BT.STORE_TYPE = '1' --物业类型为购物中心
AND BT.MANAGE_CD='2' --商铺类型为小商铺
AND BT.STATUS_CD ='3'
AND P_YMD >= TO_CHAR(BT.RENT_DATE, 'YYYY-MM-DD')
AND ((BT.CONT_TO_FAIL_DATE IS NOT NULL AND
P_YMD <= TO_CHAR(BT.CONT_TO_FAIL_DATE, 'YYYY-MM-DD')) OR
(BT.CONT_TO_FAIL_DATE IS NULL AND
P_YMD <= TO_CHAR(BT.CONT_END_DATE, 'YYYY-MM-DD')))
AND BSA.STORE_NO = BST.STORE_NO
)
GROUP BY BFR.FLOOR_NUM, BST.SQUARE_REAL) T;
红色部分是真正的瓶颈所在,这个sql是查询一下项目公司下面的,-1到5楼的商铺的总数,面积等等之类的业务,数据量应该在1000条之内的,这个是运行在procedure里面的,没修改红色之前,需要132s,修改之后在3s内就出来了, 原理如下 :用EXISTS替代IN、用NOT EXISTS替代NOT IN:
在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率. 在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下, NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历) . 为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.
sql中用EXISTS替代IN、用NOT EXISTS替代NOT IN显著变化相关推荐
- sql之嵌套查询中的带exists谓词的子查询
数据库系统概论之嵌套查询中的带exists谓词的子查询 一.exists谓词概述:exists谓词代表存在量词.带有exists谓词的子查询不返回任何数据,只产生逻辑真值"true" ...
- sql中 in 、not in 、exists、not exists 用法和差别
exists (sql 返回结果集为真) not exists (sql 不返回结果集为真) 如下: 表A ID NAME 1 A1 2 A2 3 A3 表B ID AID NAME 1 ...
- sql语句里面最难的not exists,exists,口语化解释(个人笔记)
文章目录 1.查询选修了所有课程的学生 2.查询至少选修了课程号为1,2的学生 3.思考一下where是如何筛选记录的 4.exists的返回的是boolean值 5.对查询选修了所有课程的学生的sq ...
- 关于Oracle中in,exists 与 not in, not exists
文章简要的讨论了in,exists 与 not in, not exists在使用中的问题,主要是关键字的选择,SQL的优化 *注:下面示例都是用Oracle内置用户的表,如果安装Oracle时没有选 ...
- Laravel Base table or view already exists: 1050 Table 'users' already exists
PS D:\phpStudy\WWW\BCCAdminV1.0> php artisan migrate [Illuminate\Database\QueryException] SQLSTAT ...
- 用正则表达式替换html标签,在SQL中用正则表达式替换html标签
由于数据库的一个表字段中多包含html标签,现在需要修改数据库的字段把html标签都替换掉.当然我可以通过写一个程序去修改,那毕竟有点麻烦.直接在查询分析器中执行,但是MS SQL Server并没有 ...
- mysql的exists解析_mysql中关于exists的深入讲解
mysql中关于exists的讲解 我认为exists语法是mysql中一个很强大的工具,可以简单地实现某些复杂的数据处理. 下面我谈谈与exists有关的三个方面. all 与 any 首先,看到了 ...
- mysql数据类型double,double在数据库怎么定义 mysql中double类型在sql中用什么类型
sql定义一个double变量怎么定义? 局部变量 声明:DECLARE @local_variable data_type @local_variable 是变量的名称.变量名必须以 at 符 (@ ...
- sql server 密钥_SQL Server中的升序密钥和CE模型变化
sql server 密钥 In this note, I'm going to discuss one of the most useful and helpful cardinality esti ...
- SQL Server中的筛选后的统计信息和CE模型变化
In this blog post, we are going to view some interesting model variation, that I've found while expl ...
最新文章
- Linux权限管理(suid euid)
- c++ string 拼接_String类5个常见面试题的解答过程和原理
- Oracle 数据库linux下sql命令行按回退键变成^H字符输入问题解决方法
- Oracle - 行转列, 列转行
- 信息系统项目管理师-论文专题(一)论文写作框架+10大管理关系
- redis的lrange_thinkphp5操作redis系列教程】列表类型之lRange,lGetRange
- QQ空间说说的表情添加的代码
- 标准SQL注入入侵语句
- Qt5.7+Opencv2.4.9人脸识别(三)人脸处理
- WCF远程服务器返回了意外响应: (413) Request Entity Too Large问题处理
- 2-2 内建变量类型
- C# 人民币大小写转换正则表达式
- matlab 例题sin,matlab基础练习题(带答案).doc
- 企业污染排放数据库、海关数据库
- 读懂React原理之调和与Fiber
- Python趣味绘图,一闪一闪亮晶晶,满天都是小星星
- 带节点的曲线,可以鼠标拖动节点,类似PS
- 用HTML+CSS做一个简单好看的校园社团网页
- 如何在不安装应用程序的情况下旋转iPhone视频
- js中大于0的正整数正则
热门文章
- jkd1.8 list.stream()练习
- Python学习资料全面总结,真的对零基础很有用
- CCF认证2019031-小中大
- 足球大数据预测中欧亚大小球随时间变化的处理
- 谈一谈对新技术的态度
- 文本分析常用R包的安装(Rweibo、wordcloud、tm、tmcn、Rwordseg、Rcharts、xlsx、XLConnect)
- 【Hello Linux】Linux入门
- 图像识别教程(百度AI开放平台)
- adroid xpose 修改java方法实例_基于xposed 修改硬件信息(xposed框架使用)
- Android 微信分享与QQ分享功能(原生实现)