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过滤中,悲剧相关推荐

  1. hive表指定分区字段搜索_Spark SQL解析查询parquet格式Hive表获取分区字段和查询条件...

    首先说一下,这里解决的问题应用场景: sparksql处理Hive表数据时,判断加载的是否是分区表,以及分区表的字段有哪些?再进一步限制查询分区表必须指定分区? 这里涉及到两种情况:select SQ ...

  2. MySQL使用报错:1054 - Unknown column ‘sno‘ in ‘field list‘(表中字段编码与SQL语句中编码不统一)

    情况描述:在Navicat中新建了一个数据库,然后导入了几个CSV文件,建立了几个表: 其中sno_info结构如下所示: 当我简单查询Sno的时候: 报错了: 1054 - Unknown colu ...

  3. 如何在SQL Server中自动进行表分区

    In this article, we will demonstrate specific ways to automate table partitioning in SQL Server. Thi ...

  4. 2如何看表分区字段_技术分享|Oracle分区技术的实现总结

    郝秉睿 青岛科技研发中心 相信对于分区技术,大家一定都有所了解.但是你知道Oracle一共有多少种分区技术么?它们的适用范围和规范是怎样?今天让我们一起来看一看Oracle分区技术的魅力. 在大型的数 ...

  5. spark sql 查看分区_Spark SQL解析查询parquet格式Hive表获取分区字段和查询条件

    首先说一下,这里解决的问题应用场景: sparksql处理Hive表数据时,判断加载的是否是分区表,以及分区表的字段有哪些?再进一步限制查询分区表必须指定分区? 这里涉及到两种情况:select SQ ...

  6. SQL Server中的数据库表分区

    什么是数据库表分区? (What is a database table partitioning?) Partitioning is the database process where very ...

  7. SQL语句中explain各字段含义

    SQL语句中explain各字段含义 1 id: 2 select_type 3 type 4 table 5 possible_keys 6 Key key列显示MySQL实际决定使用的键(索引) ...

  8. Access中字段类型及修改字段类型的SQL语句

    Access中字段类型及修改字段类型的SQL语句 Access中的数据类型 Access中有10中数据类型:文本.备注.数值.日期/时间.货币.自动编号.是/否.OLE对象.超级链接.查询向导. 1. ...

  9. SqlServer还原数据库时提示:异常终止,不能在此版本的SQL Server中启动,因为它包含分区函数

    场景 在SqlServer Management中进行数据库还原时提示: 数据库不能在此版本的SQL Server中启动,因为它包含分区函数. 点击左下角的查看详细信息 实现 电脑上安装的是SQL S ...

最新文章

  1. 网络之NSURLSession
  2. goland go test_七天用Go写个docker(第一天)
  3. 疑似华为Mate 30 Pro上手视频曝光 看完更想买了!
  4. c语言赋值运算符 amp amp 怎么读,重载赋值运算符 amp;amp; 对象
  5. PHPCMS v9里面,推荐位ID【posid】的值是如何确定的?是自定义的还是官方定义好的?...
  6. linux进入uvc目录,Linux uvc驱动分析
  7. 整理一下Entity Framework的查询
  8. JS数据结构第六篇 --- 二叉树力扣练习题
  9. python 共享文件_通过 Python 快速实现局域网内文件共享
  10. Unix 环境高级编程 之 理解 rws 权限
  11. ##超市会员卡管理,利用我们之前的知识进行温习
  12. tablewidget
  13. 联想G40笔记本U盘重装win7系统问题笔记
  14. setvlet:控制台获取前端表单以及xml文件数据信息
  15. 经验分享:计算机专业求职面试,这 5 句自我介绍模板记好了!
  16. PUTTY 中文教程
  17. formCreate
  18. 汉泰示波器 6524BD
  19. Apache服务器访问权限设置
  20. ubuntu12.04安装QQ2012教程

热门文章

  1. 界面设计02 - 零基础入门学习Delphi43
  2. 合成谬误与公地悲剧(为何设置产品总监职位及核算名义成本)
  3. 【Java】关于Java编程软件idea快捷键的使用
  4. dmol3给定关键字不在字典中_一日一技:举例说明python中的map()方法
  5. 非科班出身,如何成为程序员?
  6. 这10个实用的Javascript调试技巧,你知道吗?
  7. c语言中各个符号的意义及作用是什么,C语言特殊符号意义
  8. 3dmax高版本转低版本插件_Fundebug前端JavaScript插件更新至1.8.0,兼容低版本的Android浏览器...
  9. 我的世界JAVA版编程语言_Java版版本记录/开发版本
  10. json在java中的使用_在Java中使用JSON