您好,登錄后才能下訂單哦!
何為LOB?
lob為oracle數據庫的一個大對象數據類型,可以存儲超過4000bytes的字符串,二進制數據,OS文件等大對象信息.最大可存儲的容量根oracle的版本和oracle 塊大小有關.
有那幾種可供選擇的LOB類型?
目前ORACLE提供了CLOB,NCLOB,BLOB,BFILE共四種LOB類型,CLOB,NLOB為大字符串類型,NLOB為多語言集字符類型,類似于NVARCHAR類型,用他們代替以前的LONG類型;BLOG為大二進制類型,用來代替以前的LONG RAW類型;BFILE可存儲操作系統中的各種文件.
何為Internal LOBs 、External LOBs?
Internal LOBs指的是LOB數據存儲在oracle的tablespace中,CLOB,NCLOB,BLOG都是Internal LOBs; 而External LOBs指的是LOB數據存儲在數據庫外部的操作系統文件中,BFIEL是唯一的External LOBs.BFILE提供了讓我們可以在SQL中訪問外部文件的方法.
LOB到底能存多大的數據呢?
BFILE :Maximum size: 4 GB Maximum size of a file name: 255 characters Maximum size of a directory name: 30 characters Maximum number of open BFILEs: The maximum number of BFILEs is limited by the value of the SESSION_MAX_OPEN_FILES initialization parameter, which is itself limited by the maximum number of open files the operating system will allow. BLOB: Maximum size: (4 GB - 1) * DB_BLOCK_SIZE initialization parameter (8 TB to 128 TB) The number of LOB columns per table is limited only by the maximum number of columns per table (that is,10001). CLOB: Maximum size: (4 GB - 1) * DB_BLOCK_SIZE initialization parameter (8 TB to 128 TB) The number of LOB columns per table is limited onlyby the maximum number of columns per table (that is,10001). NCLOB :Maximum size: (4 GB - 1) * DB_BLOCK_SIZE initialization parameter (8 TB to 128 TB) The number of LOB columns per table is limited only by the maximum number of columns per table (that is,10001).
LOB可以用在什么地方?
LOB除了可以用在TABLE中定義列的類型外,還可以用來存儲XML數據,ORACLE的集合類型,看下面的例子:
1) create table lobtest(a varchar2(20), b clob, c blob) tablespace users; –lob表的定義
2) LOB存儲集合類型
create tablespace person_lob datafile size 102464K autoextend on next 100M maxsize 1024000K extent management local uniform size 1M segment space management auto;
/
alter user mayp quota unlimited on person_lob;
create or replace type person_att is object(id number(5),name varchar2(30),sex varchar2(1),age number(5,2));
/
create or replace type person_atts is varray(5) of person_att;
/
create table person(person_id number(5),attribute1 person_atts)
varray attribute1 store as lob person_attribute(
tablespace person_lob
enable storage in row
chunk 16384
pctversion 5
cache reads
index person_lob_idx)
tablespace users
pctfree 0
/
上面定義了一個用lob存儲varray類型數據的例子.
LOB段有哪些屬性?
默認情況下,當定義了含有LOB字段的table后, oracle會自動為每個LOB創建兩個段,lob segment和lob index segment. lob segment存儲了每個lob的具體的值,而lob index segment則存儲了每個lob值的地址.lob segment、lob index segment和table segment存儲在同一個表空間中.oracle為lob段提供了單獨的段屬性.我們在創建table時可以定義將lob和table分別存儲在不同的表空間中。平常定義lob時,我們必須考慮以下幾個比較重要的屬性:
chunk:比oracle block size更大的一種邏輯塊,專用于LOB數據的存儲,默認為db_block_size的大小,如果手動定義必須定義為db_block_size的倍數.最大不能超過32K。不合理的chunk定義不及浪費存儲空間,而且還會影響性能.那么在定義前必須了解應用, 每個LOB列的數據的平均大小,盡量減少LOB的空間浪費.看下面的表格能說明一切:
Data Size CHUNK Size Disk Space Used to Store the LOB Space Utilization(Percent) 3500 enable storage in row irrelevant 3500 in row 100 3500 disable storage in row 32 KB 32 KB 10 3500 disable storage in row 4 KB 4 KB 90 33 KB 32 KB 64 KB 51 2 GB +10 32 KB 2 GB + 32 KB 99+
上面表格用一些數據說明了chunk跟數據之間的存儲關系,更形象的說明了磁盤空間的利率問題。 紅色標記的部分說明了不合理的chunk定義.必須注意到的LOB中比chunk浪費的空間是不可以重用的.
disable/enable storage in row: 默認情況下為enable storage in row, 在沒有分離lob段的情況下,table中的每行數據都存儲在同一個block中,這樣如果lob列很大時,可能會造成嚴重的行鏈接;當lob段和table段分離的情況下,oracle會自動將小于4k的lob數據存儲在table segment,將大于4k的lob數據存儲在lob段.如果設置為 disable storage in row的情況時,在lob段和table段分離的情況下, 不管lob數據多大,oracle都會將lob數據存儲在lob段,這樣就出現了上面的
3500 disable storage in row 32 KB ,32 KB ,10情況,浪費了90%的存儲空間.
pctversion n /retention:這兩個屬性用來解決lob段的一致性讀問題。lob的特殊性決定它不能使用undo/rollback segment來管理自己的更新的old version,通常lob會在自己所在的表空間中劃分一部分空間來管理自己的undo,保證read consistent.lob中更新原理是在lob segment中分配新的chunk插入新的數據,保留舊的鏡像,如果一個數據有多個更新存在的話, 那么就會存在多個版本.pctversion用來定義lob segment中undo區域的大小,pctverision 是一個百分比,定義所有lob空間用來存放前鏡像的百分比,如果前鏡像使用空間超過這個百分比了,oracle不自動擴展這部分的大小, 會重用這些前鏡像的空間.如果一個lob segment段的更新很頻繁的情況下,那么該lob段的增長可能會很快.retention是9i的新參數, 只能用在tablespace采用ASSM的情況,在lob更新的時候,前鏡像會保留一段時間, 具體的時間由undo_retention參數決定.決定采用乃種undo 方式,必須對應用測試后在決定.
nocache/cache reads/cache:定義LOB的cache 方式,nocache為不cache任何 lob數據;cache reads為在lob read的情況下cache數據;cache為讀寫都cache數據.
lob創建的例子:
create table person_new(id number(5),name varchar2(30),remark clob,photo blob not null)
lob (remark) store as person_remark(
tablespace person_lob
enable storage in row
chunk 8192
pctversion 2
cache reads
index person_remark_idx)
lob (photo) store as person_photo(
tablespace person_lob
disable storage in row
chunk 16384
pctversion 2
cache reads
index person_photo_idx)
tablespace users
pctfree 10
/
LOB可以在SQL環境操作嗎?
LOB可以像使用其他數據類型一樣,可以進行DML操作.
insert into person_new values(1,’robin.ma’,'he is a goold boy’,empty_blob());
update person_new set remark=’he is a goog boy,he is from Beijing China’ where id = 1;
delete from person_new where id = 1;
commit;
create table bfile_test(files bfile) tablespace users;
insert into bfile_test values(bfilename(’EXPORT’,'c.dat’));
commit;
SQL> select * from bfile_test;
SP2-0678: Column or attribute type can not be displayed by SQL*Plus
SQL> select * from person_new;
SP2-0678: Column or attribute type can not be displayed by SQL*Plus
SQL> select remark from person_new;
REMARK
——————————————————————————–
he is a goog boy,he is from Beijing China
從上面的例子可以查看,BLOG和BFIEL 是不能直接在sql*plus顯示的.
可以操作LOB的API有哪些?
PL/SQL可以用DBMS_LOB操作任何的LOB,BFILE對象,Oracle還提供了OCI編程接口操作LOB。Java,C#都提供了相應的API操作LOB。
怎樣將其他字符類型轉換成CLOB,二進制類型轉換成BLOB?
通過TO_CLOB可以將CHAR,NCHAR,VARCHAR2,NVARCHAR2,NCLOB類型轉換成CLOB;
通過TO_LOB可以將LONG RAW轉換成BLOB,LONG轉換成CLOB;
通過TO_NCLOB可以將CHAR,NCHAR,VARCHAR2,NVARCHAR2,CLOB轉換成NCLOB。
LOB對象可以db link遠程操作嗎?
除了BFILE,CLOB,BLOB可以局部的訪問和操作遠程LOB對象.目前下列操作是允許的:
CREATE TABLE AS SELECT …FROM table@remote;
INSERT INTO .. SELECT * FORM table@remote;
UPDATE …SET .. = (SELECT ..FROM table@remote);
INSERT INTO TABLE@REMOTE(…) AS SELECT * FROM LOCAL_TABLE;
UPDATE remote@table SET .. = (SELECT .. FROM local_table);
DELETE FROM remote@table WHERE …..
LOB相關的SQL function和DBMS_LOB不允許訪問和操作遠程的LOB對象。
LOB列可以索引嗎?
目前CLOB列支持Oracle Text Index,Domain Index,Function-Base Index,Extensible Index.
LOB支持分區表嗎?
可以在分區表使用LOB列,并且還支持exchange partition,move partition,merge partition等操作.
LOB支持Index-organization table嗎?
oracle支持在index-organization table中創建clob,blog和bfile列, 但不支持在分區的index-organization table中創建lob列.
參考:Oracle Database Application Developer’s Guide - Large Objects 10g Release 2 (10.2)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。