首頁 資料庫 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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++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.最後點選選擇其中的設備,點選【移除】即可。

網易雲音樂在哪裡查看音樂排行榜_網易雲音樂查看音樂排行榜方法 網易雲音樂在哪裡查看音樂排行榜_網易雲音樂查看音樂排行榜方法 Mar 25, 2024 am 11:40 AM

1.打開手機後,選擇網路易雲音樂。 2.進入首頁後,大家就可以看到【排行榜】,點選進入。 3.在排行榜中,可以選擇任意榜單,點選【新歌榜】。 4、選擇自己喜歡的歌曲,並進行點擊。 5.返回上一頁,可以看到更多的榜單。

閒魚怎麼查看自己的id_閒魚個人暱稱查看方法介紹 閒魚怎麼查看自己的id_閒魚個人暱稱查看方法介紹 Mar 22, 2024 am 08:21 AM

閒魚作為交易平台,使用前都需要先註冊和登入自己的帳號,用戶可以為自己的帳號設定id名稱,如果想查看自己的id是什麼怎麼辦呢?下面就來一起了解吧!閒魚個人暱稱檢視方法介紹先啟動閒魚應用,進入首頁後,透過切換到賣閒置、訊息、我的頁面,點選右下角的【我的】選項。 2、然後在我的頁面中我們需要點擊左上角的【頭像】;2、接著來到個人主頁的頁面中可以看到不同的信息,我們需要在這裡點擊【編輯資料】按鈕;4、最後點擊過後在編輯資料的頁面中我們就可以看到了;

快手直播伴侶影片熱榜怎麼看 快手直播伴侶影片熱榜怎麼看 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