Oracle Clob的一致讀

abstractcyj發表於2013-08-22
表裡只儲存了一個指標,指向LOB的儲存位置。而具體到儲存,還分為lobindex,和lobsegment。表中的LOB實際上是指向lobindex, 而lobindex再指向LOB本身的各個部分。為了得到LOB中的N~M位元組,要使用表中的指標(LOB定位器)解除引用,遍歷lobindex來找到所需的資料庫(chunk), 然後按順序訪問。這使得隨機訪問LOB的任何部分都同樣迅速,你可以用同樣快的速度來得到LOB的最前面,中間或者最後面的部分而無需再從頭遍歷LOB。

LOB的儲存可以指定儲存方式:

  CREATE TABLE "SCOTT"."TEST_CLOB2" 
   ( "A" CLOB
   ) SEGMENT CREATION DEFERRED 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  TABLESPACE "USERS" 
 LOB ("A") STORE AS BASICFILE (
  TABLESPACE "USERS" DISABLE STORAGE IN ROW CHUNK 8192 RETENTION 
  NOCACHE LOGGING ) ;

TOM Kyte:
預設行為是啟用行記憶體儲(ENABLE STORAGE IN ROW),而且一般來講,如果你知道LOB 總是能
在表本身中放下,就應該採用這種預設行為。例如,你的應用可能有一個某種型別的DESCRIPTION 欄位。
這個DESCRIPTION 可以儲存0~32KB 的資料(或者可能更多,但大多數情況下都少於或等於32KB)。
已知很多描述都很簡短,只有幾百個字元。如果把它們單獨儲存,並在每次獲取時都通過索引來訪問,就
會存在很大的開銷,你完全可以將它們內聯儲存,即放在表本身中,這就能避免單獨儲存的開銷。不僅如
此,如果LOB 還能避免獲取LOB 時所需的物理I/O。

create table test_clob(a clob);

declare
 v_result varchar2(4000);
begin
 v_result := dbms_metadata.get_ddl(object_type => 'TABLE',name => 'TEST_CLOB');
 dbms_output.put_line(v_result);
end;

  CREATE TABLE "SCOTT"."TEST_CLOB" 
   ( "A" CLOB
   ) SEGMENT CREATION DEFERRED 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  TABLESPACE "USERS" 
 LOB ("A") STORE AS BASICFILE (
  TABLESPACE "USERS" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION 
  NOCACHE LOGGING ) 


另外, LOB的一致讀的實現方式與其他資料型別是不一樣的:
LOB的一致讀映像來自於LOB段本身,而不是undo段。




 

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

相關文章