<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Decode360's Blog

    業精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理 ::
      397 隨筆 :: 33 文章 :: 29 評論 :: 0 Trackbacks
    本地管理表空間(LMT)
    ?
    ?
    ??? 來學習一下LMT(Locally Managed Tablespace)的知識。雖然這個現在已經很少用到了,而且基本上默認創建的SYSTEM都已經是LMT的了,這樣是無法再創建DMT的。所以說這種方法其實已經沒有什么熟練掌握的必要了,但是作為豐富知識的作用,還是可以了解一下的,因為畢竟也還是嘗嘗會碰到這個概念。
    ?
    一、概述

    ??? 1、理解本地管理表空間的由來
    ??? 2、理解什么是字典管理表空間及工作原理
    ??? 3、理解本地管理表空間的優勢(為什么要使用本地管理表空間)
    ??? 4、理解本地管理表空間的內部結構
    ??? 5、理解字典管理表空間與本地管理表空間的轉換
    ?

    二、名詞解釋與約定

    ??? 表空間(Tablespace) :為數據庫提供使用空間的邏輯結構,其對應物理結構是數據文件,一個表空間可以包含多個數據文件
    ??? 本地管理表空間(Locally Managed Tablespace簡稱LMT):8i以后出現的一種新的表空間的管理模式,通過本地位圖來管理表空間的空間使用。
    ??? 字典管理表空間(Dictionary-Managed Tablespace簡稱DMT):8i以前包括以后都還可以使用的一種表空間管理模式,通過數據字典管理表空間的空間使用。
    ??? (Segment):數據庫一種邏輯結構,如表段,索引段,回滾段等,段存在于表空間中,并對應一定的存儲空間。
    ??? 區間<簡稱區>(Extent):段的存儲可以分成一個或多個區間,每個區間占用一定數量的數據塊(block),在本地管理的表空間中,表空間的Extent就對應段的Extent。
    ??? (Block):數據庫最小的存儲單位,在本文中Block的大小約定為8192字節。
    ??? (Bit):本地管理表空間的空間管理單位,一個位可能等于一個區間,也可能多個位組成一個區間。
    ?

    三、本地管理表空間的由來

    ??? 在Oracle8i的版本中,Oracle推出了一種全新的表空間管理方式:本地化管理的表空間。所謂本地化管理,就是指Oracle不再利用數據字典表來記錄Oracle表空間里面的區的使用狀況,而是在每個表空間的數據文件的頭部加入了一個位圖區,在其中記錄每個區的使用狀況。每當一個區被使用,或者被釋放以供重新使用時,Oracle都會更新數據文件頭部的這個記錄,反映這個變化。
    ??? 本地化管理的表空間的創建過程:
    ?
    ??? 語法:
    ??? CREATE TABLESPACE 表空間名字
    ??? DATAFILE '數據文件詳細信息'
    ??? [EXTENT MANAGEMENT { LOCAL
    ??? {AUTOALLOCATE | UNIFORM [SIZE INTETER [K|M]]}}]

    ?
    ??? 關鍵字EXTENT MANAGEMENT LOCAL 指定這是一個本地化管理的表空間。對于系統表空間,只能在創建數據庫的時候指定EXTENT MANGEMENT LOCAL,因為它是數據庫創建時建立的第一個表空間。
    ?
    ??? 在8i中,字典管理還是默認的管理方式,當選擇了LOCAL關鍵字,即表明這是一個本地管理的表空間。當然還可以繼續選擇更細的管理方式:是 AUTOALLOCATE 還是 UNIFORM。若為AUTOALLOCATE,則表明讓Oracle來決定區塊的使用辦法;若選擇了UNIFORM,則還可以詳細指定每個區塊的大小,若不加指定,則為每個區使用1M大小。
    ?
    ??? Oracle之所以推出了這種新的表空間管理方法,讓我們來看一下這種表空間組織方法的優點:
    ?
    ??? 1. 本地化管理的表空間避免了遞歸的空間管理操作。而這種情況在數據字典管理的表空間是經常出現的,當表空間里的區的使用狀況發生改變時,數據字典的表的信息發生改變,從而同時也使用了在系統表空間里的回滾段。
    ??? 2. 本地化管理的表空間避免了在數據字典相應表里面寫入空閑空間、已使用空間的信息,從而減少了數據字典表的競爭,提高了空間管理的并發性
    ??? 3. 區的本地化管理自動跟蹤表空間里的空閑塊,減少了手工合并自由空間的需要。
    ??? 4. 表空間里的區的大小可以選擇由Oracle系統來決定,或者由數據庫管理員指定一個統一的大小,避免了字典表空間一直頭疼的碎片問題。
    ??? 5. 從由數據字典來管理空閑塊改為由數據文件的頭部記錄來管理空閑塊,這樣避免產生回滾信息,不再使用系統表空間里的回滾段。因為由數據字典來管理的話,它會把相關信息記在數據字典的表里,從而產生回滾信息。
    ?
    ??? 由于這種表空間的以上特性,所以它支持在一個表空間里邊進行更多的并發操作,并減少了對數據字典的依賴。
    ?
    ?
    四、本地管理表空間管理機制

    ??? 表空間是一種為段(表、索引等)提供空間的邏輯結構,所以,當在表空間中增加,刪除段的時候,數據庫就必須跟蹤這些空間的使用。
    ?
    ??? 如下例所示,假定一個新創建的表空間包含了5個表:
    ?
    ??? T1……T2……T3……T4……T5……Free
    ?
    ??? 當我們刪除T4的時候,就有如下結果:
    ?
    ??? T1……T2……T3……Free……T5……Free
    ?
    ??? 很明顯,ORACLE需要有一個機制來管理表空間中各數據文件的這些分配的或未分配的空間,為了跟蹤這些可以使用的空間(包括未分配使用的和可以重復使用的),對于每一個空間,我們必須知道:
    ?
    ??? 1、這個可用空間位于什么數據文件
    ??? 2、這個空間的尺寸是多大
    ??? 3、如果它在用了,是哪一個段占用的這個空間
    ?
    ??? 直到8i之前,所有的表空間都是采用字典管理模式,為了確保能保存以上的信息,ORACLE用了兩個數據字典表:UET$(已使用的區間)或FET$(空閑空間)
    ?
    SQL> desc UET$
    Name?? ?????????? Null??? ?? Type
    ----------------- ---------- -----------
    SEGFILE#?? ?????? NOT NULL?? NUMBER
    SEGBLOCK#?? ????? NOT NULL?? NUMBER?? | The segment that uses this space?
    EXT#?? ?????????? NOT NULL?? NUMBER
    TS#?? ??????????? NOT NULL?? NUMBER?? | The tablespace ID and the file?
    FILE#?? ????????? NOT NULL?? NUMBER?? | ID for that tablespace?
    BLOCK#?? ???????? NOT NULL?? NUMBER
    LENGTH?? ???????? NOT NULL?? NUMBER?? | The location and size of the chunk?
    ?
    SQL> desc FET$
    Name?? ?????????? Null??? ?? Type
    ----------------- ---------- -----------
    TS#?? ??????????? NOT NULL?? NUMBER?? | The tablespace ID and the file?
    FILE#?? ????????? NOT NULL?? NUMBER?? | ID for that tablespace?
    BLOCK#?? ???????? NOT NULL?? NUMBER
    LENGTH?? ???????? NOT NULL?? NUMBER?? | The location and size of the chunk
    ?
    ??? 查詢該表可以看到,每個使用空間或空閑空間(不一定是一個extent,可以是多個extent)都在該表中對應了一行。它的工作方式是當一個段被刪除的時候,ORACLE就移動UET$中相應的行到FET$,這個過程的發生是連續的,而且可能發生等待。當并發性很高的時候,數據字典的爭用就來了。另外有一個問題就是,當表的空間很不連續或表空間有大量的碎片引起這兩個表的增大,那么也就會引起數據庫性能上的下降。
    ?
    ??? 本地管理表空間正是為了解決這一問題來的,在表空間的空間管理上,ORACLE將存儲信息保存在表空間的頭部的位圖中,而不是保存在數據字典中。通過這樣的方式,在分配回收空間的時候,表空間就可以獨立的完成操作也不用與其它對象關系。
    ?
    ??? 下面就讓我們進入到本地管理表空間的內部,看看ORACLE是怎么實現這一工作的。
    ?
    Uniform方式的本地管理表空間

    1、先創建了一個本地管理的表空間,區間統一大小分配為64K
    ?
    SQL> create tablespace demo?
    2?? datafile '/ora01/oem/oemdemo01.dbf' size 10m?
    3?? extent management local uniform size 64k;?
    ?
    2、在該表空間中創建一個表
    ?
    SQL>create table demotab ( x number ) tablespace demo?
    2?? storage ( initial 1000K next 1000k );?
    ?
    我們通過查詢該表
    ?
    SQL> select t.table_name,t.initial_extent,t.next_extent from user_tables t where t.table_name = 'DEMOTAB';
    TABLE_NAME?????????????????? INITIAL_EXTENT NEXT_EXTENT
    ---------------------------- -------------- -----------
    DEMOTAB?????????????????????? ????? 1024000 ?? ?? 65536
    ?
    可以發現,該表的存儲參數并不是我們指定的參數INITIAL_EXTENT,而是uniform size的整數倍,NEXT_EXTENT則等于uniform size。我們從該查詢就也可以看到如下情況
    ?
    SQL>select count(*) from user_extents where segment_name = 'DEMOTAB';?
    COUNT(*)?
    ----------?
    ??????? 16?
    ?
    也就是說,該表在該表空間中已經存在16個extent,而不是一個extent(這是與字典管理的差別,如果是字典管理的表空間,如果創建以上的表,該查詢的結果是1)
    ?
    3、獲取該數據文件的文件ID
    ?
    SQL> col name format a30 trunc?
    SQL> select file#, name from v$datafile;?
    ?
    File#?? NAME?
    -----?? --------------------?
    ??? 1?? /oras1/oem/oemsystem01.dbf?
    ??? 2?? /oras3/oem/oemundo01.dbf?
    ??? 3?? /ora01/oem/oemoem_repository01?
    ??? 4?? /ora01/oem/oemrcat01.dbf?
    ??? 5?? /ora01/oem/oemdemo01.dbf?
    ?
    我們可以檢查uet$與fet$
    ?
    SQL> select count(*)?? from uet$?? where file# = 5;?
    ?
    COUNT(*)?
    ----------?
    ???????? 0?
    ?
    SQL> select count(*)?? from fet$?? where file# = 5;?
    ?
    COUNT(*)?
    ----------?
    ???????? 0??? ?
    ?
    4、可以看到,ORACLE沒有在這兩個表中保存任何信息,現在我們dump該數據文件的第三個塊
    ?
    SQL> alter system dump datafile 5 block 3;?
    System altered.?
    ?
    查看DUMP文件,有如下信息
    ?
    Start dump data blocks tsn: 5 file#: 5 minblk 3 maxblk 3?
    buffer tsn: 5 rdba: 0x01400003 (5/3)?
    scn: 0x0000.202f7a6f seq: 0x01 flg: 0x00 tail: 0x7a6f1e01?
    frmt: 0x02 chkval: 0x0000 type: 0x1e=KTFB Bitmapped File Space Bitmap?
    File Space Bitmap Block:?
    BitMap Control:?
    RelFno: 5, BeginBlock: 9, Flag: 0, First: 16, Free: 63472?
    FFFF000000000000 0000000000000000 0000000000000000 0000000000000000?
    0000000000000000 0000000000000000 0000000000000000 0000000000000000?
    .....?
    ?
    注意其中的FFFF00,,這是16進制的表現方法,我們轉換為二進制,有
    ?
    1111,1111,1111,1111,0000,0000
    ?
    發現這里有16個1,每一個1就是一個位(bit),代表64K,也就代表了該表空間有已經分配了的16個extent,如果我們將該表擴展,將又有什么結果呢?
    ?
    SQL> alter table demotab allocate extent;?
    Table altered.?
    ?
    SQL> alter table demotab allocate extent;?
    Table altered.?
    ?
    SQL> alter table demotab allocate extent;?
    Table altered.?
    ?
    這樣之后,我們應該有19個extent了,再dump第三個塊
    ?
    Start dump data blocks tsn: 5 file#: 5 minblk 3 maxblk 3?
    buffer tsn: 5 rdba: 0x01400003 (5/3)?
    scn: 0x0000.202f7c64 seq: 0x01 flg: 0x00 tail: 0x7c641e01?
    frmt: 0x02 chkval: 0x0000 type: 0x1e=KTFB Bitmapped File Space Bitmap?
    File Space Bitmap Block:?
    BitMap Control:?
    RelFno: 5, BeginBlock: 9, Flag: 0, First: 19, Free: 63469?
    FFFF07 0000000000 0000000000000000 0000000000000000 0000000000000000?
    ?
    ??? 除了以前的FFFF,現在多了07,怎么解釋呢?
    ?
    ??? 07轉換為二進制為0000,0111,但是還是不夠解釋以上的情況,這里我們沒有考慮到字節交換的情況,因為以上FF交換后還是FF,但是如果是07, 我們就必須考慮字節交換(因為計算機是一個字節一個字節的寫,一個字節占兩位當然是先寫后面了,如從01到0F到FF為止。 如果我們明白了,那么FFFF07轉換為二進制為 1111,1111,1111,1111,0000,0111。
    ?
    ??? 每個字節交換得
    ?
    ??? 1111,1111,1111,1111,1110,0000
    ?
    ??? 可以發現,這里有19個1,也就是19個位(bit),代表了現在的19個extent。
    ?
    5、同樣我們dump該數據文件第9個塊,則有
    ?
    Start dump data blocks tsn: 5 file#: 5 minblk 9 maxblk 9
    buffer tsn: 5 rdba: 0x01400003 (5/3)?
    scn: 0x0000.202f7c64 seq: 0x01 flg: 0x00 tail: 0x7c641e01?
    frmt: 0x02 chkval: 0x0000 type: 0x1e=KTFB Bitmapped File Space Bitmap?
    ?
    ?? Extent Control Header
    ?? -----------------------------------------------------------------
    ?? Extent Header:: spare1: 0??? space2: 0??? #extents: 16???? #blocks: 127
    ?????????????? last map?? 0x00000000?? #maps: 0??? offset: 4128?
    ?? Highwater::?? 0x01c0000a??? ext#: 0??? blk#: 0??? ext size: 7???
    ?? #blocks in seg. hdr's freelists: 0???
    ?? #blocks below: 0???
    ?? mapblk?? 0x00000000?? offset: 0???
    ?? Disk Lock:: Locked by scn:?? 0x0006.012.00000017
    ??? Map Header:: next?? 0x00000000?? #extents: 16 obj#: 3090 flag: 0x40000000
    ?? Extent Map
    ?? -----------------------------------------------------------------
    ??? 0x01c0000a?? length: 7???
    ??? 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???
    ?
    ?? nfl = 1, nfb = 1 typ = 1 nxf = 0
    ?? SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000 End dump data blocks tsn: 5 file#: 5 minblk 9 maxblk 9
    ?
    ??? 這是該數據文件中表DEMOTAB的表頭(一個塊)信息, 從這里可以看到,該表從第9個塊開始使用Highwater::?? 0x01c0000a已經是第10個塊了,從以上列表,我們也能清楚的看到,該表耗費了16個區間
    ?
    ??? 由于該表是數據文件的第一個表,所以位圖區占用從3到8共6個塊,加上前面兩個文件頭,也就是說,在數據文件頭部共8個塊用于系統消耗。如果我們的db_block_size為8192,那么很明顯,
    占用的空間為64K。
    ?
    ??? 也因為僅僅操作數據文件頭部幾個塊,不用操作數據字典,所以ORACLE在本地管理的表空間中添加,刪除段的時候,效率要比字典管理的表空間快。特別是在并發性很強的空間請求中。
    ORACLE通過強制性的手段使本地管理表空間中的所有Extent是同樣大小的,盡管你可能自定義了不同的存儲參數。
    ?
    6、補充一些字典管理表空間的不同
    ?
    ??? a. 如果是字典管理,表空間中的表的區間的大小取決于表的存儲參數,如果沒有定義,則取表空間的通用存儲參數。所以每個表的區間大小可以不一樣。
    ??? b. 如果不指定表的最少區間數,那么默認創建的時候,該表只有一個區間,而不是多個區間。
    ??? c. 字典管理的文件頭只占用一個塊,第一個表的HWM應當是Highwater:: x01c00003,關于這個可以自己dump該數據文件查看。
    ?
    ?
    Autoallocate的本地管理表空間
    ?
    在自動分配的本地管理的表空間中,區間尺寸可能由以下尺寸組成64k, 1m, 8m, 64m 甚至是256m。但是不管多大,都有一個通用尺寸64k,所以64K就是該表空間的位大小。
    ?
    SQL> create tablespace dummy
    2?? datafile 'c:\dummy01.dbf' size 100m
    3?? autoallocate;
    Tablespace created.
    ?
    SQL> create table x1 (x number)
    2?? tablespace dummy
    3?? storage (initial 50M);
    Table created.
    ?
    SQL> select file# from v$datafile where name like '%DUMMY%';
    ?
    FILE#
    ----------
    ?? ???? 12
    ?
    SQL> select extents from user_segments
    where segment_name = 'X1' ;
    ?
    EXTENTS
    ---------
    ?????? 50
    ?
    SQL> alter system dump datafile 12 block 3;
    System altered.
    ?
    *** SESSION ID11.59) 2002-11-22 10:37:35.000
    Start dump data blocks tsn: 19 file#: 12 minblk 3 maxblk 3
    buffer tsn: 19 rdba: 0x03000003 (12/3)
    scn: 0x0000.00f2959b seq: 0x01 flg: 0x00 tail: 0x959b1e01
    frmt: 0x02 chkval: 0x0000 type: 0x1e=KTFB Bitmapped File Space Bitmap
    File Space Bitmap Block:
    BitMap Control:
    RelFno: 12, BeginBlock: 9, Flag: 0, First: 800, Free: 62688
    FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF
    FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF
    FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF
    FFFFFFFF00000000 0000000000000000 0000000000000000 0000000000000000
    0000000000000000 0000000000000000 0000000000000000 0000000000000000
    0000000000000000 0000000000000000 0000000000000000 0000000000000000
    0000000000000000 0000000000000000 0000000000000000 0000000000000000
    0000000000000000 0000000000000000 0000000000000000 0000000000000000
    0000000000000000 0000000000000000 0000000000000000 0000000000000000??????
    ?
    可以看到該表實際只有50個區間(extent),但是有800個位(bit)
    50*1024=800*64
    還可以看出,位大小并不等于extent大小
    ?
    ?
    五、遷移到本地管理表空間

    ??? 在很多情況下,如果你想在字典表空間與本地表空間之間轉換是很難的,你可能需要轉出該表空間所有的數據,從新創建表空間,再加載該數據。但是在816以后,有一個叫dbms_space_admin的包使兩類表空間的互相轉換變成可能,體現在如下兩個過程:
    ?
    ??? DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_TO_LOCAL?
    ??? DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_FROM_LOCAL?
    ?
    ??? 但是在你想利用這個過程進行轉換的時候,你必須注意兩件事:
    ?
    ??? 1、 數據庫版本必須是816以上,兼容版本(compatible)必須是8.1以上
    ??? 2、 如果是轉換成為本地管理,必須有足夠的空閑空間做本地位圖空間(8個塊)
    ?
    ??? 當從字典管理到本地管理的過程中,全部轉換其實基本上是不可能發生的,實際情況是,對于已經存在的數據和空間,該過程是沒有任何辦法的,僅僅是簡單把空間 取整并標記。所以說,這種轉換后的表空間可以減緩UET$和FET$的壓力,但并不能解決碎片問題。從查詢DBA_TABLESPACES你還可以看到,轉換之后的表空間管理方式是LOCAL,但實際段分配是USER(不是uniform或automatic)
    ?
    ??? 很顯然,在字典管理的表空間中,存在許多大小不同的區間(extent)尺寸,所以轉換為本地管理的時候,ORACLE怎么樣把這些已經存在的空間轉換為通用大小了?為了做到這一點,ORACLE必須掃描該表空間的每個數據文件,主要是檢查以下三個問題:
    ?
    ??? 1、 所有的已經存在的區間
    ??? 2、 所有的以前用過,但是現在空閑的空間
    ??? 3、 由表空間MINIMUM EXTENT語句標記的大小
    ?
    ??? 在轉換的時候,ORACLE試圖發現一個適合于以上三個標準的最大的區間的尺寸作為本地管理的區間尺寸,也就是說,在最壞的情況下,這個最大的區間可能就是單個塊(如果說一個表的區間尺寸是7個塊,另外一個表的區間尺寸是8個塊)
    ?
    ??? 我們看一個從字典管理表空間到本地管理表空間的例子
    ?
    1、首先,我們創建一個字典管理表空間
    ?
    SQL> create tablespace blah?
    2?? datafile 'G:\ORA9I\ORADATA\DB9\BLAH.DBF' size 10m reuse?
    3?? extent management dictionary;?
    Tablespace altered.?
    ?
    SQL> col bytes format 999,999,999?
    SQL> select * from dba_free_space where tablespace_name = 'BLAH';?
    ?
    TABLESPACE_NAME FILE_ID? BLOCK_ID?? BYTES?? ??? BLOCK?? RELATIVE_FNO?
    --------------- -------- ----------- ----------- ------- ----------------?

    BLAH?? ??????????????? 8?? ??????? 2? 10,477,568?? 1279? ???????????? 8?
    ?
    2、我們在上面創建三個表,最小公用尺寸是400K
    ?
    SQL> create table t1 ( x number ) storage ( initial 400k) tablespace blah;?
    Table created.?
    ?
    SQL> create table t2 ( x number ) storage ( initial 800k) tablespace blah;?
    Table created.?
    ?
    SQL> create table t3 ( x number ) storage ( initial 1200k) tablespace blah;?
    Table created.?
    ?
    SQL> select * from dba_free_space where tablespace_name = 'BLAH';?
    ?
    TABLESPACE_NAME FILE_ID? BLOCK_ID?? BYTES?? ??? BLOCK?? RELATIVE_FNO?
    --------------- -------- ----------- ----------- ------- ----------------?
    BLAH?? ??????????????? 8?? ????? 302?? 8,019,968?? ? 979?? ???????????? 8?
    ?
    SQL> select bytes from dba_extents where tablespace_name = 'BLAH';?
    ?
    BYTES?
    ----------?
    409,600?
    819,200?
    1,228,800?
    ?
    3、現在我們開始轉換該表空間為本地管理的表空間,假定每個位圖大小400K,也就是50個塊。
    ?
    SQL> exec dbms_space_admin.TABLESPACE_MIGRATE_TO_LOCAL('BLAH',50);?
    BEGIN dbms_space_admin.TABLESPACE_MIGRATE_TO_LOCAL('BLAH',50); END;?
    ?
    *?
    ERROR at line 1:?
    ORA-03241: Invalid unit size?
    ORA-06512: at "SYS.DBMS_SPACE_ADMIN", line 0?
    ORA-06512: at line 1?
    如果我們設置表空間的minimum extent語句為400K:
    SQL> alter tablespace blah minimum extent 400k;?
    Tablespace altered.?
    ?
    SQL> exec dbms_space_admin.TABLESPACE_MIGRATE_TO_LOCAL('BLAH',50);?
    PL/SQL procedure successfully completed.?
    Conversion goes through with no problems.
    ?
    ??? 從以上可以看到,轉換成功,但實際情況遠遠比這么復雜,或許你根本就不知道表空間里面的公用尺寸是多大。而且通過這種轉換后的表空間,并沒有消除碎片,也不一定有優化的作用。所以建議不要用該方法進行轉換,而是使用alter table move的辦法進行表空間的轉換將可能是最好的辦法。
    ?
    ?
    ?
    ?
    ?
    ?
    ?
    再轉一些其他的論述
    ?
    *************************************************************************************
    本地管理表空間與字典管理表空間的比較
    ?
    ??? 本地管理表空間與字典管理表空間相比大大提高了管理效率和數據庫性能,其優點如下:

    1.減少了遞歸空間管理

    ??? 本地管理表空間是自己管理分配,而不是象字典管理表空間需要系統來管理空間分配,本地表空間是通過在表空間的每個數據文件中維持一個位圖來跟蹤在此文件中 塊的剩余空間及使用情況。并及時做更新。這種更新只對表空間的額度情況做修改而不對其他數據字典表做任何update操作,所以不會產生任何回退信息,從 而大大減少了空間管理,提高了管理效率。同時由于本地管理表空間可以采用統一大小分配方式(UNIFORM),因此也大大減小了空間管理,提高了數據庫性 能。

    2.系統自動管理extents大小或采用統一extents大小

    ??? 本地管理表空間有自動分配(AUTOALLOCATE)和統一大小分配(UNIFORM)兩種空間分配方式,自動分配方式(AUTOALLOCATE)是 由系統來自動決定extents大小,而統一大小分配(UNIFORM)則是由用戶指定extents大小。這兩種分配方式都提高了空間管理效率。

    3.減少了數據字典之間的競爭

    ??? 因為本地管理表空間通過維持每個數據文件的一個位圖來跟蹤在此文件中塊的空間情況并做更新,這種更新只修改表空間的額度情況,而不涉及到其他數據字典表,從而大大減少了數據字典表之間的競爭,提高了數據庫性能。

    4.不產生回退信息

    ??? 因為本地管理表空間的空間管理除對表空間的額度情況做更新之外不修改其它任何數據字典表,因此不產生回退信息,從而大大提高了數據庫的運行速度。
    ?
    5.不需合并相鄰的剩余空間

    ??? 因為本地管理表空間的extents空間管理會自動跟蹤相鄰的剩余空間并由系統自動管理,因而不需要去合并相鄰的剩余空間。同時,本地管理表空間的所有extents還可以具有相同的大小,從而也減少了空間碎片。

    6.減少了空間碎片

    7.對臨時表空間提供了更好的管理
    ?
    *************************************************************************************
    ?
    Oracle之所以推出了這種新的表空間管理方法,讓我們來看一下這種表空間組織方法的優點:

    ??? 1. 本地化管理的表空間避免了遞歸的空間管理操作。而這種情況在數據字典管理的表空間是經常出現的,當表空間里的區的使用狀況發生改變時,數據字典的表的信息發生改變,從而同時也使用了在系統表空間里的回滾段。
    ??? 2. 本地化管理的表空間避免了在數據字典相應表里面寫入空閑空間、已使用空間的信息,從而減少了數據字典表的競爭,提高了空間管理的并發性
    ??? 3. 區的本地化管理自動跟蹤表空間里的空閑塊,減少了手工合并自由空間的需要。
    ??? 4. 表空間里的區的大小可以選擇由Oracle系統來決定,或者由數據庫管理員指定一個統一的大小,避免了字典表空間一直頭疼的碎片問題。
    ??? 5. 從由數據字典來管理空閑塊改為由數據文件的頭部記錄來管理空閑塊,這樣避免產生回滾信息,不再使用系統表空間里的回滾段。因為由數據字典來管理的話,它會把相關信息記在數據字典的表里,從而產生回滾信息。

    ??? 由于這種表空間的以上特性,所以它支持在一個表空間里邊進行更多的并發操作,并減少了對數據字典的依賴。
    ?
    ??? 對于每一個空間,我們必須知道:
    ??? 1、這個可用空間位于什么數據文件
    ??? 2、這個空間的尺寸是多大
    ??? 3、如果它在用了,是哪一個段占用的這個空間
    ?
    ??? 本地化管理的表空間上,ORACLE將存儲信息保存在表空間的頭部的位圖中,而不是保存在數據字典中。通過這樣的方式,在分配回收空間的時候,表空間就可以獨立的完成操作也不用與其它對象關系。
    ?
    *************************************************************************************
    ?
    ?
    ?
    ?
    posted on 2009-07-09 22:41 decode360 閱讀(824) 評論(0)  編輯  收藏 所屬分類: 07.Oracle
    主站蜘蛛池模板: 免费视频中文字幕| 日本v片免费一区二区三区| 亚洲一区二区三区自拍公司| 免费的黄色的网站| 亚洲无线一二三四区手机| 曰韩无码AV片免费播放不卡 | 三级片免费观看久久| 国产色婷婷精品免费视频| 337P日本欧洲亚洲大胆精品| 亚洲av高清在线观看一区二区 | 免费va人成视频网站全| 男人扒开添女人下部免费视频| 全部免费a级毛片| sihu国产精品永久免费| 亚洲人成网7777777国产| 久久免费国产视频| 亚洲国产精品久久网午夜| 成人毛片免费观看视频| 无人视频在线观看免费播放影院| 亚洲中文字幕在线观看| 91精品全国免费观看含羞草| 美女视频黄频a免费| 亚洲人成影院在线观看| 久久精品成人免费看| 91亚洲视频在线观看| 天天摸天天操免费播放小视频| 男女男精品网站免费观看| 亚洲av成人无码久久精品| 一区二区无码免费视频网站 | 亚洲av无码无线在线观看| 亚洲精品国产精品乱码不卞| 久久国产乱子伦精品免费看| 亚洲欧美日韩国产成人| 国产亚洲精久久久久久无码77777| 国产白丝无码免费视频| 亚洲色偷精品一区二区三区| 国产亚洲精品看片在线观看 | 国产小视频在线免费| 久久青草精品38国产免费| 亚洲中文字幕无码久久| 久久久久国产亚洲AV麻豆|