oracle分割槽表學習(四)

Nalternative發表於2011-02-12

列表分割槽:

default分割槽的使用注意:一旦列表分割槽表有一個default分割槽,就不能再向這個表中增加更多的分割槽了

組合分割槽:是區間分割槽和雜湊分割槽的組合,或者是區間分割槽與列表分割槽的組合。

在組合分割槽中,頂層分割槽機制總是區間分割槽。使用組合分割槽時,並沒有分割槽段,而只有子分割槽段。分割槽本身並沒有段,資料物理的儲存在子分割槽段上,分割槽成為一個邏輯容器,或者是一個指向實際子分割槽的容器。

每個區間分割槽不需要有相同數目的子分割槽

行移動:

       如果用於確定分割槽的列有修改會發生什麼,需要考慮兩種情況:

1、  修改不會導致使用一個不同的分割槽;行仍屬於原來的分割槽。這在所有情況下都得到支援。

修改會導致行跨分割槽移動。只有當表啟用了行移動時才支援這種情況;否則,會產生一個錯誤。



更新記錄的分割槽鍵列,記錄不屬於原來的行,啟動行移動;
更新時rowid會改變,在其他一些情況下,rowid也有可能因為更新而改變。更新iot的主鍵可能導致rowid改變,改行的通用rowid(urowid)也會改變
。oracle10g的FLASHBACK TABLE 命令可能改變行的rowid,此外oracle10g的alter table shrink命令也可能使行的rowid改變。
行移動的開銷比正常的update昂貴的多,所以構建的系統不應該你頻繁修改分割槽鍵。



Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as SYS

SQL> CREATE TABLE range_example
  2  ( range_key_column date ,
  3    data             varchar2(20)
  4  )
  5  PARTITION BY RANGE (range_key_column)
  6  ( PARTITION part_1 VALUES LESS THAN
  7         (to_date('01/01/2005','dd/mm/yyyy')),
  8    PARTITION part_2 VALUES LESS THAN
  9         (to_date('01/01/2006','dd/mm/yyyy')),
 10    PARTITION part_3 VALUES LESS THAN
 11         (MAXVALUE)
 12  )
 13  /
 
Table created

SQL> insert into range_example
  2  ( range_key_column, data )
  3  values
  4  ( to_date( '15-01-2004 00:00:00',
  5             'dd-mm-yyyy hh24:mi:ss' ),
  6    'application data...' );
 
1 row inserted

SQL> insert into range_example
  2  ( range_key_column, data )
  3  values
  4  ( to_date( '01-6-2005 00:00:00',
  5             'dd-mm-yyyy hh24:mi:ss' )-1/24/60/60,
  6    'application data...' )
  7  /
 
1 row inserted

SQL>   insert into range_example
  2  ( range_key_column, data )
  3  values
  4  ( to_date( '01-01-2005 00:00:00',
  5             'dd-mm-yyyy hh24:mi:ss' )-1/24/60/60,
  6    'application data...' )
  7  /
 
1 row inserted

SQL> select * from range_example partition(part_1);
 
RANGE_KEY_COLUMN DATA
---------------- --------------------
2004-1-15        application data...
2004-12-31 23:59 application data...

SQL> update range_example
  2     set range_key_column = trunc(range_key_column)
  3   where range_key_column =
  4      to_date( '31-12-2004 23:59:59',
  5               'dd-mm-yyyy hh24:mi:ss' );
 
1 row updated

SQL> update range_example
  2     set range_key_column = to_date('02-1-2005','dd-mm-yyyy')
  3   where range_key_column = to_date('31-12-2004','dd-mm-yyyy')
  4  /
 
update range_example
   set range_key_column = to_date('02-1-2005','dd-mm-yyyy')
 where range_key_column = to_date('31-12-2004','dd-mm-yyyy')
 
ORA-14402: 更新分割槽關鍵字列將導致分割槽的更改

SQL> select rowid
  2    from range_example
  3   where range_key_column = to_date('31-12-2004','dd-mm-yyyy');
 
ROWID
------------------
AAAPRnAABAAAR8yAAB
SQL> alter table range_example
  2  enable row movement;
 
Table altered
 
SQL>
SQL> update range_example
  2     set range_key_column = to_date('02-1-2005','dd-mm-yyyy')
  3   where range_key_column = to_date('31-12-2004','dd-mm-yyyy')
  4  /
 
1 row updated
 
SQL>
SQL> select rowid
  2    from range_example
  3   where range_key_column = to_date('31-12-2004','dd-mm-yyyy');
 
ROWID
------------------
 
SQL>
SQL> select rowid
  2    from range_example
  3   where range_key_column = to_date('02-1-2005','dd-mm-yyyy');
 
ROWID
------------------
AAAPRoAABAAAR86AAB



     組合分割槽,可以先應用區間分割槽,再進一步劃分各個區間,按一個雜湊函式或使用列表來分割槽。這樣就能將I/O請求分佈到任何給定大分割槽中的多個磁碟上。另外,現在可以得到3個層次的分割槽消除:

     如果在區間分割槽鍵上查詢,oracle就能消除任何不滿足條件的區間分割槽。如果向查詢增加雜湊或列表鍵,oracle可以消除該區間中其他的雜湊或列表分割槽。如果只是在雜湊或列表鍵上查詢(而不使用區間分割槽鍵),oracle就只會查詢各個區間分割槽中的這些雜湊或列表子分割槽



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25323853/viewspace-687091/,如需轉載,請註明出處,否則將追究法律責任。

相關文章