首页 数据库 mysql教程 通过案例学调优之--动态视图(v$bh和x$bh)

通过案例学调优之--动态视图(v$bh和x$bh)

Jun 07, 2016 pm 02:52 PM
动态 案例 视图 通过

通过案例学调优之--动态视图(v$bh和x$bh) v$bh与x$bh v$bh:非常详细地记录了数据块在数据缓冲区内的使用情况,一条记录对应一个block的详细记录。 v$bh来自于基表x$bh与x$le 查看v$bh结构: 13:07:20SYS@test1descv$bhNameNull?Type------------------------

通过案例学调优之--动态视图(v$bh和x$bh)

v$bh与x$bh

v$bh:非常详细地记录了数据块在数据缓冲区内的使用情况,一条记录对应一个block的详细记录。

v$bh来自于基表x$bh与x$le

查看v$bh结构:

13:07:20 SYS@ test1 >desc v$bh
 Name                                                              Null?    Type
 ----------------------------------------------------------------- -------- --------------------------------------------
 FILE#                                                                      NUMBER
 BLOCK#                                                                     NUMBER
 CLASS#                                                                     NUMBER
 STATUS                                                                     VARCHAR2(10)
 XNC                                                                        NUMBER
 FORCED_READS                                                               NUMBER
 FORCED_WRITES                                                              NUMBER
 LOCK_ELEMENT_ADDR                                                          RAW(4)
 LOCK_ELEMENT_NAME                                                          NUMBER
 LOCK_ELEMENT_CLASS                                                         NUMBER
 DIRTY                                                                      VARCHAR2(1)
 TEMP                                                                       VARCHAR2(1)
 PING                                                                       VARCHAR2(1)
 STALE                                                                      VARCHAR2(1)
 DIRECT                                                                     VARCHAR2(1)
 NEW                                                                        CHAR(1)
 OBJD                                                                       NUMBER
 TS#                                                                        NUMBER
 LOBID                                                                      NUMBER
 CACHEHINT                                                                  NUMBER
登录后复制

STATUS

free - not currently in use

xcur - exclusive current,表示该数据块处于排外模式,正在被当前Instance占用;

scur - shared current,RAC环境中表示该数据库正在和其他实例共享数据。

cr - consistent read,一致性读。

read - being read from disk

mrec - in media recovery mode,表示数据块处于介质恢复模式;

irec - in instance recovery mode ,表示数据块处于实例恢复模式;

write - 表示数据库正在往磁盘写入数据;


13:07:19 SYS@ test1 >select * from v$fixed_view_definition t where t.view_name='GV$BH'

VIEW_NAME                      VIEW_DEFINITION
------------------------------ --------------------------------------------------
GV$BH                          select bh.inst_id, file#, dbablk, class, decode(st
                               ate,0,'free',1,'xcur',2,'scur',3,'cr', 4,'read',5,
                               'mrec',6,'irec',7,'write',8,'pi', 9,'memory',10,'m
                               write',11,'donated', 12,'protected',  13,'securefi
                               le', 14,'siop',15,'recckpt', 16, 'flashfree',  17,
                                'flashcur', 18, 'flashna'), 0, 0, 0, bh.le_addr,
                               le_id1, le_id2, decode(bitand(flag,1), 0, 'N', 'Y'
                               ), decode(bitand(flag,16), 0, 'N', 'Y'), decode(bi
                               tand(flag,1536), 0, 'N', 'Y'), decode(bitand(flag,
                               16384), 0, 'N', 'Y'), decode(bitand(flag,65536), 0
                               , 'N', 'Y'), 'N', obj, ts#, lobid,  bitand(OBJ_FLA
                               G, 240)/16 from x$bh bh, x$le le where bh.le_addr
                               = le.le_addr (+)
登录后复制

13:08:20 SYS@ test1 >desc x$bh

Name                                                              Null?    Type
 ----------------------------------------------------------------- -------- --------------------------------------------
 ADDR                                                                       RAW(4)
 INDX                                                                       NUMBER
 INST_ID                                                                    NUMBER
 HLADDR                                                                     RAW(4)
 BLSIZ                                                                      NUMBER
 NXT_HASH                                                                   RAW(4)
 PRV_HASH                                                                   RAW(4)
 NXT_REPL                                                                   RAW(4)
 PRV_REPL                                                                   RAW(4)
 FLAG                                                                       NUMBER
 FLAG2                                                                      NUMBER
 LOBID                                                                      NUMBER
 RFLAG                                                                      NUMBER
 SFLAG                                                                      NUMBER
 LRU_FLAG                                                                   NUMBER
 TS#                                                                        NUMBER
 FILE#                                                                      NUMBER
 DBARFIL                                                                    NUMBER
 DBABLK                                                                     NUMBER
 CLASS                                                                      NUMBER
 STATE                                                                      NUMBER
 MODE_HELD                                                                  NUMBER
 CHANGES                                                                    NUMBER
 CSTATE                                                                     NUMBER
 LE_ADDR                                                                    RAW(4)
 DIRTY_QUEUE                                                                NUMBER
 SET_DS                                                                     RAW(4)
 OBJ                                                                        NUMBER
 BA                                                                         RAW(4)
 CR_SCN_BAS                                                                 NUMBER
 CR_SCN_WRP                                                                 NUMBER
 CR_XID_USN                                                                 NUMBER
 CR_XID_SLT                                                                 NUMBER
 CR_XID_SQN                                                                 NUMBER
 CR_UBA_FIL                                                                 NUMBER
 CR_UBA_BLK                                                                 NUMBER
 CR_UBA_SEQ                                                                 NUMBER
 CR_UBA_REC                                                                 NUMBER
 CR_SFL                                                                     NUMBER
 CR_CLS_BAS                                                                 NUMBER
 CR_CLS_WRP                                                                 NUMBER
 LRBA_SEQ                                                                   NUMBER
 LRBA_BNO                                                                   NUMBER
 HSCN_BAS                                                                   NUMBER
 HSCN_WRP                                                                   NUMBER
 HSUB_SCN                                                                   NUMBER
 US_NXT                                                                     RAW(4)
 US_PRV                                                                     RAW(4)
 WA_NXT                                                                     RAW(4)
 WA_PRV                                                                     RAW(4)
 OQ_NXT                                                                     RAW(4)
 OQ_PRV                                                                     RAW(4)
 AQ_NXT                                                                     RAW(4)
 AQ_PRV                                                                     RAW(4)
 OBJ_FLAG                                                                   NUMBER
 TCH                                                                        NUMBER
 TIM                                                                        NUMBER
 CR_RFCNT                                                                   NUMBER
 SHR_RFCNT                                                                  NUMBER
登录后复制

x$bh中“touch count”信息对应到x$bh的tch字段,而段的data_object_id信息对应到x$bh的obj,或者是v$bh的objd。

案例分析:

(1)对象有多少个数据块缓存到Data buffer中

13:29:01 SCOTT@ test1 >truncate table t1;
13:29:09 SCOTT@ test1 >begin
13:29:12   2  for i in 1..5000 loop
13:29:25   3  insert into t1 values (i);
13:29:35   4  end loop;
13:29:38   5  end;
13:29:39   6  /
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.67
13:29:41 SCOTT@ test1 >commit;
登录后复制
创建一存储过程:show space读取数据块信息

13:29:43 SCOTT@ test1 >create or replace procedure show_space
13:34:44   2
13:34:44   3    ( p_segname in varchar2,
13:34:44   4
13:34:44   5    p_owner   in varchar2 default user,
13:34:44   6
13:34:44   7    p_type    in varchar2 default 'TABLE',
13:34:44   8
13:34:44   9    p_partition in varchar2 default NULL )
13:34:44  10
13:34:44  11  as
13:34:44  12
13:34:44  13      l_total_blocks              number;
13:34:44  14
13:34:44  15      l_total_bytes               number;
13:34:44  16
13:34:44  17      l_unused_blocks             number;
13:34:44  18
13:34:44  19      l_unused_bytes              number;
13:34:44  20
13:34:44  21      l_LastUsedExtFileId         number;
13:34:44  22
13:34:44  23      l_LastUsedExtBlockId        number;
13:34:44  24
13:34:44  25      l_last_used_block           number;
13:34:44  26
13:34:44  27      procedure p( p_label in varchar2, p_num in number )
13:34:44  28
13:34:44  29      is
13:34:44  30
13:34:44  31      begin
13:34:44  32
13:34:44  33          dbms_output.put_line( rpad(p_label,40,'.') ||
13:34:44  34
13:34:45  35                                p_num );
13:34:45  36
13:34:45  37      end;
13:34:45  38
13:34:45  39  begin
13:34:45  40
13:34:45  41
13:34:45  42
13:34:45  43      dbms_space.unused_space
13:34:45  44
13:34:45  45      ( segment_owner     => p_owner,
13:34:45  46
13:34:45  47        segment_name      => p_segname,
13:34:45  48
13:34:45  49        segment_type      => p_type,
13:34:45  50
13:34:45  51        partition_name    => p_partition,
13:34:45  52
13:34:45  53        total_blocks      => l_total_blocks,
13:34:45  54
13:34:45  55        total_bytes       => l_total_bytes,
13:34:45  56
13:34:45  57        unused_blocks     => l_unused_blocks,
13:34:45  58
13:34:45  59        unused_bytes      => l_unused_bytes,
13:34:45  60
13:34:45  61        last_used_extent_file_id => l_LastUsedExtFileId,
13:34:45  62
13:34:45  63        last_used_extent_block_id => l_LastUsedExtBlockId,
13:34:45  64
13:34:45  65        last_used_block => l_last_used_block );
13:34:45  66
13:34:45  67
13:34:45  68
13:34:45  69      p( 'Total Blocks', l_total_blocks );
13:34:45  70
13:34:45  71      p( 'Total Bytes', l_total_bytes );
13:34:45  72
13:34:45  73      p( 'Unused Blocks', l_unused_blocks );
13:34:45  74
13:34:45  75      p( 'Unused Bytes', l_unused_bytes );
13:34:45  76
13:34:45  77      p( 'Last Used Ext FileId', l_LastUsedExtFileId );
13:34:45  78
13:34:45  79      p( 'Last Used Ext BlockId', l_LastUsedExtBlockId );
13:34:45  80
13:34:45  81      p( 'Last Used Block', l_last_used_block );
13:34:45  82
13:34:45  83  end;
13:34:47  84  /
登录后复制

13:34:49 SCOTT@ test1 >set serverout on

13:35:01 SCOTT@ test1 >exec show_space(p_segname=>'T1');
Total Blocks............................16
Total Bytes.............................131072
Unused Blocks...........................0
Unused Bytes............................0
Last Used Ext FileId....................4
Last Used Ext BlockId...................136
Last Used Block.........................8
PL/SQL procedure successfully completed.
登录后复制

数据文件id为4,t1表总共使用了16个块


分析数据块的rowid:

13:35:40 SCOTT@ test1 >select f,b from (
13:41:15   2   select dbms_rowid.rowid_relative_fno(rowid) f,
13:41:44   3          dbms_rowid.rowid_block_number(rowid) b
13:42:04   4  from t1) group by f,b;
         F          B
---------- ----------
         4        143
        11        691
         4        142
        11        693
        11        694
         4        141
        11        692
        11        695
8 rows selected.
登录后复制

Users 表空间有两个datafile,id为4,11

13:42:52 SYS@ test1 >select file#,name from v$datafile;
     FILE# NAME
---------- --------------------------------------------------
         1 /u01/app/oracle/oradata/test1/system01.dbf
         2 /u01/app/oracle/oradata/test1/sysaux01.dbf
         3 /u01/app/oracle/oradata/test1/undotbs01.dbf
         4 /u01/app/oracle/oradata/test1/users01.dbf
        10 /u01/app/oracle/oradata/test1/index01.dbf
        11 /dsk1/oradata/test1/users02.dbf
6 rows selected.
登录后复制

T1表总共为16个块,数据占用了8个块

13:47:43 SYS@ test1 >select file#,dbablk,tch from x$bh where obj=

2 (select data_object_id from dba_objects

3 where owner='SCOTT' AND object_name='T1')

4* order by dbablk

     FILE#     DBABLK        TCH
---------- ---------- ----------
         4        136          2
         4        137          2
         4        138          2
         4        139          2
         4        140          2
         4        141          2
         4        142          2
         4        143          2
        11        688          1
        11        689          1
        11        690          4
        11        690          1
        11        691          2
        11        692          2
        11        693          2
        11        694          2
        11        695          2
17 rows selected.
登录后复制

13:48:59 SYS@ test1 >select file#,block#,status from v$bh where objd=

13:49:18 2 (select data_object_id from dba_objects

13:49:33 3 where owner='SCOTT' and object_name='T1')

13:49:51 4 order by block#;

 FILE#     BLOCK# STATUS
---------- ---------- ----------
         4        136 xcur
         4        137 xcur
         4        138 xcur
         4        139 xcur
         4        140 xcur
         4        141 xcur
         4        142 xcur
         4        143 xcur
        11        688 xcur
        11        689 xcur
        11        690 xcur
        11        690 cr
        11        691 xcur
        11        692 xcur
        11        693 xcur
        11        694 xcur
        11        695 xcur
17 rows selected.
登录后复制

查看x$bh,返回了block的touch count信息,表示了块的热点程度,现在最热的块是690,此块应该是段头块。

13:56:05 SYS@ test1 >select header_file,header_block from dba_segments
13:56:25   2   where owner='SCOTT' and segment_name='T1';
HEADER_FILE HEADER_BLOCK
----------- ------------
         11          690
登录后复制

手工清空buffer_cache:

14:03:30 SYS@ test1 >alter system flush buffer_cache;
System altered.

14:06:02 SYS@ test1 >select file#,dbablk,tch from x$bh where obj=(select data_object_id from dba_objects where owner='SCOTT' AND object_name='T1') order by dbablk;
no rows selected

14:06:16 SYS@ test1 >select file#,block#,status from v$bh where objd=(select data_object_id from dba_objects where owner='SCOTT' and object_name='T1') order by block#;
no rows selected
登录后复制

统计一个object的非free状态的v$bh的记录数,基本就反映了一个对象再data buffer中被cache的块数。

14:10:29 SYS@ test1 >select count(*) from v$bh where objd=

14:10:45 2 (select data_object_id from dba_objects

14:10:59 3 where owner='SCOTT' and object_name='T1')

14:11:23 4 and status !='free';

COUNT(*)

----------

0

对t1表进行事务操作:

14:12:05 SCOTT@ test1 >insert into t1 values (5001);
1 row created.
Elapsed: 00:00:00.00

14:13:38 SCOTT@ test1 >commit;
Commit complete.

14:13:12 SYS@ test1 >select count(*) from v$bh where objd=
  2  (select data_object_id from dba_objects
  3   where owner='SCOTT' and object_name='T1')
  4* and status !='free'
  COUNT(*)
----------
         4
登录后复制

14:13:43 SYS@ test1 >select file#,block#,status from v$bh where objd=(select data_object_id from dba_objects where owner='SCOTT' and object_name='T1') order by block#;

 FILE#     BLOCK# STATUS
---------- ---------- ----------
         4        143 xcur
        11        688 xcur
        11        689 xcur
        11        690 xcur
登录后复制

(2)热点块问题
x$bh的touch count,这个数字将作为LRU算法的一个重要参考信息,如果一个块被多次访问,每次访问都会导致该块的记录加一。

1)查看t1的object_id

14:26:37 SYS@ test1 >select data_object_id from dba_objects
14:26:56   2   where owner='SCOTT' and object_name='T1';
DATA_OBJECT_ID
--------------
         16399
登录后复制

2)查看block 143的tch

14:29:05 SYS@ test1 >select tch from x$bh
14:29:20   2   where obj=16399 and dbablk=143 and file#=4 and tch>0;
       TCH
----------
         1
登录后复制

3)访问block 143

采用了dbms_rowid.rowid_create函数来创建rowid,表示新创建的rowid类型为扩展rowid,类型为1;data_object_id为16399;数据文件id为4;块的id为143;行数为一行(0)。

登录后复制
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系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)

修复:Windows 11 的动态刷新率不起作用 修复:Windows 11 的动态刷新率不起作用 Apr 13, 2023 pm 08:52 PM

您可以通过计算图像每秒更新的次数来衡量屏幕的刷新率。DRR 是 Windows 11 中包含的一项新功能,可帮助您节省电池寿命,同时仍提供更流畅的显示,但当它无法正常工作时也就不足为奇了。随着越来越多的制造商宣布计划停止生产 60Hz 显示器,具有更高刷新率的屏幕预计将变得更加普遍。这将导致更流畅的滚动和更好的游戏,但它会以减少电池寿命为代价。但是,此 OS 迭代中的动态刷新率功能是一个漂亮的附加功能,可以对您的整体体验产生重大影响。继续阅读,我们将讨论如果 Windows 11 的动态刷新率未

如何在 iPhone 屏幕录制中隐藏动态岛和红色指示器 如何在 iPhone 屏幕录制中隐藏动态岛和红色指示器 Apr 13, 2023 am 09:13 AM

在iPhone上,Apple 的屏幕录制功能会录制您在屏幕上所做的事情的视频,如果您想捕捉游戏玩法、引导他人完成应用程序中的教程、演示错误或其他任何事情,这非常有用。在显示屏顶部有凹口的旧款 iPhone 上,该凹口在屏幕录制中不可见,这是应该的。但在带有 ‌Dynamic Island‌ 切口的较新 iPhone 上,例如 ‌iPhone 14 Pro‌ 和 ‌iPhone 14 Pro‌ Max,‌Dynamic Island‌ 动画显示红色录制指示器,这导致切口在捕获的视频中可见。这可能会

将VirtualBox固定磁盘转换为动态磁盘,反之亦然 将VirtualBox固定磁盘转换为动态磁盘,反之亦然 Mar 25, 2024 am 09:36 AM

在创建虚拟机时,系统会要求您选择磁盘类型,您可以选择固定磁盘或动态磁盘。如果您选择了固定磁盘,后来意识到需要动态磁盘,或者相反,该怎么办?好!你可以把一种转换成另一种。在这篇文章中,我们将看到如何将VirtualBox固定磁盘转换为动态磁盘,反之亦然。动态磁盘是一种虚拟硬盘,它最初具有较小的大小,随着您在虚拟机中存储数据,其大小会相应增长。动态磁盘在节省存储空间方面非常高效,因为它们只占用所需的主机存储空间。然而,随着磁盘容量的扩展,可能会稍微影响计算机的性能。固定磁盘和动态磁盘是虚拟机中常用的

iOS 17 的待机模式将正在充电的 iPhone 变成家庭集线器 iOS 17 的待机模式将正在充电的 iPhone 变成家庭集线器 Jun 06, 2023 am 08:20 AM

iOS17中的Apple正在引入待机模式,这是一种新的显示体验,专为水平方向的充电iPhone而设计。处于这个位置的iPhone能够显示一系列全屏小部件,将其变成一个有用的家庭中心。待机模式会在水平放置在充电器上运行iOS17的iPhone上自动激活。您可以查看时间、天气、日历、音乐控制、照片等信息。您可以通过可用的待机选项向左或向右滑动,然后长按或向上/向下滑动以进行自定义。例如,随着时间的流逝,您可以从模拟视图、数字视图、气泡字体和日光视图中进行选择,其中背景颜色会根据时间而变化。有一些选项

如何在 Windows 11 上将动态磁盘转换为基本磁盘 如何在 Windows 11 上将动态磁盘转换为基本磁盘 Sep 23, 2023 pm 11:33 PM

如果要在Windows11中将动态磁盘转换为基本磁盘,则应首先创建备份,因为该过程将擦除其中的所有数据。为什么要在Windows11中将动态磁盘转换为基本磁盘?根据Microsoft,动态磁盘已从Windows中弃用,不再推荐使用。此外,Windows家庭版不支持动态磁盘,因此您将无法访问这些逻辑驱动器。如果要将更多磁盘合并到更大的卷中,建议使用基本磁盘或存储空间。在本文中,我们将向您展示如何在Windows11上将动态磁盘转换为基本磁盘如何在Windows11中将动态磁盘转换为基本磁盘?在开始

如何在Vue中实现可编辑的表格 如何在Vue中实现可编辑的表格 Nov 08, 2023 pm 12:51 PM

在许多Web应用程序中,表格是必不可少的一个组件。表格通常具有大量数据,因此表格需要一些特定的功能来提高用户体验。其中一个重要的功能是可编辑性。在本文中,我们将探讨如何使用Vue.js实现可编辑的表格,并提供具体的代码示例。步骤1:准备数据首先,我们需要为表格准备数据。我们可以使用JSON对象来存储表格的数据,并将其存储在Vue实例的data属性中。在本例中

如何在 Windows 11 的桌面和开始菜单上获取动态磁贴 如何在 Windows 11 的桌面和开始菜单上获取动态磁贴 Apr 14, 2023 pm 05:07 PM

想象一下,您正在系统上寻找某些东西,但不确定要打开或选择哪个应用程序。这就是动态磁贴功能发挥作用的地方。任何支持的应用程序的动态磁贴都可以添加到桌面或Windows系统的开始菜单上,其磁贴经常变化。LiveTiles使应用程序小部件变得活跃起来,非常令人愉悦。不仅是为了它的外观,甚至是为了方便。假设您在系统上使用whatsapp或facebook应用程序,如果在应用程序图标上显示通知数量不是很方便吗?如果将任何此类受支持的应用程序添加为动态磁贴,则这是可能的。让我们看看如何在Windows

Laravel开发:如何使用Laravel View生成视图? Laravel开发:如何使用Laravel View生成视图? Jun 14, 2023 pm 03:28 PM

Laravel是目前最流行的PHP框架之一,其强大的视图生成能力是让人印象深刻的一点。视图是Web应用程序中展示给用户的页面或视觉元素,其中包含HTML、CSS和JavaScript等代码。LaravelView允许开发者使用结构化的模板语言来构建网页,同时通过控制器和路由生成相应的视图。在本文中,我们将探讨如何使用LaravelView生成视图。一、什

See all articles