您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“LOB類型有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“LOB類型有哪些”吧!
LOB相關(guān)的概念
LOB類型:
將信息文件(十進(jìn)制、二進(jìn)制)、圖像甚至音頻信息采用數(shù)據(jù)庫作為保存載體時(shí),就需要使用lob類型數(shù)據(jù)。
有兩種Lob,Internal Lob和External Lob。Internal Lob是指Lob數(shù)據(jù)存儲(chǔ)在Oracle數(shù)據(jù)文件里,External Lob是指Lob數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫外部的操作系統(tǒng)中。
CLOB: 存儲(chǔ)大量、單字節(jié)、字符數(shù)據(jù),存儲(chǔ)在內(nèi)部表空間,用于存儲(chǔ)字符串類型的Lob,如文本和XML文件等,字符串已數(shù)據(jù)庫字符集編碼。
NLOB: 存儲(chǔ)定寬、多字節(jié)、字符數(shù)據(jù),多字節(jié)國家字符數(shù)據(jù),存儲(chǔ)在內(nèi)部表空間。
BLOB: 存儲(chǔ)較大無結(jié)構(gòu)的二進(jìn)制數(shù)據(jù),存儲(chǔ)在內(nèi)部表空間。
BFILE: 將二進(jìn)制文件存儲(chǔ)在數(shù)據(jù)庫外部的操作系統(tǒng)文件中。存放文件路徑。數(shù)據(jù)庫存儲(chǔ)一個(gè)執(zhí)行外部文件的指針,所以它是只讀的。
Internal Lob和External Lob的區(qū)別:
Internal Lob包含CLOB、NLOB和BLOB;External Lob只有BFILE。
Internal LOB可以作為表的一個(gè)列保存在表中,external LOB保存在操作系統(tǒng)上的文件中。
Internal LOB將數(shù)據(jù)以字節(jié)流的形式存儲(chǔ)在數(shù)據(jù)庫的內(nèi)部。Internal LOB的許多操作都可以參與事務(wù),可以像處理普通數(shù)據(jù)一樣對(duì)其進(jìn)行備份和恢復(fù)操作。
External Lob,即BFILE類型。在數(shù)據(jù)庫內(nèi),該類型僅存儲(chǔ)數(shù)據(jù)在操作系統(tǒng)中的位置信息,而數(shù)據(jù)的實(shí)體以外部文件的形式存在于操作系統(tǒng)的文件系統(tǒng)中。因而,該類型所表示的數(shù)據(jù)是只讀的,不參與事務(wù)。
Internal LOBs use copy semantics. That is when you INSERT or UPDATE a LOB with a LOB from another row in a table, the LOB locator as well as the LOB value are copied to the row. External LOBs on the other hand use reference semantics. That is only the BFILE location is copied and not the actual operating system file.
Each internal LOB column has a distinct LOB locator for each row and a distinct copy of the LOB value. Each BFILE column has its own BFILE locator for each row. However you could have two rows in the table that contain BFILE locators pointing to the same operating system file.
對(duì)于一般的數(shù)據(jù)表而言,一個(gè)數(shù)據(jù)表只會(huì)對(duì)應(yīng)一個(gè)存儲(chǔ)數(shù)據(jù)段data segment對(duì)象。對(duì)于分區(qū)表,通常一個(gè)分區(qū)就對(duì)應(yīng)一個(gè)單獨(dú)的存儲(chǔ)對(duì)象。
當(dāng)數(shù)據(jù)表中包括lob類型的數(shù)據(jù)列時(shí),也會(huì)有獨(dú)特的段對(duì)象建立。常規(guī)的數(shù)據(jù)段之外,另外增加了兩個(gè)明顯是系統(tǒng)命名的段對(duì)象,類型分別為lobsegment和lobindex。
對(duì)Oracle lob類型數(shù)據(jù)表而言,一個(gè)帶lob列的數(shù)據(jù)表創(chuàng)建是要對(duì)應(yīng)多個(gè)數(shù)據(jù)段創(chuàng)建的。除了傳統(tǒng)的數(shù)據(jù)表創(chuàng)建的數(shù)據(jù)段Table Data Segment之外,一個(gè)lob列都會(huì)生成兩個(gè)專門的段:lob段和lob索引段。
Lob段(LobSegment)對(duì)應(yīng)的是存放在數(shù)據(jù)表lob列上的數(shù)據(jù)。在Oracle的lob類型數(shù)據(jù)列,有兩種保存位置結(jié)構(gòu)。一個(gè)是in-row storage,也就是每一行的lob數(shù)據(jù)同其他列的數(shù)據(jù)以行的形式一起保存在數(shù)據(jù)塊中。這種情況的lob列取值較小。而另一種為out-of-row storage,當(dāng)lob對(duì)象較大,不能保存在一個(gè)數(shù)據(jù)塊中時(shí),可以將其放置在一個(gè)獨(dú)立lobsegment中進(jìn)行保存。而out-of-row storage時(shí)數(shù)據(jù)行中l(wèi)ob列上保存的只是一個(gè)指向lobsegment對(duì)應(yīng)位置的指針引用。
Lob索引段(LobIndex)是Oracle為每一個(gè)lob類型列強(qiáng)制生成的索引,主要作用是用于進(jìn)行l(wèi)ob類型數(shù)據(jù)檢索加速的操作。Lob index與lob列共生,如果強(qiáng)制進(jìn)行刪除操作,是會(huì)報(bào)錯(cuò)的。
SQL> drop index SYS_IL0000056069C00002$$;
drop index SYS_IL0000056069C00002$$
ORA-22864: 無法 ALTER 或 DROP LOB 索引
在實(shí)際物理設(shè)計(jì)部署過程中,經(jīng)常有將大對(duì)象分區(qū)和存儲(chǔ)單獨(dú)部署表空間的情況??梢愿鶕?jù)實(shí)際的情況,將一些很大的lob列連同索引保存在單獨(dú)的表空間上。
但是注意,一般數(shù)據(jù)表而言,lob段和lob index段是在一個(gè)表空間上。即使在SQL語法上存在支持,但是將lob段和lobindex分開存儲(chǔ)的語句通常被忽略掉。
Lob與其它類型的轉(zhuǎn)換:
通過TO_CLOB可以將CHAR,NCHAR,VARCHAR2,NVARCHAR2,NCLOB類型轉(zhuǎn)換成CLOB;
通過TO_LOB可以將LONG RAW轉(zhuǎn)換成BLOB,LONG轉(zhuǎn)換成CLOB;
通過TO_NCLOB可以將CHAR,NCHAR,VARCHAR2,NVARCHAR2,CLOB轉(zhuǎn)換成NCLOB。
LOB段屬性:
默認(rèn)情況下,當(dāng)定義了含有LOB字段的table后, oracle會(huì)自動(dòng)為每個(gè)LOB創(chuàng)建兩個(gè)段,lob segment和lob index segment. lob segment存儲(chǔ)了每個(gè)lob的具體的值,而lob index segment則存儲(chǔ)了每個(gè)lob值的地址.lob segment、lob index segment和table segment存儲(chǔ)在同一個(gè)表空間中.oracle為lob段提供了單獨(dú)的段屬性.我們?cè)趧?chuàng)建table時(shí)可以定義將lob和table分別存儲(chǔ)在不同的表空間中。平常定義lob時(shí),我們必須考慮以下幾個(gè)比較重要的屬性:
chunk:比oracle block size更大的一種邏輯塊,專用于LOB數(shù)據(jù)的存儲(chǔ),默認(rèn)為db_block_size的大小,如果手動(dòng)定義必須定義為db_block_size的倍數(shù).最大不能超過32K。不合理的chunk定義不僅浪費(fèi)存儲(chǔ)空間,而且還會(huì)影響性能.那么在定義前必須了解應(yīng)用, 每個(gè)LOB列的數(shù)據(jù)的平均大小,盡量減少LOB的空間浪費(fèi).看下面的表格能說明一切:
上面表格用一些數(shù)據(jù)說明了chunk跟數(shù)據(jù)之間的存儲(chǔ)關(guān)系,更形象的說明了磁盤空間的利率問題。 紅色標(biāo)記的部分說明了不合理的chunk定義.必須注意到的LOB中chunk浪費(fèi)的空間是不可以重用的.
disable/enable storage
in row: 默認(rèn)情況下為enable storage in row, 在沒有分離lob段的情況下,table中的每行數(shù)據(jù)都存儲(chǔ)在同一個(gè)block中,這樣如果lob列很大時(shí),可能會(huì)造成嚴(yán)重的行鏈接;當(dāng)lob段和table段分離的情況下,oracle會(huì)自動(dòng)將小于4k的lob數(shù)據(jù)存儲(chǔ)在table
segment,將大于4k的lob數(shù)據(jù)存儲(chǔ)在lob段.
如果設(shè)置為 disable storage in
row的情況時(shí),在lob段和table段分離的情況下, 不管lob數(shù)據(jù)多大,oracle都會(huì)將lob數(shù)據(jù)存儲(chǔ)在lob段,這樣就出現(xiàn)了上面的3500 disable storage in row 32 KB ,32 KB ,10情況,浪費(fèi)了90%的存儲(chǔ)空間.
pctversion/retention:這兩個(gè)屬性用來解決lob段的一致性讀問題。lob的特殊性決定它不能使用undo/rollback
segment來管理自己的更新的old version,通常lob會(huì)在自己所在的表空間中劃分一部分空間來管理自己的undo,保證read
consistent。
lob中更新原理是在lob segment中分配新的chunk插入新的數(shù)據(jù),保留舊的鏡像,如果一個(gè)數(shù)據(jù)有多個(gè)更新存在的話,
那么就會(huì)存在多個(gè)版本.pctversion用來定義lob segment中undo區(qū)域的大小,pctverision
是一個(gè)百分比,定義所有l(wèi)ob空間用來存放前鏡像的百分比,如果前鏡像使用空間超過這個(gè)百分比了,oracle不自動(dòng)擴(kuò)展這部分的大小,
會(huì)重用這些前鏡像的空間.如果一個(gè)lob segment段的更新很頻繁的情況下,那么該lob段的增長可能會(huì)很快.retention是9i的新參數(shù), 只能用在tablespace采用ASSM的情況,在lob更新的時(shí)候,前鏡像會(huì)保留一段時(shí)間, 具體的時(shí)間由undo_retention參數(shù)決定.采用哪種undo 方式,必須對(duì)應(yīng)用測(cè)試后在決定.
nocache/cache reads/cache:定義LOB的cache方式,
nocache為不cache任何lob數(shù)據(jù);
cache reads為在lob read的情況下cache數(shù)據(jù);
cache為讀寫都cache數(shù)據(jù).
freepools integer:給log segment指定free list。RAC環(huán)境下integer為實(shí)例的個(gè)數(shù).單實(shí)例環(huán)境下為1
index lobindexname (tablespace tablesapce_name ((storage.....):給lob列指定索引存儲(chǔ)參數(shù)
lob創(chuàng)建的例子:
SQL> create tablespace person_lob datafile '+data' size 10m;
Tablespace created.
SQL> 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;
Table created.
--查詢:
SQL> select OWNER,SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME from dba_segments where SEGMENT_NAME='PERSON_NEW';
OWNER SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME
------------------------------ ------------------------- ------------------ ------------------------------
SYS PERSON_NEW TABLE USERS
SQL> select table_name,column_name,segment_name,tablespace_name,index_name,chunk from USER_LOBS WHERE table_name='PERSON_NEW';
TABLE_NAME COLUMN_NAME SEGMENT_NAME TABLESPACE_NAME INDEX_NAME CHUNK
------------------------------ --------------- ------------------------- ------------------------------ ------------------------------ ----------
PERSON_NEW REMARK PERSON_REMARK PERSON_LOB PERSON_REMARK_IDX 8192
PERSON_NEW PHOTO PERSON_PHOTO PERSON_LOB PERSON_PHOTO_IDX 16384
SQL>
創(chuàng)建實(shí)驗(yàn)環(huán)境:
--創(chuàng)建表空間test、test_ind、test_tmp、test_blob并建立測(cè)試用戶test,
SQL> create tablespace test datafile '+DATA' size 20m;
Tablespace created.
SQL> create tablespace test_ind datafile '+DATA' size 20m;
Tablespace created.
SQL> create temporary tablespace test_tmp TEMPFILE '+DATA' size 20m;
Tablespace created.
SQL> create tablespace test_blob datafile '+DATA' size 20m;
Tablespace created.
SQL> create user test identified by test default tablespace test temporary tablespace test_tmp;
User created.
SQL> grant connect,resource to test;
Grant succeeded.
SQL> create directory EXPDP as '/home/oracle';
Directory created.
SQL> grant read,write on directory EXPDP to system;
Grant succeeded.
--給表空間test_ind、test_blob、test 擴(kuò)容
SQL> alter tablespace test_ind add datafile '+DATA' size 400M;
Tablespace altered.
SQL> alter tablespace test_blob add datafile '+DATA' size 400M;
Tablespace altered.
SQL> alter tablespace test add datafile '+DATA' size 400M;
Tablespace altered.
--在test下創(chuàng)建含lob字段的表t1:
SQL> conn test/test
Connected.
SQL>
SQL> create table T1(id number(8),name varchar2(10),addr blob,res clob,photo bfile)
lob (addr) store as testblob
( tablespace test_blob
chunk 16k
disable storage in row
)
lob (res) store as testclob
( tablespace test_blob
chunk 16k
disable storage in row
);
Table created.
SQL> show user;
USER is "TEST"
SQL> select table_name,tablespace_name from user_tables;
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
T1 TEST
SQL>
表是創(chuàng)建在TEST表空間中。
---加載數(shù)據(jù):
SQL> Insert Into T1 Values(1,'Gene',empty_blob(),empty_clob(),bfilename('EXPDP','IMG_0210.JPG'));
1 row created.
SQL> Insert Into T1 Values(2,'Gene',empty_blob(),'大字段CLOB',bfilename('EXPDP','IMG_0210.JPG'));
1 row created.
SQL> Insert Into T1 Values(3,'Gene',empty_blob(),empty_clob(),null);
1 row created.
SQL> commit;
--查詢:
SQL> set lines 200
SQL> col COLUMN_NAME for a20
SQL> select table_name,column_name,segment_name,tablespace_name,index_name,chunk from user_lobs;
TABLE_NAME COLUMN_NAME SEGMENT_NAME TABLESPACE_NAME INDEX_NAME CHUNK------------------------------ -------------------- ------------------------------ ------------------------------ ------------------------------ ----------
T1 ADDR TESTBLOB TEST_BLOB SYS_IL0000088708C00003$$ 16384
T1 RES TESTCLOB TEST_BLOB SYS_IL0000088708C00004$$ 16384
可以看到 TESTBLOB、TESTCLOB 這兩個(gè)SEGMENT名稱是在創(chuàng)建表的時(shí)候定義的
SQL> conn / as sysdba
Connected.
SQL> col SEGMENT_NAME for a25
SQL> select OWNER,SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME from dba_segments where OWNER='TEST';
OWNER SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME
------------------------------ ------------------------- ------------------ ------------------------------
TEST T1 TABLE TEST
TEST TESTCLOB LOBSEGMENT TEST_BLOB
TEST TESTBLOB LOBSEGMENT TEST_BLOB
TEST SYS_IL0000088708C00004$$ LOBINDEX TEST_BLOB
TEST SYS_IL0000088708C00003$$ LOBINDEX TEST_BLOB
從這里可以看到 TESTCLOB、TESTBLOB都是LOBSEGMENT類型的segment,SYS_IL0000087540C00004$$和SYS_IL0000087540C00003$$ 是LOBINDEX類型的 segment對(duì)象,且是自動(dòng)創(chuàng)建的。
Lob大對(duì)象操作、管理
--創(chuàng)建有大對(duì)象字段的一張表
SQL> !export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
SQL> grant read,write on directory EXPDP to test;
Grant succeeded.
SQL> conn test/test
Connected.
SQL>
SQL> create table test001 (fname varchar2(50),content blob);
Table created.
SQL> create table test002 (fname varchar2(50),content clob);
Table created.
--(一)..準(zhǔn)備插入大對(duì)象
--1. 創(chuàng)建文件存放目錄(讓Oracle管理,該目錄)
前面已經(jīng)創(chuàng)建好了。。。。。。。。。。。。
--2.可以將該目錄授權(quán)給其他用戶訪問
grant read,write on directory EXPDP to scott;
--(二).準(zhǔn)備將大對(duì)象,存放在test001表中
declare
tempimg blob;
tempdir bfile := bfilename('EXPDP', 'IMG_0210.jpg');
begin
insert into test001
values
('IMG_0210.jpg', empty_blob())
returning content into tempimg;
dbms_lob.fileopen(tempdir);
dbms_lob.loadfromfile(tempimg, tempdir, dbms_lob.getlength(tempdir));
dbms_lob.fileclose(tempdir);
dbms_output.put_line('恭喜你,終于成功了?。?!');
commit;
end;
/
PL/SQL procedure successfully completed.
--將Blob對(duì)象,寫成磁盤文件
declare
l_file utl_file.file_type;
l_buffer raw(32767);
l_amount binary_integer := 3276;
l_pos int := 1;
l_blob blob;
l_blob_len int;
begin
select content into l_blob from test001;
l_blob_len := dbms_lob.getlength(l_blob);
l_file := utl_file.fopen('EXPDP', 'HHAHAHAHAHAHAHAHAAHA.JPG', 'wb');
while l_pos dbms_lob.read(l_blob, l_amount, l_pos, l_buffer) ;
utl_file.put_raw(l_file, l_buffer, true) ; l_pos :=
l_pos + l_amount ; end loop
;
utl_file.fclose(l_file);
dbms_output.put_line('恭喜你,終于成功了!?。?#39;);
end;
/
PL/SQL procedure successfully completed.
實(shí)際測(cè)試的時(shí)候 HHAHAHAHAHAHAHAHAAHA.JPG的大小 跟 IMG_0210.jpg一致,可以打開。
/*文本大對(duì)象的寫入和讀?。╟lob)*/
--寫入文本文件第一種方式
declare
tempimg clob;
tempdir bfile := bfilename('EXPDP', '70093.txt');
amount int := dbms_lob.getlength(tempdir);
src_offset int := 1;
dest_offset int := 1;
csid int := 0;
lc int := 0;
warning int;
begin
insert into test002
values
('FIRST', empty_clob())
returning content into tempimg;
dbms_lob.fileopen(tempdir);
dbms_lob.loadclobfromfile(tempimg,
tempdir,
amount,
dest_offset,
src_offset,
csid,
lc,
warning);
dbms_lob.fileclose(tempdir);
dbms_output.put_line('恭喜你終于成功了');
commit;
end;
/
PL/SQL procedure successfully completed.
--寫入文本文件第二種方式(通過異常判斷文件結(jié)束的)
declare
filecontent clob;
input_file utl_file.file_type;
buffer varchar2(2000);
l_pos int := 1;
amount int;
begin
insert into test002
values
('SECOND', empty_clob())
returning content into filecontent;
input_file := utl_file.fopen('EXPDP', '2.txt', 'r');
loop
utl_file.get_line(input_file, buffer);
amount := length(buffer);
exit when amount <= 0;
dbms_lob.write(filecontent, amount, l_pos, buffer);
l_pos := l_pos + amount;
end loop;
utl_file.fclose(input_file);
dbms_output.put_line('文件寫入完畢');
exception
when no_data_found then
dbms_output.put_line('恭喜你終于成功了');
utl_file.fclose(input_file);
end;
/
PL/SQL procedure successfully completed.
--讀取表中的數(shù)據(jù),到文件
declare
src clob;
outfile utl_file.file_type;
length integer;
buffer varchar2(8000);
begin
select content into src from test002 where fname = 'SECOND';
length := dbms_lob.getlength(src);
dbms_lob.read(src, length, 1, buffer);
outfile := utl_file.fopen('EXPDP', 'hahahahhahahahah.txt', 'w', 8000);
utl_file.put(outfile, buffer);
utl_file.fclose(outfile);
dbms_output.put_line('寫入完畢');
end;
/
PL/SQL procedure successfully completed.
清理CLOB字段及壓縮CLOB空間
1、創(chuàng)建LOB字段存放表空間:
create tablespace lob_test datafile '/oracle/data/lob_test.dbf' size 500m autoextend on next 10m maxsize unlimited;
2、移動(dòng)LOB字段到單獨(dú)存放表空間:
ALTER TABLE CENTER_ADMIN.NWS_NEWS
MOVE LOB(ABSTRACT)
STORE AS (TABLESPACE lob_test);
說明:ABSTRACT---為一CLOB類型的字段lob_test---為新創(chuàng)建的表空間。
3、清空指定時(shí)間段CLOB字段的內(nèi)容:
update CENTER_ADMIN.NWS_NEWS
set ABSTRACT=EMPTY_CLOB()
where substr(to_char(pubdate,'yyyy-mm-dd'),1,4)='2011'
4、單獨(dú)shrink CLOB字段:
ALTER TABLE CENTER_ADMIN.NWS_NEWS MODIFY LOB (ABSTRACT) (SHRINK SPACE);
--注:此方法會(huì)在表空間級(jí)釋放出部分空間給其他對(duì)象使用,但這部分空間在操作系統(tǒng)級(jí)還是被占用
5、在操作系統(tǒng)級(jí)釋放空間 (這一步 一般不做):
alter database datafile '/oracle/data/lob_test.dbf' resize 400m
--注:絕大多數(shù)情況下,不可能一個(gè)表空間中只存放一個(gè)CLOB字段,若需要從操作系統(tǒng)級(jí)真正釋放空間,尚需要shink table或EXP/IMP等操作。
帶LOB字段表的移動(dòng)
對(duì)含blob字段表遷移:
SQL> select 'alter table '||t.table_name ||' move tablespace tabespace_name lob('||t.COLUMN_NAME||') store as (tablespace tablespace_name);' from user_lobs t;
'ALTERTABLE'||T.TABLE_NAME||'MOVETABLESPACETABESPACE_NAMELOB('||T.COLUMN_NAME||')STOREAS(TABLESPACETABLESPACE_NAME);'
-----------------------------------------------------------------------------------------------------------------------
alter table T1 move tablespace tabespace_name lob(ADDR) store as (tablespace tablespace_name);
alter table T1 move tablespace tabespace_name lob(RES) store as (tablespace tablespace_name);
alter table TEST001 move tablespace tabespace_name lob(CONTENT) store as (tablespace tablespace_name);
alter table TEST002 move tablespace tabespace_name lob(CONTENT) store as (tablespace tablespace_name);
--將t1表的lob字段遷移到test_ind表空間:如下
SQL> alter table T1 move tablespace test lob(ADDR) store as (tablespace test_ind);
Table altered.
SQL> alter table T1 move tablespace test lob(RES) store as (tablespace test_ind);
Table altered.
SQL> select OWNER,SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME from dba_segments where OWNER='TEST';
OWNER SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME
------------------------------ ------------------------- ------------------ ------------------------------
TEST SYS_LOB0000088713C00002$$ LOBSEGMENT TEST
TEST SYS_IL0000088713C00002$$ LOBINDEX TEST
TEST TEST001 TABLE TEST
TEST T1 TABLE TEST
TEST TESTCLOB LOBSEGMENT TEST_IND
TEST TESTBLOB LOBSEGMENT TEST_IND
TEST SYS_IL0000088708C00003$$ LOBINDEX TEST_IND
TEST SYS_IL0000088708C00004$$ LOBINDEX TEST_IND
8 rows selected.
SQL> select INDEX_NAME,OWNER,STATUS from dba_indexes where TABLE_NAME='T1' and TABLE_OWNER='TEST';
INDEX_NAME OWNER STATUS
------------------------------ ---------- --------
SYS_IL0000088708C00003$$ TEST VALID
SYS_IL0000088708C00004$$ TEST VALID
可以看到同一個(gè)lob字段的 LOBSEGMENT和LOBINDEX類型的segment同時(shí)移動(dòng)到了TEST_IND表空間,且索引處于有效狀態(tài)。
--帶LOB字端表的導(dǎo)入導(dǎo)出
create directory EXPDP as '/home/oracle';
grant read,write on directory EXPDP to system;
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
--上述前面已經(jīng)做完,直接進(jìn)行導(dǎo)入導(dǎo)出,如下;
[oracle@dbrac1 ~]$ expdp system/oracle directory=EXPDP tables=test.t1 dumpfile=20171129exp.dmp logfile=20171129exp.log
Export: Release 11.2.0.4.0 - Production on Wed Oct 18 12:33:55 2017
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options
Starting "SYSTEM"."SYS_EXPORT_TABLE_01": system/******** directory=EXPDP tables=test.t1 dumpfile=20171129exp.dmp logfile=20171129exp.log
Estimate in progress using BLOCKS method...
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 192 KB
Processing object type TABLE_EXPORT/TABLE/TABLE
. . exported "TEST"."T1" 6.757 KB 3 rows
Master table "SYSTEM"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYSTEM.SYS_EXPORT_TABLE_01 is:
/home/oracle/20171129exp.dmp
Job "SYSTEM"."SYS_EXPORT_TABLE_01" successfully completed at Wed Oct 18 12:35:14 2017 elapsed 0 00:01:04
[oracle@dbrac1 ~]$
--接著進(jìn)行導(dǎo)入
導(dǎo)入表test到scott用戶下,user表空間中,lob字段保存到test_blob中。
先檢查:
SQL> conn scott/tiger;
Connected.
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BONUS TABLE
DEPT TABLE
EMP TABLE
SALGRADE TABLE
T4 TABLE
--再進(jìn)行導(dǎo)入操作
[oracle@dbrac1 ~]$ impdp system/oracle directory=EXPDP tables=test.t1 remap_schema=test:scott remap_tablespace=test:users,TEST_IND:TEST_BLOB dumpfile=20171129exp.dmp logfile=20171129imp.log
Import: Release 11.2.0.4.0 - Production on Wed Oct 18 12:39:53 2017
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options
Master table "SYSTEM"."SYS_IMPORT_TABLE_01" successfully loaded/unloaded
Starting "SYSTEM"."SYS_IMPORT_TABLE_01": system/******** directory=EXPDP tables=test.t1 remap_schema=test:scott remap_tablespace=test:users,TEST_IND:TEST_BLOB dumpfile=20171129exp.dmp logfile=20171129imp.log
Processing object type TABLE_EXPORT/TABLE/TABLE
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
. . imported "SCOTT"."T1" 6.757 KB 3 rows
Job "SYSTEM"."SYS_IMPORT_TABLE_01" successfully completed at Wed Oct 18 12:40:09 2017 elapsed 0 00:00:12
[oracle@dbrac1 ~]$
--驗(yàn)證:
SQL> select OWNER,SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME from dba_segments where OWNER='SCOTT';
OWNER SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME
------------------------------ ------------------------- ------------------ ------------------------------
SCOTT PK_EMP INDEX USERS
SCOTT PK_DEPT INDEX USERS
SCOTT T4 TABLE PARTITION USERS
SCOTT T4 TABLE PARTITION USERS
SCOTT T1 TABLE USERS
SCOTT SALGRADE TABLE USERS
SCOTT EMP TABLE USERS
SCOTT DEPT TABLE USERS
SCOTT TESTCLOB LOBSEGMENT TEST_BLOB
SCOTT TESTBLOB LOBSEGMENT TEST_BLOB
SCOTT SYS_IL0000088773C00004$$ LOBINDEX TEST_BLOB
OWNER SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME
------------------------------ ------------------------- ------------------ ------------------------------
SCOTT SYS_IL0000088773C00003$$ LOBINDEX TEST_BLOB
12 rows selected.
數(shù)據(jù)已經(jīng)導(dǎo)入到 user用戶下,原來lob的字段導(dǎo)入到test_blob表空間中
LOB性能問題
lob字段默認(rèn)生成lobindex和lobsegment,在不指定特定表空間情況下,lob字段索引存儲(chǔ)到系統(tǒng)表空間下。
當(dāng)lob存放在表中的時(shí)候,它可以被緩存,對(duì)于它的操作效率遠(yuǎn)遠(yuǎn)高于存儲(chǔ)在lobsegment中的lob(不用lobindex)。
當(dāng)lob存放logsegment中,缺省不在緩沖區(qū)緩存,對(duì)于lob的讀寫都是物理IO,代價(jià)非常高,所以對(duì)于大于4kb的lob字段千萬不要頻繁更新,效率非常低。
當(dāng)lob存放logsegment中,可定義指定使用cache(默認(rèn)是nocache),這對(duì)于中等大小的lob(比如幾k~幾十k)很有效果,減少物理IO。
到此,相信大家對(duì)“LOB類型有哪些”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。