Oracle 自動段空間管理(ASSM:auto segment space management)-[轉]


一. 官網說明

Logical Storage Structures

http://download.oracle.com/docs/cd/E11882_01/server.112/e16508/logical.htm#CNCPT7668

 

其中有關ASSM 的內容如下:

 

Logical Space Management

Oracle Database must use logical space management to track and allocate the extents in a tablespace. When a database object requires an extent, the database must have a method of finding and providing it. Similarly, when an object no longer requires an extent, the database must have a method of making the free extent available.

Oracle Database manages space within a tablespace based on the type that you create. You can create either of the following types of tablespaces:

·         Locally managed tablespaces (default)

The database uses bitmaps in the tablespaces themselves to manage extents. Thus, locally managed tablespaces have a part of the tablespace set aside for a bitmap. Within a tablespace, the database can manage segments with automatic segment space management (ASSM) or manual segment space management (MSSM).

·         Dictionary-managed tablespaces

The database uses the data dictionary to manage extents (see "Overview of the Data Dictionary").

Figure 12-3 shows the alternatives for logical space management in a tablespace.

Figure 12-3 Logical Space Management


Description of "Figure 12-3 Logical Space Management"

Locally Managed Tablespaces

A locally managed tablespace maintains a bitmap in the data file header to track free and used space in the data file body. Each bit corresponds to a group of blocks. When space is allocated or freed, Oracle Database changes the bitmap values to reflect the new status of the blocks.

The following graphic is a conceptual representation of bitmap-managed storage. A 1 in the header refers to used space, whereas a 0 refers to free space.

A locally managed tablespace has the following advantages:

·         Avoids using the data dictionary to manage extents

Recursive operations can occur in dictionary-managed tablespaces if consuming or releasing space in an extent results in another operation that consumes or releases space in a data dictionary table or undo segment.

·         Tracks adjacent free space automatically

In this way, the database eliminates the need to coalesce free extents.

·         Determines the size of locally managed extents automatically

Alternatively, all extents can have the same size in a locally managed tablespace and override object storage options.

Note:

Oracle strongly recommends the use of locally managed tablespaces with Automatic Segment Space Management.

Segment space management is an attribute inherited from the tablespace that contains the segment. Within a locally managed tablespace, the database can manage segments automatically or manually. For example, segments in tablespace users can be managed automatically while segments in tablespace tools are managed manually.

Automatic Segment Space Management

The ASSM method uses bitmaps to manage space. Bitmaps provide the following advantages:

·         Simplified administration

ASSM avoids the need to manually determine correct settings for many storage parameters. Only one crucial SQL parameter controls space allocation: PCTFREE. This parameter specifies the percentage of space to be reserved in a block for future updates (see "Percentage of Free Space in Data Blocks").

ASSM 管理,只需要一個參數:PCTFREE

·         Increased concurrency

Multiple transactions can search separate lists of free data blocks, thereby reducing contention and waits. For many standard workloads, application performance with ASSM is better than the performance of a well-tuned application that uses MSSM.

·         Dynamic affinity of space to instances in an Oracle Real Application Clusters (Oracle RAC) environment

ASSM is more efficient and is the default for permanent, locally managed tablespaces.

Note:

This chapter assumes the use of ASSM in all of its discussions of logical storage space.

 

Manual Segment Space Management

The legacy MSSM method uses a linked list called a free list to manage free space in the segment. For a database object that has free space, a free list keeps track of blocks under the high water mark (HWM), which is the dividing line between segment space that is used and not yet used. As blocks are used, the database puts blocks on or removes blocks from the free list as needed.

In addition to PCTFREE, MSSM requires you to control space allocation with SQL parameters such as PCTUSED, FREELISTS, and FREELIST GROUPS. PCTUSED sets the percentage of free space that must exist in a currently used block for the database to put it on the free list. For example, if you set PCTUSED to 40 in a CREATE TABLE statement, then you cannot insert rows into a block in the segment until less than 40% of the block space is used.

As an illustration, suppose you insert a row into a table. The database checks a free list of the table for the first available block. If the row cannot fit in the block, and if the used space in the block is greater than or equal to PCTUSED, then the database takes the block off the list and searches for another block. If you delete rows from the block, then the database checks whether used space in the block is now less than PCTUSED. If so, then the database places the block at the beginning of the free list.

An object may have multiple free lists. In this way, multiple sessions performing DML on a table can use different lists, which can reduce contention. Each database session uses only one free list for the duration of its session.

As shown in Figure 12-4, you can also create an object with one or more free list groups, which are collections of free lists. Each group has a master free list that manages the individual process free lists in the group. Space overhead for free lists, especially for free list groups, can be significant.

Figure 12-4 Free List Groups


Description of "Figure 12-4 Free List Groups"

Managing segment space manually can be complex. You must adjust PCTFREE and PCTUSED to reduce row migration (see "Chained and Migrated Rows") and avoid wasting space. For example, if every used block in a segment is half full, and if PCTUSED is 40, then the database does not permit inserts into any of these blocks. Because of the difficulty of fine-tuning space allocation parameters, Oracle strongly recommends ASSM. In ASSM, PCTFREE determines whether a new row can be inserted into a block, but it does not use free lists and ignores PCTUSED.

-- ASSM 會忽略PCTUSED 參數

Dictionary-Managed Tablespaces

A dictionary-managed tablespace uses the data dictionary to manage its extents. Oracle Database updates tables in the data dictionary whenever an extent is allocated or freed for reuse. For example, when a table needs an extent, the database queries the data dictionary tables, and searches for free extents. If the database finds space, then it modifies one data dictionary table and inserts a row into another. In this way, the database manages space by modifying and moving data.

The SQL that the database executes in the background to obtain space for database objects is recursive SQL. Frequent use of recursive SQL can have a negative impact on performance because updates to the data dictionary must be serialized. Locally managed tablespaces, which are the default, avoid this performance problem.

 

.  ASSM 說明

 

            Orale 9i以前,表的剩余空間的管理與分配都是由鏈接列表freelist來完成的,因為freelist存在串行的問題因此容易引起往往容易引起段頭的爭用與空間的浪費(其實這一點並不明顯),最主要的還是因為需要DBA 花費大量的精力去管理這些爭用並監控表的空間利用。  

            自動段空間管理(ASSM),它首次出現在Oracle 920里。有了ASSM,鏈接列表freelist位圖所取代,它是一個二進制的數組,能夠迅速有效地管理存儲擴展和剩余區塊(free block),因此能夠改善分段存儲本質,ASSM表空間上創建的段還有另外一個稱呼叫Bitmap Managed SegmentsBMB 段)。  


讓我們看看位圖freelist是如何實現的。從使用區段空間管理自動參數創建tablespace開始:  
create tablespace demo  
datafile '/ora01/oem/demo01.dbf '  
size 5m  
EXTENT MANAGEMENT LOCAL -- Turn on LMT  
SEGMENT SPACE MANAGEMENT AUTO -- Turn on ASSM;  

一旦你定義好了tablespace,那么表和索引就能夠使用各種方法很容易地被移動到新的tablespace里,帶有ASSM的本地管理tablespace會略掉任何為PCTUSEDNEXTFREELISTS所指定的值  


           
當表格或者索引被分配到這個tablespace以后,用於獨立對象的PCTUSED的值會被忽略,而Oracle9i會使用位圖數組來自動地管理tablespace里表格和索引的freelist。對於在LMTtablespace內部創建的表格和索引而言,這個NEXT擴展子句是過時的,因為由本地管理的tablespace會管理它們。但是,INITIAL參數仍然是需要的,因為Oracle不可能提前知道初始表格加載的大小。對於ASSM而言,INITIAL最小的值是三個塊  


           
新的管理機制用位圖來跟蹤或管理每個分配到對象的塊,每個塊有多少剩余空間根據位圖的狀態來確定,如>75%,50%-75%,25%-50%<25%,也就是說位圖其實采用了四個狀態位來代替以前的pctused,什么時候該利用該數據塊則由設定的pctfree來確定。  


            使用ASSM的一個巨大優勢是,位圖freelist肯定能夠減輕緩沖區忙等待buffer busy wait)的負擔,這個問題在Oracle9i以前的版本里曾是一個嚴重的問題  


            在沒有多個freelist的時候,每個Oracle表格和索引在表格的頭部都曾有一個數據塊,用來管理對象所使用的剩余區塊,並為任何SQL插入聲明所創建的新數據行提供數據塊。當數據緩沖內的數據塊由於被另一個DML事務處理鎖定而無法使用的時候,緩沖區忙等待就會發生。當你需要將多個任務插入到同一個表格里的時候,這些任務就被強制等待,而同時Oracle會在同時分派剩余的區塊,一次一個。  


            有了ASSM之后,Oracle宣稱顯著地提高了DML並發操作的性能因為(同一個)位圖的不同部分可以被同時使用,這樣就消除了尋找剩余空間的串行化。根據Oracle的測試結果,使用位圖freelist會消除所有分段頭部(對資源)的爭奪,還能獲得超快的並發插入操作 


盡管ASSM顯示出了令人激動的特性並能夠簡化Oracle DBA的工作,但是Oracle9i的位圖分段管理還是有一些局限性的:  
            1.
一旦DBA被分配之后,它就無法控制tablespace內部的獨立表格和索引的存儲行為。
  
            2.
大型對象不能夠使用ASSM,而且必須為包含有LOB數據類型的表格創建分離的tablespace
  
            3.
你不能夠使用ASSM創建臨時的tablespace。這是由排序時臨時分段的短暫特性所決定的。
  
            4.
只有本地管理的tablespace才能夠使用位圖分段管理。
  
            5·
使用超高容量的DML(例如INSERTUPDATEDELETE等)的時候可能會出現性能上的問題。



. 相關測試:
  
1、我們先創建一個本地管理的表空間,采用段自動管理方式  
/* Formatted on 2009-12-7 19:17:33 (QP5 v5.115.810.9015) */

CREATE TABLESPACE demo

DATAFILE 'D:/demo01.dbf'

SIZE 50M

EXTENT MANAGEMENT LOCAL          --一定是本地管理

SEGMENT SPACE MANAGEMENT AUTO;   --ASSM管理的標志
  
2、創建同樣一個表  
/* Formatted on 2009-12-7 19:18:00 (QP5 v5.115.810.9015) */

CREATE TABLE demotab (x NUMBER)

TABLESPACE demo

STORAGE (INITIAL 1000 K);

 


我們指定初試區間大小是1000K
  
/* Formatted on 2009-12-7 19:18:37 (QP5 v5.115.810.9015) */

SELECT   t.table_name,

         t.initial_extent,

         t.next_extent,

         t.pct_free,

         t.pct_used

 FROM   user_tables t

 WHERE   t.table_name = 'DEMOTAB';

 


TABLE_NAME  INITIAL_EXTENT  NEXT_EXTENT  PCT_FREE  PCT_USED  
-----------------------  --------------       ---------------     ----------------  -------------------  
DEMOTAB          1024000                               10
  
可以看到,NEXT_EXTENTPCT_USED都為空。
  
  
3、執行該過程,檢查表的初始狀態  

exec show_space('demotab','auto','T','Y');  --show_space() 代碼見附件
Total Blocks............................128

Total Bytes.............................1048576

Unused Blocks...........................125

Unused Bytes............................1024000

Last Used Ext FileId....................7

Last Used Ext BlockId...................9

Last Used Block.........................3

 *************************************************

The segment is analyzed

0% -- 25% free space blocks.............0

0% -- 25% free space bytes..............0

25% -- 50% free space blocks............0

25% -- 50% free space bytes.............0

50% -- 75% free space blocks............0

50% -- 75% free space bytes.............0

75% -- 100% free space blocks...........0

75% -- 100% free space bytes............0

Unused Blocks...........................0

Unused Bytes............................0

Total Blocks............................0

Total bytes.............................0


從這里我們能看到一些該表的特性,其中最引人注意的就是表頭了,占用了三個塊的大小(128-125  
           
另外一個注意的地方就是該表從第9個塊開始,文件頭占用了64K的空間等於8個塊。  

我們從dba_extent中也能看到這樣的信息,是從第9個塊開始的。
  
/* Formatted on 2009-12-7 19:24:23 (QP5 v5.115.810.9015) */

SELECT   t.segment_name, t.extent_id, t.block_id

 FROM   dba_extents t

 WHERE   t.segment_name = 'DEMOTAB';

 

SEGMENT_NAME     EXTENT_ID   BLOCK_ID

---------------            ----------      ----------

DEMOTAB                  0          9

DEMOTAB                  1         17

DEMOTAB                  2         25

DEMOTAB                  3         33

DEMOTAB                  4         41

DEMOTAB                  5         49

DEMOTAB                  6         57

DEMOTAB                  7         65

DEMOTAB                  8         73

DEMOTAB                  9         81

DEMOTAB                 10         89

DEMOTAB                 11         97

DEMOTAB                 12        105

DEMOTAB                 13        113

DEMOTAB                 14        121

DEMOTAB                 15        129

從這里可以看到,第一個區間的開始塊是9
  
4、我直接開始分析第91011個塊(段頭)  


SQL> alter system dump datafile 7 block 9;  
System altered  
SQL> alter system dump datafile 7 block 10;  
System altered  
SQL> alter system dump datafile 7 block 11;  
System altered
  
  

進入Udump 查看剛才生成的trace 文件

*** 2009-12-07 19:30:16.406

*** SERVICE NAME:(DBA.ANQINGREN.ORG) 2009-12-07 19:30:16.390

*** SESSION ID:(123.758) 2009-12-07 19:30:16.390

Start dump data blocks tsn: 8 file#: 7 minblk 9 maxblk 9

buffer tsn: 8 rdba: 0x01c00009 (7/9)

scn: 0x0000.001a0da0 seq: 0x01 flg: 0x04 tail: 0x0da02001

frmt: 0x02 chkval: 0x44e6 type: 0x20=FIRST LEVEL BITMAP BLOCK

Hex dump of block: st=0, typ_found=1

Dump of memory from 0x085C8400 to 0x085CA400

85C8400 0000A220 01C00009 001A0DA0 04010000 [ ...............]

85C8410 000044E6 00000000 00000000 00000000 [.D..............]

85C8420 00000000 00000000 00000000 00000000 [................]

        Repeat 1 times

85C8440 00000000 00000000 00000000 00000004 [................]

85C8450 FFFFFFFF 0000000D 00000003 00000010 [................]

85C8460 00010002 00000000 00000000 00000000 [................]

85C8470 00000000 00000003 00000000 00000000 [................]

85C8480 00000000 00000000 00000000 00000000 [................]

85C8490 01C0000A 00000000 00000000 00000003 [................]

85C84A0 00000008 01C0000C 00000000 00000000 [................]

85C84B0 00000000 00000000 00000000 00000001 [................]

85C84C0 0000D302 00000000 00000000 01C00009 [................]

85C84D0 00000008 00000000 01C00011 00000008 [................]

85C84E0 00000008 00000000 00000000 00000000 [................]

85C84F0 00000000 00000000 00000000 00000000 [................]

        Repeat 8 times

85C8580 00000000 00000000 00000000 00001011 [................]

85C8590 00000000 00000000 00000000 00000000 [................]

        Repeat 485 times

85CA3F0 00000000 00000000 00000000 0DA02001 [............. ..]

Dump of First Level Bitmap Block

 --------------------------------

   nbits : 4 nranges: 2         parent dba: 0x01c0000a   poffset: 0    

   unformatted: 13      total: 16        first useful block: 3     

   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 : 3     

   Bitmap block lock opcode 0

   Locker xid:     : 0x0000.000.00000000

   Inc #: 0 Objd: 54018

 HWM Flag: HWM Set

      Highwater:: 0x01c0000c ext#: 0      blk#: 3      ext size: 8    

 #blocks in seg. hdr's freelists: 0    

 #blocks below: 0    

 mapblk 0x00000000 offset: 0    

 --------------------------------------------------------

 DBA Ranges :

 --------------------------------------------------------

   0x01c00009 Length: 8      Offset: 0     

   0x01c00011 Length: 8      Offset: 8     

 

   0:Metadata   1:Metadata   2:Metadata   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

 --------------------------------------------------------

End dump data blocks tsn: 8 file#: 7 minblk 9 maxblk 9

*** 2009-12-07 19:35:44.296

Start dump data blocks tsn: 8 file#: 7 minblk 10 maxblk 10

buffer tsn: 8 rdba: 0x01c0000a (7/10)

scn: 0x0000.001a0dc1 seq: 0x01 flg: 0x04 tail: 0x0dc12101

frmt: 0x02 chkval: 0x5439 type: 0x21=SECOND LEVEL BITMAP BLOCK

Hex dump of block: st=0, typ_found=1

Dump of memory from 0x085C8400 to 0x085CA400

85C8400 0000A221 01C0000A 001A0DC1 04010000 [!...............]

85C8410 00005439 00000000 00000000 00000000 [9T..............]

85C8420 00000000 00000000 00000000 00000000 [................]

        Repeat 1 times

85C8440 00000000 00000000 00000000 01C0000B [................]

85C8450 00000008 00000008 00000000 00000000 [................]

85C8460 00000000 00000000 0000D302 00000001 [................]

85C8470 00000000 01C00009 00010005 01C00019 [................]

85C8480 00010005 01C00029 00010005 01C00039 [....).......9...]

85C8490 00010005 01C00049 00010005 01C00059 [....I.......Y...]

85C84A0 00010005 01C00069 00010005 01C00079 [....i.......y...]

85C84B0 00010005 00000000 00000000 00000000 [................]

85C84C0 00000000 00000000 00000000 00000000 [................]

        Repeat 498 times

85CA3F0 00000000 00000000 00000000 0DC12101 [.............!..]

Dump of Second Level Bitmap Block

   number: 8       nfree: 8       ffree: 0      pdba:     0x01c0000b

   Inc #: 0 Objd: 54018

 opcode:0

 xid:

 L1 Ranges :

 --------------------------------------------------------

   0x01c00009 Free: 5 Inst: 1

   0x01c00019 Free: 5 Inst: 1

   0x01c00029 Free: 5 Inst: 1

   0x01c00039 Free: 5 Inst: 1

   0x01c00049 Free: 5 Inst: 1

   0x01c00059 Free: 5 Inst: 1

   0x01c00069 Free: 5 Inst: 1

   0x01c00079 Free: 5 Inst: 1

 

 --------------------------------------------------------

End dump data blocks tsn: 8 file#: 7 minblk 10 maxblk 10

Start dump data blocks tsn: 8 file#: 7 minblk 11 maxblk 11

buffer tsn: 8 rdba: 0x01c0000b (7/11)

scn: 0x0000.001a0dc6 seq: 0x01 flg: 0x04 tail: 0x0dc62301

frmt: 0x02 chkval: 0x79ad type: 0x23=PAGETABLE SEGMENT HEADER

Hex dump of block: st=0, typ_found=1

Dump of memory from 0x085C8400 to 0x085CA400

85C8400 0000A223 01C0000B 001A0DC6 04010000 [#...............]

85C8410 000079AD 00000000 00000000 00000000 [.y..............]

85C8420 00000000 00000010 00000080 00000A9C [................]

85C8430 00000000 00000003 00000008 01C0000C [................]

85C8440 00000000 00000000 00000000 00000000 [................]

        Repeat 1 times

85C8460 00000003 00000008 01C0000C 00000000 [................]

85C8470 00000000 00000000 00000000 01C00009 [................]

85C8480 01C00009 00000000 00000000 00000000 [................]

85C8490 00000000 00000000 00000000 00000000 [................]

        Repeat 3 times

85C84D0 00000001 00002000 00000000 00001434 [..... ......4...]

85C84E0 00000000 01C0000A 00000001 01C00079 [............y...]

85C84F0 01C0000A 00000000 00000000 00000000 [................]

85C8500 00000000 00000000 00000010 00000000 [................]

85C8510 0000D302 10000000 01C00009 00000008 [................]

85C8520 01C00011 00000008 01C00019 00000008 [................]

85C8530 01C00021 00000008 01C00029 00000008 [!.......).......]

85C8540 01C00031 00000008 01C00039 00000008 [1.......9.......]

85C8550 01C00041 00000008 01C00049 00000008 [A.......I.......]

85C8560 01C00051 00000008 01C00059 00000008 [Q.......Y.......]

85C8570 01C00061 00000008 01C00069 00000008 [a.......i.......]

85C8580 01C00071 00000008 01C00079 00000008 [q.......y.......]

85C8590 01C00081 00000008 00000000 00000000 [................]

85C85A0 00000000 00000000 00000000 00000000 [................]

        Repeat 144 times

85C8EB0 01C00009 01C0000C 01C00009 01C00011 [................]

85C8EC0 01C00019 01C0001A 01C00019 01C00021 [............!...]

85C8ED0 01C00029 01C0002A 01C00029 01C00031 [)...*...)...1...]

85C8EE0 01C00039 01C0003A 01C00039 01C00041 [9...:...9...A...]

85C8EF0 01C00049 01C0004A 01C00049 01C00051 [I...J...I...Q...]

85C8F00 01C00059 01C0005A 01C00059 01C00061 [Y...Z...Y...a...]

85C8F10 01C00069 01C0006A 01C00069 01C00071 [i...j...i...q...]

85C8F20 01C00079 01C0007A 01C00079 01C00081 [y...z...y.......]

85C8F30 00000000 00000000 00000000 00000000 [................]

        Repeat 144 times

85C9840 00000000 00000000 01C0000A 00000000 [................]

85C9850 00000000 00000000 00000000 00000000 [................]

        Repeat 185 times

85CA3F0 00000000 00000000 00000000 0DC62301 [.............#..]

 Extent Control Header

 -----------------------------------------------------------------

 Extent Header:: spare1: 0      spare2: 0      #extents: 16     #blocks: 128  

                  last map 0x00000000 #maps: 0      offset: 2716 

      Highwater:: 0x01c0000c ext#: 0      blk#: 3      ext size: 8    

 #blocks in seg. hdr's freelists: 0    

 #blocks below: 0    

 mapblk 0x00000000 offset: 0    

                   Unlocked

 --------------------------------------------------------

 Low HighWater Mark :

      Highwater:: 0x01c0000c ext#: 0      blk#: 3      ext size: 8    

 #blocks in seg. hdr's freelists: 0    

 #blocks below: 0    

 mapblk 0x00000000 offset: 0    

 Level 1 BMB for High HWM block: 0x01c00009

 Level 1 BMB for Low HWM block: 0x01c00009

 --------------------------------------------------------

 Segment Type: 1 nl2: 1      blksz: 8192   fbsz: 0     

 L2 Array start offset: 0x00001434

 First Level 3 BMB: 0x00000000

 L2 Hint for inserts: 0x01c0000a

 Last Level 1 BMB: 0x01c00079

 Last Level II BMB: 0x01c0000a

 Last Level III BMB: 0x00000000

     Map Header:: next 0x00000000 #extents: 16   obj#: 54018 flag: 0x10000000

 Inc # 0

 Extent Map

 -----------------------------------------------------------------

   0x01c00009 length: 8    

   0x01c00011 length: 8    

   0x01c00019 length: 8    

   0x01c00021 length: 8    

   0x01c00029 length: 8    

   0x01c00031 length: 8    

   0x01c00039 length: 8    

   0x01c00041 length: 8    

   0x01c00049 length: 8    

   0x01c00051 length: 8    

   0x01c00059 length: 8    

   0x01c00061 length: 8    

   0x01c00069 length: 8    

   0x01c00071 length: 8    

   0x01c00079 length: 8    

   0x01c00081 length: 8     

 

 Auxillary Map

 --------------------------------------------------------

   Extent 0     : L1 dba: 0x01c00009 Data dba: 0x01c0000c

   Extent 1     : L1 dba: 0x01c00009 Data dba: 0x01c00011

   Extent 2     : L1 dba: 0x01c00019 Data dba: 0x01c0001a

   Extent 3     : L1 dba: 0x01c00019 Data dba: 0x01c00021

   Extent 4     : L1 dba: 0x01c00029 Data dba: 0x01c0002a

   Extent 5     : L1 dba: 0x01c00029 Data dba: 0x01c00031

   Extent 6     : L1 dba: 0x01c00039 Data dba: 0x01c0003a

  Extent 7     : L1 dba: 0x01c00039 Data dba: 0x01c00041

   Extent 8     : L1 dba: 0x01c00049 Data dba: 0x01c0004a

   Extent 9     : L1 dba: 0x01c00049 Data dba: 0x01c00051

   Extent 10    : L1 dba: 0x01c00059 Data dba: 0x01c0005a

   Extent 11   : L1 dba: 0x01c00059 Data dba: 0x01c00061

   Extent 12    : L1 dba: 0x01c00069 Data dba: 0x01c0006a

   Extent 13    : L1 dba: 0x01c00069 Data dba: 0x01c00071

   Extent 14    : L1 dba: 0x01c00079 Data dba: 0x01c0007a

   Extent 15    : L1 dba: 0x01c00079 Data dba: 0x01c00081

 --------------------------------------------------------

 

   Second Level Bitmap block DBAs

   --------------------------------------------------------

   DBA 1:   0x01c0000a

 

End dump data blocks tsn: 8 file#: 7 minblk 11 maxblk 11

 

 

附件:Show_space() 存儲過程代碼:

 

CREATE OR REPLACE PROCEDURE show_space (p_segname_1 IN varchar2,

                                        p_space IN varchar2 DEFAULT 'MANUAL' ,

                                        p_type_1 IN varchar2 DEFAULT 'TABLE' ,

                                        p_analyzed IN varchar2 DEFAULT 'N' ,

                                        p_owner_1 IN varchar2 DEFAULT USER

)

AS

   p_segname              VARCHAR2 (100);

   p_type                 VARCHAR2 (10);

   p_owner                VARCHAR2 (30);

 

   l_unformatted_blocks   NUMBER;

   l_unformatted_bytes    NUMBER;

   l_fs1_blocks           NUMBER;

   l_fs1_bytes            NUMBER;

   l_fs2_blocks           NUMBER;

   l_fs2_bytes            NUMBER;

   l_fs3_blocks           NUMBER;

   l_fs3_bytes            NUMBER;

   l_fs4_blocks           NUMBER;

   l_fs4_bytes            NUMBER;

   l_full_blocks          NUMBER;

   l_full_bytes           NUMBER;

 

   l_free_blks            NUMBER;

   l_total_blocks         NUMBER;

   l_total_bytes          NUMBER;

   l_unused_blocks        NUMBER;

   l_unused_bytes         NUMBER;

   l_lastusedextfileid    NUMBER;

   l_lastusedextblockid   NUMBER;

   l_last_used_block      NUMBER;

 

   PROCEDURE p (p_label IN varchar2, p_num IN number)

   IS

   BEGIN

      DBMS_OUTPUT.put_line (RPAD (p_label, 40, '.') || p_num);

   END;

BEGIN

   p_segname                 := UPPER (p_segname_1);          -- rainy changed

   p_owner                   := UPPER (p_owner_1);

   p_type                    := p_type_1;

 

   IF (p_type_1 = 'i' OR p_type_1 = 'I')

   THEN                                                        --rainy changed

      p_type   := 'INDEX';

   END IF;

 

   IF (p_type_1 = 't' OR p_type_1 = 'T')

   THEN                                                        --rainy changed

      p_type   := 'TABLE';

   END IF;

 

   IF (p_type_1 = 'c' OR p_type_1 = 'C')

   THEN                                                        --rainy changed

      p_type   := 'CLUSTER';

   END IF;

 

 

   DBMS_SPACE.unused_space (segment_owner => p_owner,

                            segment_name => p_segname,

                            segment_type => p_type,

                            total_blocks => l_total_blocks,

                            total_bytes => l_total_bytes,

                            unused_blocks => l_unused_blocks,

                            unused_bytes => l_unused_bytes,

                            last_used_extent_file_id => l_lastusedextfileid,

                            last_used_extent_block_id => l_lastusedextblockid,

                            last_used_block => l_last_used_block

   );

 

   IF p_space = 'MANUAL' OR (p_space <> 'auto' AND p_space <> 'AUTO')

   THEN

      DBMS_SPACE.free_blocks (segment_owner => p_owner,

                              segment_name => p_segname,

                              segment_type => p_type,

                              freelist_group_id => 0,

                              free_blks => l_free_blks

      );

 

      p ('Free Blocks', l_free_blks);

   END IF;

 

   p ('Total Blocks', l_total_blocks);

   p ('Total Bytes', l_total_bytes);

   p ('Unused Blocks', l_unused_blocks);

   p ('Unused Bytes', l_unused_bytes);

   p ('Last Used Ext FileId', l_lastusedextfileid);

   p ('Last Used Ext BlockId', l_lastusedextblockid);

   p ('Last Used Block', l_last_used_block);

 

 

   /*IF the segment is analyzed */

   IF p_analyzed = 'Y'

   THEN

      DBMS_SPACE.space_usage (segment_owner => p_owner,

                              segment_name => p_segname,

                              segment_type => p_type,

                              unformatted_blocks => l_unformatted_blocks,

                              unformatted_bytes => l_unformatted_bytes,

                              fs1_blocks => l_fs1_blocks,

                              fs1_bytes => l_fs1_bytes,

                              fs2_blocks => l_fs2_blocks,

                              fs2_bytes => l_fs2_bytes,

                              fs3_blocks => l_fs3_blocks,

                              fs3_bytes => l_fs3_bytes,

                              fs4_blocks => l_fs4_blocks,

                              fs4_bytes => l_fs4_bytes,

                              full_blocks => l_full_blocks,

                              full_bytes => l_full_bytes

      );

      DBMS_OUTPUT.put_line (RPAD (' ', 50, '*'));

      DBMS_OUTPUT.put_line ('The segment is analyzed');

      p ('0% -- 25% free space blocks', l_fs1_blocks);

      p ('0% -- 25% free space bytes', l_fs1_bytes);

      p ('25% -- 50% free space blocks', l_fs2_blocks);

      p ('25% -- 50% free space bytes', l_fs2_bytes);

      p ('50% -- 75% free space blocks', l_fs3_blocks);

      p ('50% -- 75% free space bytes', l_fs3_bytes);

      p ('75% -- 100% free space blocks', l_fs4_blocks);

      p ('75% -- 100% free space bytes', l_fs4_bytes);

      p ('Unused Blocks', l_unformatted_blocks);

      p ('Unused Bytes', l_unformatted_bytes);

      p ('Total Blocks', l_full_blocks);

      p ('Total bytes', l_full_bytes);

   END IF;

END;

 

exec show_space('abc','auto','T','Y');


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM