`
itspace
  • 浏览: 982196 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Oracle 高水位线(high water mask)在不同段管理模式下的推进

阅读更多

众所周知,Oracle高水位线标志着该线以下的block均被Oracle格式过,通俗一点讲就是该高水位线以下的block都被Oracle使用过。
通常在执行insert操作时,当高水位线以下block不够用时,Oracle将会推进高水位线。更进一步讲,当有多个进程在同时进行insert操作时,比较
容易引起高水位线争用,主要表现为enq: HW - contention。这在段管理模式为手动的情况下(SEGMENT SPACE MANAGEMENT MANUAL),更加容易发生。
本文所探讨的是,Oracle高水位线如何在不同段管理模式下手动推进。
一、在段管理模式为手动时,block主要由freelist管理
(1)首先创建测试表空间,注意关键字SEGMENT SPACE MANAGEMENT MANUAL
SQL>  create tablespace zhoul2 datafile '/oradata/mcstar/zhoul201.dbf' size 20m autoextend on SEGMENT SPACE MANAGEMENT MANUAL;

Tablespace created.

SQL> conn /as sysdba
Connected.
SQL> create  user zhoul2 identified by zhoul2 default tablespace zhoul2;

User created.

SQL> grant dba to zhoul2;

Grant succeeded.

(2)创建测试表格,并对其进行100%采样,观察其高水位线标记
SQL> conn zhoul2/zhoul2
Connected.
SQL> create table zhoul2test as select * from sys.obj$;

Table created.

SQL> exec DBMS_STATS.GATHER_TABLE_STATS (ownname=>user,tabname=>'ZHOUL2TEST',estimate_percent=>100);

PL/SQL procedure successfully completed.

查看zhoul2test表格占用空间
SQL> select sum(blocks) from dba_extents where owner='ZHOUL2' and segment_name='ZHOUL2TEST';

SUM(BLOCKS)
-----------
       1024

查看zhoul2test高水位线block
SQL> select BLOCKS from dba_tables where OWNER='ZHOUL2' and TABLE_NAME='ZHOUL2TEST';

    BLOCKS
----------
       895
(3)手动推进高水位线,并分析表格,可以看到高水位线已经推进至1023,并占用1152个block空间
SQL>  alter table zhoul2test allocate extent (instance 1);

Table altered.

SQL> exec DBMS_STATS.GATHER_TABLE_STATS (ownname=>user,tabname=>'ZHOUL2TEST',estimate_percent=>100);

PL/SQL procedure successfully completed.

SQL> select sum(blocks) from dba_extents where owner='ZHOUL2' and segment_name='ZHOUL2TEST';

SUM(BLOCKS)
-----------
       1152
      

SQL>  select BLOCKS from dba_tables where OWNER='ZHOUL2' and TABLE_NAME='ZHOUL2TEST';

    BLOCKS
----------
      1023
那我们再来看看不加instance属性的分配语句,看看是否也会推进高水位线
SQL>  alter table zhoul2test allocate extent;

Table altered.

SQL> exec DBMS_STATS.GATHER_TABLE_STATS (ownname=>user,tabname=>'ZHOUL2TEST',estimate_percent=>100);

PL/SQL procedure successfully completed.
可以看到,在执行上述语句之后,Oracle只会给ZHOUL2TEST分配空间,但并不会推高水位线。
SQL> select sum(blocks) from dba_extents where owner='ZHOUL2' and segment_name='ZHOUL2TEST';

SUM(BLOCKS)
-----------
       1280
      
SQL> select BLOCKS from dba_tables where OWNER='ZHOUL2' and TABLE_NAME='ZHOUL2TEST';

    BLOCKS
----------
      1023
在这里再引申一下,在rac环境下,alter table *** allocate extent (instance 1)的用法。在rac环境下,当表空间为手动段管理模式时,
当有多个会话同时插入一张表时,由于存在GCS,多个节点需要同步插入块的状态,极容易引起全局范围的热块等待,或者全局范围内的块请求。
针对这一情况,Oracle推出了freelist groups技术。如将表格属性修改为freelists 100 freelist groups 2后,再将表格按照如下语法进行extent预分配:
alter table *** allocate extent (size 10m instance 1);
alter table *** allocate extent (size 10m instance 2);
此时,每个freelist group会有多个freelist,Oracle选择block插入时,会根据instance id进行hash运算,已确定使用哪个freelist group下的freelist。
采用此方法,可以有效避免高水位线的争用和热块在实例间的传输。
**************
二、在段管理模式为自动时,block主要由assm管理
在表空间创建时,如果指定语法SEGMENT SPACE MANAGEMENT AUTO,则表示block由assm管理。
首先验证一下 alter table *** allocate extent (instance 1)是否在ASSM管理模式下也会推进高水位线?
SQL> exec DBMS_STATS.GATHER_TABLE_STATS (ownname=>user,tabname=>'ZHOULTEST',estimate_percent=>100);

PL/SQL procedure successfully completed.

SQL> select sum(blocks) from dba_extents where owner='ZHOUL' and segment_name='ZHOULTEST';

SUM(BLOCKS)
-----------
      11136
     
SQL> select BLOCKS from dba_tables where OWNER='ZHOUL' and TABLE_NAME='ZHOULTEST';

    BLOCKS
----------
     10115
     
执行手动分配语句,并再次进行100%采样
SQL> alter table zhoultest  allocate extent (size 10m instance 1);

Table altered.

SQL> exec DBMS_STATS.GATHER_TABLE_STATS (ownname=>user,tabname=>'ZHOULTEST',estimate_percent=>100);

PL/SQL procedure successfully completed.
可以看到在物理空间增加的同时,在assm管理模式下,手动推进并不会提高高水位线
SQL>  select sum(blocks) from dba_extents where owner='ZHOUL' and segment_name='ZHOULTEST';

SUM(BLOCKS)
-----------
      12416

SQL>  select BLOCKS from dba_tables where OWNER='ZHOUL' and TABLE_NAME='ZHOULTEST';

    BLOCKS
----------
     10115
    
再次使用Oracle提供的脚本进行高水位查看,详见metalink doc 820043.1
set serveroutput on

declare
TOTAL_BLOCKS number;
TOTAL_BYTES number;
UNUSED_BLOCKS number;
UNUSED_BYTES number;
LAST_USED_EXTENT_FILE_ID number;
LAST_USED_EXTENT_BLOCK_ID number;
LAST_USED_BLOCK number;

begin
     dbms_space.unused_space(
         'ZHOUL',
         'ZHOULTEST',
         'TABLE',
         TOTAL_BLOCKS,
         TOTAL_BYTES,
         UNUSED_BLOCKS,
         UNUSED_BYTES,
         LAST_USED_EXTENT_FILE_ID,
         LAST_USED_EXTENT_BLOCK_ID,
         LAST_USED_BLOCK);

     dbms_output.put_line('OBJECT_NAME = FREELIST_T');
     dbms_output.put_line('-----------------------------------');
     dbms_output.put_line('TOTAL_BLOCKS = '||TOTAL_BLOCKS);
     dbms_output.put_line('UNUSED_BLOCKS = '||UNUSED_BLOCKS);
     dbms_output.put_line('LAST_USED_EXTENT_BLOCK_ID = '||LAST_USED_EXTENT_BLOCK_ID);
     dbms_output.put_line('LAST_USED_BLOCK = '||LAST_USED_BLOCK);
end;
/
输出结果为:
OBJECT_NAME = FREELIST_T
-----------------------------------
TOTAL_BLOCKS = 12416
UNUSED_BLOCKS = 2176
LAST_USED_EXTENT_BLOCK_ID = 3593
LAST_USED_BLOCK = 1024

PL/SQL procedure successfully completed.

查看在ASSM下,高水位block的分布情况
set serveroutput on

declare
v_unformatted_blocks number;
v_unformatted_bytes number;
v_fs1_blocks number;
v_fs1_bytes number;
v_fs2_blocks number;
v_fs2_bytes number;
v_fs3_blocks number;
v_fs3_bytes number;
v_fs4_blocks number;
v_fs4_bytes number;
v_full_blocks number;
v_full_bytes number;

begin
     dbms_space.space_usage (
         'ZHOUL',
         'ZHOULTEST',
         'TABLE',
       v_unformatted_blocks,
       v_unformatted_bytes,
       v_fs1_blocks,
       v_fs1_bytes,
       v_fs2_blocks,
       v_fs2_bytes,
       v_fs3_blocks,
       v_fs3_bytes,
       v_fs4_blocks,
       v_fs4_bytes,
       v_full_blocks,
       v_full_bytes);

     dbms_output.put_line('Unformatted Blocks                       = '||v_unformatted_blocks);
     dbms_output.put_line('Blocks with 00-25% free space   = '||v_fs1_blocks);
     dbms_output.put_line('Blocks with 26-50% free space   = '||v_fs2_blocks);
     dbms_output.put_line('Blocks with 51-75% free space   = '||v_fs3_blocks);
     dbms_output.put_line('Blocks with 76-100% free space = '||v_fs4_blocks);
     dbms_output.put_line('Full Blocks                                        = '||v_full_blocks);

end;
/

输出结果为
Unformatted Blocks              = 0
Blocks with 00-25% free space   = 17
Blocks with 26-50% free space   = 0
Blocks with 51-75% free space   = 0
Blocks with 76-100% free space  = 212
Full Blocks                     = 9868

PL/SQL procedure successfully completed.

10115-(17+212+9868)=18,那么这18个块去哪里了呢?
SQL> select HEADER_FILE,HEADER_BLOCK from dba_segments where owner='ZHOUL' and segment_name='ZHOULTEST';

HEADER_FILE HEADER_BLOCK
----------- ------------
          7         5131




SQL> alter system dump datafile 7 block 5131;

System altered.
找到跟踪文件,可以看到表格ZHOULTEST 第一级位图的High HWM block=Low HWM block=0x01c00e0c,转换之后为file#=7,block#=3596
  --------------------------------------------------------
  Low HighWater Mark :
      Highwater::  0x01c01209  ext#: 80     blk#: 1024   ext size: 1024 
  #blocks in seg. hdr's freelists: 0    
  #blocks below: 10240
  mapblk  0x00000000  offset: 80   
  Level 1 BMB for High HWM block: 0x01c00e0c
  Level 1 BMB for Low HWM block: 0x01c00e0c

通过bbed查看file#=7,block#=3596,由数据文件头0x20转换成十进制数字32后,可知这是FIRST LEVEL BITMAP BLOCK
BBED> dump block 3596
File: /oradata/mcstar/zhoul01.dbf (0)
Block: 3596             Offsets:    0 to  511           Dba:0x00000000
------------------------------------------------------------------------
20a20000 0c0ec001 bfb54407 000a0104 27ae0000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 04000000 ffffffff 00000000 00000000 00010000
01000100 01000000 00000000 00000000 00000000 ac000000 8eea8e4d 8eea8e4d
00000000 00000000 00000000 00000000 0a14c001 8c000000 50000000 00040000
00040000 0912c001 00000000 50000000 00000000 83270000 00000000 01000000
d31b0100 00000000 00000000 0911c001 00010000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 11111111 11111111 11111111 11111111 11111111
11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111
11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111
11112111 11111111 11111111 11111111 11111111 11111111 11111111 11111111
再次dump block印证了猜想
SQL> alter system dump datafile 7 block 3596;

System altered.

ump of First Level Bitmap Block
--------------------------------
   nbits : 4 nranges: 1         parent dba:  0x01c0140a   poffset: 140  
   unformatted: 0       total: 256       first useful block: 0     
   owning instance : 1
   instance ownership changed at 03/27/2011 15:43:10
   Last successful Search 03/27/2011 15:43:10
   Freeness Status:  nf1 1      nf2 0      nf3 0      nf4 0     

   Extent Map Block Offset: 4294967295
   First free datablock : 172   
   Bitmap block lock opcode 0
   Locker xid:     :  0x0000.000.00000000
   Inc #: 0 Objd: 72659
  HWM Flag: HWM Set
      Highwater::  0x01c01209  ext#: 80     blk#: 1024   ext size: 1024 
  #blocks in seg. hdr's freelists: 0    
  #blocks below: 10115
  mapblk  0x00000000  offset: 80   
  --------------------------------------------------------
  DBA Ranges :
  --------------------------------------------------------
   0x01c01109  Length: 256    Offset: 0
  
回到刚才跟踪文件,将0x01c04509转化成10进制为file#=7 block#=17673
  。。。
  Extent 96    :  L1 dba:  0x01c04409 Data dba:  0x01c04489
  Extent 97    :  L1 dba:  0x01c04509 Data dba:  0x01c0450a 
此值刚好对应
SQL>select EXTENT_ID,block_id,BLOCKS from dba_extents where owner='ZHOUL' and segment_name='ZHOULTEST';
。。。
        96      17545        128
        97      17673        128

98 rows selected.
继续dump
SQL> alter system dump datafile 7 block 17673;

System altered.
查看dump文件可以看到很多数据块均为格式化:
Dump of First Level Bitmap Block
--------------------------------
   nbits : 4 nranges: 1         parent dba:  0x01c0140a   poffset: 149  
   unformatted: 127     total: 128       first useful block: 1     
   owning instance : 1
   instance ownership changed at
   Last successful Search
   Freeness Status:  nf1 0      nf2 0      nf3 0      nf4 0     

   Extent Map Block Offset: 4294967295
   First free datablock : 1     
   Bitmap block lock opcode 0
   Locker xid:     :  0x0000.000.00000000
   Inc #: 0 Objd: 72659
  --------------------------------------------------------
  DBA Ranges :
  --------------------------------------------------------
   0x01c04509  Length: 128    Offset: 0     
 
   0:Metadata   1:unformatted   2:unformatted   3:unformatted
   4:unformatted   5:unformatted   6:unformatted   7:unformatted
   8:unformatted   9:unformatted   10:unformatted   11:unformatted
   12:unformatted   13:unformatted   14:unformatted   15:unformatted
   16:unformatted   17:unformatted   18:unformatted   19:unformatted
   20:unformatted   21:unformatted   22:unformatted   23:unformatted
   24:unformatted   25:unformatted   26:unformatted   27:unformatted
   28:unformatted   29:unformatted   30:unformatted   31:unformatted
   32:unformatted   33:unformatted   34:unformatted   35:unformatted
  。。。
也就意味在assm下,数据高水位线随着extent的扩展而自动推进,当然全表扫描将扫描第一级位图的High HWM block以下的数据。



此试验也验证了tom书中Oracle9i10g编程艺术的话:
In an ASSM tablespace, however,there is an HWM and a low HWM (see Figure 10-2). In MSSM, when the HWM is advanced
(e.g., as rows are inserted), all of the blocks are formatted and valid, and Oracle can read
themsafely. With ASSM, however, when the HWM is advanced, Oracle doesn’t format all of the
blocks immediately—they are only formatted and made safe to read upon their first use. So,
when full scanning a segment, we have to know if the blocks to be read are “safe” or unformat-
ted (meaning they contain nothing of interest and we do not process them). To make it so that
not every block in the table need go through this safe/not safe check, Oracle maintains a low
HWM and an HWM. Oracle will full scan the table up to the HWM—and for all of the blocks
below the low HWM, it will just read and process them. For blocks between the low HWM and
the HWM, it must be more careful and refer to the ASSM bitmap information used to manage
these blocks to see which of them it should read and which it should just ignore.
  • 大小: 9.9 KB
分享到:
评论

相关推荐

    oracle高水位线

    Oracle 高水位线(High Water Mark,HWM)是 Oracle 段中一个重要的概念,它标志着段中已经使用的数据块的上限。在 Oracle 中,每个段(包括表、索引等)都有一个高水位线,用于记录该段已经使用的数据块的数量。 ...

    高水位(High_Water_Mark)的概念及高水位问题的解决

    Oracle 高水位(High Water Mark)概念及解决问题详解 Oracle 高水位(High Water Mark)是指 Oracle 数据库中表空间的物理存储单元中的最大使用块数,超过这个点,数据库的查询效率将受到影响。Oracle 数据库的...

    Oracle_高水位(HWM_High_Water_Mark)_说明.rar_High Water_Oracle 高水位

    Oracle数据库中的“高水位”(High Water Mark, HWM)是表空间管理的一个关键概念,它对于数据库的性能和空间利用率有着深远的影响。本文将深入解析高水位的概念、作用,以及如何调整以优化存储效率。 高水位(HWM...

    oracle高水位.txt

    在Oracle数据库中,“高水位”(High Water Mark,HWM)是一个非常重要的概念。它标记了数据表中最后一次插入、更新或删除操作的位置。简单来说,高水位线以下的空间是已经被使用过的空间,而高水位线以上的空间则是...

    高水位线详解

    在 Oracle 数据的存储中,可以把存储空间想象为一个水库,数据想象为水 库中的水。水库中的水的位置有一条线叫做水位线,在 Oracle 中,这条线被称为`高水位线(High-warter mark, HWM)

    Oracle 高水位概念(hwm)

    其中,“高水位”(High Water Mark,简称HWM)是Oracle数据库中的一个重要概念,它与表空间、段、区和块等存储结构密切相关。本篇文章将深入探讨Oracle高水位的概念、作用以及其在数据库操作中的影响。 高水位...

    浅谈ORACLE高水位线的解决方法.pdf

    浅谈ORACLE高水位线的解决方法.pdf

    Oracle19c数据库高水位线(HWM)详解与操作指南

    内容概要:本文详细介绍了 Oracle 19c 数据库中的高水位线 (High Water Mark, HWM) 概念及其操作。首先解释了 HWM 的定义和特点,随后探讨了 HWM 对全表扫描和插入操作的影响。文中通过具体的 SQL 示例,展示了如何...

    oracle 高端水位

    在Oracle数据库管理领域,“高端水位”(High Water Mark,简称HWM)是一个关键概念,它涉及到数据库的逻辑存储结构、数据管理以及性能优化。理解Oracle的高端水位对于数据库管理员(DBA)和开发人员至关重要,因为它...

    Oracle降低高水位的方法

    在Oracle数据库中,高水位(High Water Mark, HWM)是衡量表数据存储位置的一个关键概念。它标识了表中数据曾经达到的最高存储位置。每当向表中插入、更新或删除数据时,Oracle数据库会自动管理数据的存储位置。值得...

    Oracle High Availability, Disaster Recovery, and Cloud Services

    Oracle数据库在IT行业中以其高性能、高可用性和安全性著称,特别是在企业级应用中。"Oracle High Availability, Disaster Recovery, and Cloud Services"这个主题涵盖了数据库系统的稳定性、灾备方案以及云计算服务...

    Oracle Freelist和HWM原理及性能优化

    HWM(High Water Mark),即高水位线,是段内的一个标记,指示了数据的最高达到位置。当数据被删除后,块虽然变为空闲,但HWM并不会自动下移,除非使用`ALTER TABLE ... DEALLOCATE UNUSED`命令。HWM的存在影响了...

    Oracle 12c体系结构学习实验笔记

    Oracle 12c实验-段和高水位线.pdf Oracle 12c实验-管理表空间.pdf Oracle 12c实验-管理归档重做日志.pdf Oracle 12c实验-管理控制文件.pdf Oracle 12c实验-管理数据文件和临时文件.pdf Oracle 12c实验-管理重做日志....

    ORACLE 空闲空间管理 PDF

    3. **高水线**(High Water Mark, HWM):标记段中曾经达到过的最大已使用空间位置。HWM之上的块从未被使用过,而HWM之下的块则曾经被使用过。 #### 空闲空间管理方法 ##### Freelist管理 在Oracle早期版本中,...

    如何在安装32位Oracle客户端组件的情况下以64位模式运行.

    ### 如何在安装32位Oracle客户端组件的情况下以64位模式运行 #### 背景与问题描述 在开发环境中,特别是在使用Microsoft Visual Studio 2005进行.NET应用程序开发时,可能会遇到一个常见的问题:如何在已安装32位...

    Oracle9i模式对象.pptx

    High Water Mark 是 Oracle 9i 数据库中的一种机制,用于标记当前表的高水位线。可以通过查询 LAST_USED_EXTENT_FILE_ID, LAST_USED_EXTENT_BLOCK_ID, TOTAL_BLOCKS, UNUSED_BLOCK 等信息来找到 High Water Mark。

    Oracle High-Performance Tuning with STATSPACK 中文版

    Oracle High-Performance Tuning with STATSPACK 是一本专注...通过深入理解和熟练应用Oracle High-Performance Tuning with STATSPACK,数据库管理员能够有效提升Oracle数据库的运行效率,确保系统的稳定性和高性能。

    oracle 日志文件管理

    在这种模式下,Oracle 将每次修改操作写入日志文件,然后将日志文件备份到一个安全的位置,以便在需要时恢复数据库。这种模式可以确保数据库的高可用性和可恢复性。 非归档日志模式(NOARCHIVELOG) 非归档日志模式...

    oracle的模式管理及数据完整性

    文章详细讲述了oracle的模式管理和数据完整性的定义及其理解。

Global site tag (gtag.js) - Google Analytics