首页 数据库 mysql教程 gather_plan_statistics查看sql的join部分的内存消耗

gather_plan_statistics查看sql的join部分的内存消耗

Jun 07, 2016 pm 04:40 PM
sql 查看

遇见一个sql语句,感觉驱动表的顺序选择有问题,就倒腾了一会儿,具体的sql语句如下,这里推荐使用gather_plan_statistics来查看具体的每个执行计划消耗的IO资源、执行时间、预估和实际返回的rows。 SQL_ID dq4pj5cnn0gb8, child number 0 -----------------

遇见一个sql语句,感觉驱动表的顺序选择有问题,就倒腾了一会儿,具体的sql语句如下,这里推荐使用gather_plan_statistics来查看具体的每个执行计划消耗的IO资源、执行时间、预估和实际返回的rows。

SQL_ID  dq4pj5cnn0gb8, child number 0
-------------------------------------
select /*+ gather_plan_statistics*/a.SERVNUMBER, a.REGION   from
tbcs.SUBS_USEDTEL a, tbcs.CS_SUBS_SERVNUMBER_TRANS b  where a.SUBSID =
b.TRANSIN_SUBSID    and a.REGION = b.TRANSIN_REGION    and a.INTIME >
sysdate - 90    and a.RECDEFID in ('DropSubs', 'FraudDropSubs')    and
a.REGION = 20
 
Plan hash value: 2146127278
 
-----------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation               | Name                     | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
-----------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT        |                          |      1 |        |    100 |00:00:01.08 |   19453 |       |       |          |
|*  1 |  HASH JOIN              |                          |      1 |   4749 |    100 |00:00:01.08 |   19453 |    24M|  3319K|   25M (0)|
|   2 |   PARTITION RANGE SINGLE|                          |      1 |   4749 |    374K|00:00:00.83 |   17257 |       |       |          |
|*  3 |    TABLE ACCESS FULL    | SUBS_USEDTEL             |      1 |   4749 |    374K|00:00:00.66 |   17257 |       |       |          |
|*  4 |   TABLE ACCESS FULL     | CS_SUBS_SERVNUMBER_TRANS |      1 |  13477 |   8795 |00:00:00.05 |    2196 |       |       |          |
-----------------------------------------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - access("A"."SUBSID"="B"."TRANSIN_SUBSID" AND "A"."REGION"="B"."TRANSIN_REGION")
   3 - filter(("A"."REGION"=20 AND INTERNAL_FUNCTION("A"."RECDEFID") AND "A"."INTIME">SYSDATE@!-90))
   4 - filter("B"."TRANSIN_REGION"=20)

这里cbo在执行计划3中预估SUBS_USEDTEL通过谓词条件返回的数据只有4749,而实际返回了374K数据,初步来看这个sql应该交换下驱动表的顺序,让CS_SUBS_SERVNUMBER_TRANS去做驱动表。

SQL_ID  8px917y6cub58, child number 0
-------------------------------------
select /*+ gather_plan_statistics leading(b a) */
 a.SERVNUMBER, a.REGION
  from tbcs.SUBS_USEDTEL a, tbcs.CS_SUBS_SERVNUMBER_TRANS b
 where a.SUBSID = b.TRANSIN_SUBSID
   and a.REGION = b.TRANSIN_REGION
   and a.INTIME > sysdate - 90
   and a.RECDEFID in ('DropSubs', 'FraudDropSubs')
   and a.REGION = 20
 
Plan hash value: 2680037744
 
-----------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation               | Name                     | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
-----------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT        |                          |      1 |        |    346 |00:00:00.66 |   20281 |       |       |          |
|*  1 |  HASH JOIN              |                          |      1 |   4749 |    346 |00:00:00.66 |   20281 |  1998K|  1998K| 2083K (0)|
|*  2 |   TABLE ACCESS FULL     | CS_SUBS_SERVNUMBER_TRANS |      1 |  13477 |  14135 |00:00:00.06 |    3024 |       |       |          |
|   3 |   PARTITION RANGE SINGLE|                          |      1 |   4749 |    374K|00:00:00.78 |   17257 |       |       |          |
|*  4 |    TABLE ACCESS FULL    | SUBS_USEDTEL             |      1 |   4749 |    374K|00:00:00.61 |   17257 |       |       |          |
-----------------------------------------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - access("A"."SUBSID"="B"."TRANSIN_SUBSID" AND "A"."REGION"="B"."TRANSIN_REGION")
   2 - filter("B"."TRANSIN_REGION"=20)
   4 - filter(("A"."REGION"=20 AND INTERNAL_FUNCTION("A"."RECDEFID") AND "A"."INTIME">SYSDATE@!-90))

我们添加了hint lleading(b a)强制指定关联顺序,在整个sql消耗的逻辑读其实是没多大的变化,其实这里主要需要普及的一个知识点就是hash join的关联cbo是不会计算到逻辑读的。

那么这两个sql好像IO成本每多大的变化啊,但是我们观察OMem、1Mem、Used-Mem三项是有显著变化的,这里简单解释下这三个指标的信息
OMem为最优执行模式所需的内存评估值
1Mem为one-pass模式所需的内存评估值
Used-Mem则为实际执行时消耗的内存,而且我们还看见25M (0)和2083K (0)都有一个括号0,这个表示该sql是最优执行模式执行的

可以看出制定了正确的驱动表可以大幅度的减轻系统的内存消耗,这里也提供了我们一个思路就是优化sql时不能仅仅去关注IO资源,还要关注下内存的消耗,通过gather_plan_statistics可以很直观的观察到sql执行时join关联部分的内存消耗,

oracle官当对于memstats的解释(allstats=iostats+memstats的组合):

?MEMSTATS – Assuming that PGA memory management is enabled (that is,pga_aggregate_target parameter is set to a non 0 value), this format allows to display memory management statistics (for example, execution mode of the operator, how much memory was used, number of bytes spilled to disk, and so on). These statistics only apply to memory intensive operations like hash-joins, sort or some bitmap operators.

这个used-men和v$sql或者v$sqlarea的视图记录内存消耗的列是不相同的,used-mem是执行sql部分join消耗的pga内存部分,而v$sql或者v$sqlarea记录的是cursor的信息

sharable_mem:Amount of shared memory used by a cursor. If multiple child cursors exist, then the sum of all shared memory used by all child cursors.
persistent_mem:Fixed amount of memory used for the lifetime of an open cursor. If multiple child cursors exist, then the fixed sum of memory used for the
lifetime of all the child cursors.
runtime_mem:Fixed amount of memory required during execution of a cursor. If multiple child cursors exist, then the fixed sum of all memory required
during execution of all the child cursors.

这里我们需要注意的时优化sql时不能仅仅只是以逻辑读去衡量某个sql的性能,对于用户而言我们肯定是最关注sql的响应时间,我们优化IO、减少内存和cpu消耗等都是为了让执行sql时做尽可能少的事情,进而提高sql的响应时间。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Hibernate 框架中 HQL 和 SQL 的区别是什么? Hibernate 框架中 HQL 和 SQL 的区别是什么? Apr 17, 2024 pm 02:57 PM

HQL和SQL在Hibernate框架中进行比较:HQL(1.面向对象语法,2.数据库无关的查询,3.类型安全),而SQL直接操作数据库(1.与数据库无关的标准,2.可执行复杂查询和数据操作)。

抖音查看删除登录设备的操作步骤 抖音查看删除登录设备的操作步骤 Mar 26, 2024 am 09:01 AM

1、首先点击打开抖音app,点击【我】。2、点击右上方三点的图标。3、点击进入【设置】。4、点击打开【帐号与安全】。5、选择点击【登录设备管理】。6、最后点击选择其中的设备,点击【移除】即可。

闲鱼怎么查看自己的id_闲鱼个人昵称查看方法介绍 闲鱼怎么查看自己的id_闲鱼个人昵称查看方法介绍 Mar 22, 2024 am 08:21 AM

闲鱼作为一款交易平台,使用之前都需要先注册和登录自己的账号,用户可以为自己的账号设置id名称,如果想查看自己的id是什么怎么办呢?下面就来一起了解一下吧!闲鱼个人昵称查看方法介绍首先启动闲鱼应用,进入首页后,通过切换到卖闲置、消息、我的页面,点击右下角的【我的】选项。2、然后在我的页面中我们需要点击左上角的【头像】;2、接着来到个人主页的页面中可以看到不同的信息,我们需要在这里点击【编辑资料】按钮;4、最后点击过后在编辑资料的页面中我们就可以看到了;

网易云音乐在哪查看音乐排行榜_网易云音乐查看音乐排行榜方法 网易云音乐在哪查看音乐排行榜_网易云音乐查看音乐排行榜方法 Mar 25, 2024 am 11:40 AM

1、打开手机后,选择网易云音乐。2、进入到首页后,大家就可以看到【排行榜】,点击进入。3、在排行榜中,可以选择任意榜单,点击【新歌榜】。4、选择自己喜欢的歌曲,并进行点击。5、返回上一页,可以看到更多的榜单。

快手直播伴侣视频热榜怎么看 快手直播伴侣视频热榜怎么看 Mar 29, 2024 pm 08:09 PM

快手直播伴侣不仅是一个强大的直播辅助工具,更是一个为主播们打造的实时热门话题和趋势的洞察平台。通过这个功能,主播们可以迅速捕捉观众当前最关注的内容,进而调整直播内容,使其更加符合观众的口味和兴趣。那么在快手直播伴侣app中如何查看视频热榜呢,这篇教程攻略就将为大家带来详细的步骤介绍,希望能帮助到大家。快手直播伴侣怎么看视频热榜第二步,点击每日视频热榜。第三步,即可查看每日视频热榜了。

微信如何查看自己加了多少群:简单一步 微信如何查看自己加了多少群:简单一步 Mar 26, 2024 am 10:06 AM

无论生活还是工作,很多人早已被微信深深捆绑,也随时会被拉入各种各样的群,那么你到底加入了多少微信群呢?你可能会立刻想要查看通讯录中的群聊,但只有你保存在通讯录中的微信群才会显示在那里,其他群是不可见的。想看自己加入的所有微信群,也非常简单:在微信首页搜索框输入您的昵称,然后在搜索结果中找到群聊部分,点击“更多群聊”即可查看所有相关群聊信息。反正我是被吓了一跳,密密麻麻上百个都不止,右侧滚动条都变得很小了。只可惜,没有具体数量统计……这个方法也同样适用于查看加入的QQ群。PS:还有网友提供了一招,

怎么查看自己进了哪些群 怎么查看自己进了哪些群 Apr 01, 2024 pm 05:34 PM

微信群聊这里不仅是一个简单的聊天平台,更是一个汇聚了各行各业精英和热心朋友的交流圈,所以小编今天就来教大家微信看自己加了多少群及保存群聊方法,平时使用微信的用户可千万不要错过了哟。微信看自己加了多少群及保存群聊方法微信查看自己加了多少群:1.您可在微信主界面中查看你的群聊窗口2.若您已经操作保存群聊,您可轻触【通讯录】-【群聊】3.群聊进入后即可查看到保存的群里啦保存微信群:1.选择您需保存的群里,右上方【...】2.聊天信息中打开【保存到通讯录】3.微信主界面,轻触【通讯录】-【群聊】即可查看

高德地图帮助中心怎么查看_高德地图帮助中心查看方法 高德地图帮助中心怎么查看_高德地图帮助中心查看方法 Apr 01, 2024 pm 05:26 PM

1、我们首先打开高德地图。2、然后在高德地图的主页中点击右下角的(我的)随后点击右上角的设置。3、最后这样就可以看到高德地图的帮助中心了。

See all articles