ホームページ データベース 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 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

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. 複雑な実行可能ファイル)。クエリとデータ操作)。

Douyin でログインしたデバイスを削除する手順を確認してください。 Douyin でログインしたデバイスを削除する手順を確認してください。 Mar 26, 2024 am 09:01 AM

1. まず、Douyin アプリをクリックして開き、[Me] をクリックします。 2. 右上隅にある三点アイコンをクリックします。 3. クリックして[設定]に入ります。 4. [アカウントとセキュリティ]をクリックして開きます。 5. [デバイス管理にログイン]を選択してクリックします。 6. 最後に、デバイスをクリックして選択し、[削除]をクリックします。

Xianyuで自分のIDを確認する方法_Xianyuで自分のニックネームを確認する方法の紹介 Xianyuで自分のIDを確認する方法_Xianyuで自分のニックネームを確認する方法の紹介 Mar 22, 2024 am 08:21 AM

Xianyu は取引プラットフォームなので、使用する前にアカウントに登録してログインする必要があります。ユーザーは自分のアカウントに ID 名を設定できます。自分の ID が何であるかを確認したい場合はどうすればよいですか?以下で一緒に調べてみましょう! Xianyuで個人のニックネームを表示する方法の紹介. まず、Xianyuアプリを起動し、ホームページに入ったら、アイドル販売、メッセージ販売、私のページに切り替えて、右下の[私の]オプションをクリックしてください。 2. 次に、マイページの左上隅にある [アバター] をクリックする必要があります; 2. 次に、個人のホームページ ページに移動すると、さまざまな情報が表示されます。ここで [情報の編集] ボタンをクリックする必要があります; 4.最後に、「後で情報を編集するページで確認できます」をクリックします。

NetEase Cloud Musicで音楽ランキングを確認する場所_NetEase Cloud Musicで音楽ランキングを確認する方法 NetEase Cloud Musicで音楽ランキングを確認する場所_NetEase Cloud Musicで音楽ランキングを確認する方法 Mar 25, 2024 am 11:40 AM

1. 電話の電源を入れた後、NetEase Cloud Music を選択します。 2. ホームページに入ると「ランキング一覧」が表示されますので、クリックしてエントリーしてください。 3. ランキングリストで任意のリストを選択し、[新しい曲リスト]をクリックします。 4. お気に入りの曲を選択してクリックします。 5. 前のページに戻って、さらにリストを表示します。

Kuaishou Live Companion ビデオのホットリストを表示する方法 Kuaishou Live Companion ビデオのホットリストを表示する方法 Mar 29, 2024 pm 08:09 PM

Kuaishou Live Companion は、強力なライブ ブロードキャスト補助ツールであるだけでなく、ブロードキャスター向けに作成されたホットなトピックやトレンドに関するリアルタイムの洞察プラットフォームでもあります。この機能により、アンカーは視聴者が最も関心のあるコンテンツを素早く捉え、視聴者の好みや興味に合わせてライブコンテンツを調整することができます。では、Kuaishou Live Companion アプリで人気のビデオ リストを確認するにはどうすればよいでしょうか? このチュートリアル ガイドでは、その手順について詳しく説明します。 Kuaishou Live Companion でホットビデオ リストを表示するにはどうすればよいですか? 2 番目のステップは、毎日のビデオ ホット リストをクリックすることです。 3 番目のステップは、毎日のビデオ ホット リストを確認することです。

WeChat に参加しているグループの数を確認する方法: 簡単なステップ WeChat に参加しているグループの数を確認する方法: 簡単なステップ Mar 26, 2024 am 10:06 AM

生活や仕事に関係なく、多くの人が長い間 WeChat と深く結びついており、いつでもさまざまなグループに引き込まれるでしょう。アドレス帳内のグループ チャットをすぐに表示したい場合がありますが、そこにはアドレス帳に保存した WeChat グループのみが表示され、他のグループは表示されません。あなたが参加しているすべての WeChat グループを確認したい場合は、非常に簡単です。WeChat ホームページの検索ボックスにニックネームを入力し、検索結果でグループ チャット セクションを見つけ、[その他のグループ チャット] をクリックして表示します。関連するすべてのグループ チャット情報。とにかくびっくりしました、その数は100以上で、右側のスクロールバーがとても小さくなってしまいました。残念ながら、具体的な数字の統計はありません...この方法は、参加している QQ グループを確認する場合にも適用できます。 PS: 一部のネチズンもトリックを提供しました。

自分が参加しているグループを確認するにはどうすればよいですか? 自分が参加しているグループを確認するにはどうすればよいですか? Apr 01, 2024 pm 05:34 PM

WeChat のグループ チャットは単なるチャット プラットフォームではなく、各界のエリートや熱心な友人が集まるコミュニケーション サークルでもあります。そこで今回は、WeChat に追加したグループの数を確認する方法と保存する方法を説明します。通常、WeChat を使用するユーザーは、これを見逃すことはできません。 WeChat に追加したグループの数を確認する方法とグループ チャットを保存する方法 WeChat に追加したグループの数を確認するには: 1. WeChat メイン インターフェイスでグループ チャット ウィンドウを表示できます。 2. すでに保存している場合は、グループ チャットでは、 [ アドレス帳] - [グループ チャット] をタップできます 3. グループ チャットに入ると、保存されたグループが表示されます. WeChat グループを保存します: 1. 保存したいグループを選択し、右上 [.. ] 2. チャット メッセージ内で開きます [アドレス帳に保存] 3. WeChat のメイン インターフェースで、[アドレス帳]-[グループ チャット] をタップして表示します。

Amap ヘルプセンターの表示方法_Amap ヘルプセンターの表示方法 Amap ヘルプセンターの表示方法_Amap ヘルプセンターの表示方法 Apr 01, 2024 pm 05:26 PM

1. まず Gaode マップを開きます。 2. 次に、Amap ホームページの右下隅にある (My) をクリックし、右上隅にある [設定] をクリックします。 3. 最後に、Amap のヘルプセンターが表示されます。

See all articles