分区字段不在SQL过滤中,悲剧
2019独角兽企业重金招聘Python工程师标准>>>
快下班了,朋友发来SQL,说要跑900秒。
SELECTT_01."ANLN1",T_01."ANLN2",T_01."APLZL",T_01."AUFNR",T_01."AUFPL",T_00."BKTXT",T_00."BLDAT",T_01."BPMNG",T_01."BPRME",T_01."BSTME",T_01."BSTMG",T_00."BUDAT",T_01."BUKRS",T_01."BWART",T_01."BWTAR",T_01."CHARG",T_00."CPUDT",T_00."CPUTM",T_01."DMBTR",T_01."EBELN",T_01."EBELP",T_01."ERFME",T_01."ERFMG",T_01."EXBWR",T_01."EXVKW",T_01."GRUND",T_01."KDAUF",T_01."KDEIN",T_01."KDPOS",T_01."KOSTL",T_01."KUNNR",T_01."KZBEW",T_01."KZVBR",T_01."KZZUG",T_01."LGORT",T_01."LIFNR",T_01."MATNR",T_00."MBLNR",T_01."MEINS",T_01."MENGE",T_00."MJAHR",T_01."NPLNR",T_01."PS_PSP_PNR",T_01."RSNUM",T_01."RSPOS",T_01."SHKZG",T_01."SOBKZ",T_00."USNAM",T_00."VGART",T_01."VKWRT",T_01."WAERS",T_01."WERKS",T_00."XABLN",T_01."XAUTO",T_00."XBLNR",T_01."ZEILE"FROM SAPSR3."MKPF" T_00INNER JOIN SAPSR3."MSEG" T_01ON T_01."MANDT" = '800'AND T_00."MANDT" = T_01."MANDT"AND T_00."MBLNR" = T_01."MBLNR"AND T_00."MJAHR" = T_01."MJAHR"WHERE T_00."MANDT" = '800'AND T_00."BUDAT" BETWEEN '20150303' AND '20150930'AND T_01."WERKS" = 'YH25'
看看执行计划:
已用时间: 00: 00: 18.82执行计划
----------------------------------------------------------
Plan hash value: 445835420-------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time | Pstart| Pstop |
-------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 185K| 52M| | 132K (1)| 00:26:34 | | |
|* 1 | HASH JOIN | | 185K| 52M| 15M| 132K (1)| 00:26:34 | | |
| 2 | PARTITION RANGE ALL | | 173K| 13M| | 10779 (1)| 00:02:10 | 1 | 11 |
|* 3 | TABLE ACCESS FULL | MKPF | 173K| 13M| | 10779 (1)| 00:02:10 | 1 | 11 |
| 4 | PARTITION RANGE ALL | | 337K| 69M| | 117K (1)| 00:23:32 | 1 | 11 |
| 5 | TABLE ACCESS BY LOCAL INDEX ROWID| MSEG | 337K| 69M| | 117K (1)| 00:23:32 | 1 | 11 |
|* 6 | INDEX RANGE SCAN | MSEG_MMWB | 337K| | | 25064 (1)| 00:05:01 | 1 | 11 |
-------------------------------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------1 - access("T_00"."MANDT"="T_01"."MANDT" AND "T_00"."MBLNR"="T_01"."MBLNR" AND "T_00"."MJAHR"="T_01"."MJAHR")3 - filter("T_00"."BUDAT">='20150303' AND "T_00"."MANDT"='800' AND "T_00"."BUDAT"<='20150930')6 - access("T_01"."MANDT"='800' AND "T_01"."WERKS"='YH25')filter("T_01"."WERKS"='YH25')统计信息
----------------------------------------------------------1 recursive calls1 db block gets222451 consistent gets0 physical reads0 redo size8571412 bytes sent via SQL*Net to client89800 bytes received via SQL*Net from client8118 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)121741 rows processed
T_00 : 总数据-1796465T_01 : 总数据-6261512MKPF、MSEG 都为分区表,分区字段-MJAHR(按日期分区)
MSEG:索引 MSEG_MMWB(MANDT, MBLNR, WERKS, BWART)
仔细看:
PARTITION RANGE ALL
这玩意走的是全表扫描,典型的过滤条件不包含分区字段,必然是个死。
解决方法:
在SQL中加入分区字段
SELECTT_01."ANLN1",T_01."ANLN2",T_01."APLZL",T_01."AUFNR",T_01."AUFPL",T_00."BKTXT",T_00."BLDAT",T_01."BPMNG",T_01."BPRME",T_01."BSTME",T_01."BSTMG",T_00."BUDAT",T_01."BUKRS",T_01."BWART",T_01."BWTAR",T_01."CHARG",T_00."CPUDT",T_00."CPUTM",T_01."DMBTR",T_01."EBELN",T_01."EBELP",T_01."ERFME",T_01."ERFMG",T_01."EXBWR",T_01."EXVKW",T_01."GRUND",T_01."KDAUF",T_01."KDEIN",T_01."KDPOS",T_01."KOSTL",T_01."KUNNR",T_01."KZBEW",T_01."KZVBR",T_01."KZZUG",T_01."LGORT",T_01."LIFNR",T_01."MATNR",T_00."MBLNR",T_01."MEINS",T_01."MENGE",T_00."MJAHR",T_01."NPLNR",T_01."PS_PSP_PNR",T_01."RSNUM",T_01."RSPOS",T_01."SHKZG",T_01."SOBKZ",T_00."USNAM",T_00."VGART",T_01."VKWRT",T_01."WAERS",T_01."WERKS",T_00."XABLN",T_01."XAUTO",T_00."XBLNR",T_01."ZEILE"FROM SAPSR3."MKPF" T_00INNER JOIN SAPSR3."MSEG" T_01ON T_01."MANDT" = '800'AND T_00."MANDT" = T_01."MANDT"AND T_00."MBLNR" = T_01."MBLNR"AND T_00."MJAHR" = T_01."MJAHR"WHERE T_00."MANDT" = '800'AND T_00."BUDAT" BETWEEN '20150303' AND '20150930'AND T_01."WERKS" = 'YH25'AND MJAHR='2015' ---将分区字段加进来
再跑下执行计划如下:
走了分区全表,逻辑读为之前的二分之一。
后续问题:
根据优化后的执行计划,这个SQL还可以通过索引继续优化的,这里就不介绍了。
转载于:https://my.oschina.net/1272149624/blog/671045
分区字段不在SQL过滤中,悲剧相关推荐
- hive表指定分区字段搜索_Spark SQL解析查询parquet格式Hive表获取分区字段和查询条件...
首先说一下,这里解决的问题应用场景: sparksql处理Hive表数据时,判断加载的是否是分区表,以及分区表的字段有哪些?再进一步限制查询分区表必须指定分区? 这里涉及到两种情况:select SQ ...
- MySQL使用报错:1054 - Unknown column ‘sno‘ in ‘field list‘(表中字段编码与SQL语句中编码不统一)
情况描述:在Navicat中新建了一个数据库,然后导入了几个CSV文件,建立了几个表: 其中sno_info结构如下所示: 当我简单查询Sno的时候: 报错了: 1054 - Unknown colu ...
- 如何在SQL Server中自动进行表分区
In this article, we will demonstrate specific ways to automate table partitioning in SQL Server. Thi ...
- 2如何看表分区字段_技术分享|Oracle分区技术的实现总结
郝秉睿 青岛科技研发中心 相信对于分区技术,大家一定都有所了解.但是你知道Oracle一共有多少种分区技术么?它们的适用范围和规范是怎样?今天让我们一起来看一看Oracle分区技术的魅力. 在大型的数 ...
- spark sql 查看分区_Spark SQL解析查询parquet格式Hive表获取分区字段和查询条件
首先说一下,这里解决的问题应用场景: sparksql处理Hive表数据时,判断加载的是否是分区表,以及分区表的字段有哪些?再进一步限制查询分区表必须指定分区? 这里涉及到两种情况:select SQ ...
- SQL Server中的数据库表分区
什么是数据库表分区? (What is a database table partitioning?) Partitioning is the database process where very ...
- SQL语句中explain各字段含义
SQL语句中explain各字段含义 1 id: 2 select_type 3 type 4 table 5 possible_keys 6 Key key列显示MySQL实际决定使用的键(索引) ...
- Access中字段类型及修改字段类型的SQL语句
Access中字段类型及修改字段类型的SQL语句 Access中的数据类型 Access中有10中数据类型:文本.备注.数值.日期/时间.货币.自动编号.是/否.OLE对象.超级链接.查询向导. 1. ...
- SqlServer还原数据库时提示:异常终止,不能在此版本的SQL Server中启动,因为它包含分区函数
场景 在SqlServer Management中进行数据库还原时提示: 数据库不能在此版本的SQL Server中启动,因为它包含分区函数. 点击左下角的查看详细信息 实现 电脑上安装的是SQL S ...
最新文章
- 网络之NSURLSession
- goland go test_七天用Go写个docker(第一天)
- 疑似华为Mate 30 Pro上手视频曝光 看完更想买了!
- c语言赋值运算符 amp amp 怎么读,重载赋值运算符 amp;amp; 对象
- PHPCMS v9里面,推荐位ID【posid】的值是如何确定的?是自定义的还是官方定义好的?...
- linux进入uvc目录,Linux uvc驱动分析
- 整理一下Entity Framework的查询
- JS数据结构第六篇 --- 二叉树力扣练习题
- python 共享文件_通过 Python 快速实现局域网内文件共享
- Unix 环境高级编程 之 理解 rws 权限
- ##超市会员卡管理,利用我们之前的知识进行温习
- tablewidget
- 联想G40笔记本U盘重装win7系统问题笔记
- setvlet:控制台获取前端表单以及xml文件数据信息
- 经验分享:计算机专业求职面试,这 5 句自我介绍模板记好了!
- PUTTY 中文教程
- formCreate
- 汉泰示波器 6524BD
- Apache服务器访问权限设置
- ubuntu12.04安装QQ2012教程
热门文章
- 界面设计02 - 零基础入门学习Delphi43
- 合成谬误与公地悲剧(为何设置产品总监职位及核算名义成本)
- 【Java】关于Java编程软件idea快捷键的使用
- dmol3给定关键字不在字典中_一日一技:举例说明python中的map()方法
- 非科班出身,如何成为程序员?
- 这10个实用的Javascript调试技巧,你知道吗?
- c语言中各个符号的意义及作用是什么,C语言特殊符号意义
- 3dmax高版本转低版本插件_Fundebug前端JavaScript插件更新至1.8.0,兼容低版本的Android浏览器...
- 我的世界JAVA版编程语言_Java版版本记录/开发版本
- json在java中的使用_在Java中使用JSON