這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)ORACLE 11g的新特性延遲段創(chuàng)建是怎么樣的,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
公司主營(yíng)業(yè)務(wù):網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)建站是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)建站推出無(wú)錫免費(fèi)做網(wǎng)站回饋大家。
很多數(shù)據(jù)庫(kù)都有存在空表的情況,較多的空表會(huì)占用大量的磁盤空間,ORACLE在11gR2版本推出延遲段創(chuàng)建新特性,所謂延遲段創(chuàng)建,顧名思義就是在創(chuàng)建一張新空表的時(shí)候,ORACLE默認(rèn)不會(huì)為這張空表分配段(SEGMENTS),也就是不會(huì)為這張空表分配空間,這樣就避免了空表占用空間的情況,如下實(shí)驗(yàn):
SQL> SELECT * FROM V$VERSION;
BANNER
----------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for 32-bit Windows: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
SQL> CREATE TABLE T_TEST_1(ID NUMBER,NAME VARCHAR2(10));
表已創(chuàng)建。
SQL> SELECT SEGMENT_NAME FROM USER_SEGMENTS WHERE SEGMENT_NAME='T_TEST_1';
未選定行
默認(rèn)情況下ORACLE沒有為空表(T_TEST_1)分配空間,如果查看過ORACLE11gR2官方文檔關(guān)于CREATE TABLE語(yǔ)法的人可能會(huì)看到SEGEMENT CREATION信息,如下:
當(dāng)SEGEMENT CREATION為IMMEDIATE的情況下,ORACLE在建表的時(shí)候,會(huì)為表建立段(SEGMENTS),當(dāng)SEGEMENT CREATION為DEFERRED的情況下,ORACLE不會(huì)為空表建立段,下面分別演示下這兩種情況的效果。
SQL> CREATE TABLE T_TEST_2(ID NUMBER,NAME VARCHAR2(10))
2 SEGMENT CREATION IMMEDIATE;
表已創(chuàng)建。
SQL> CREATE TABLE T_TEST_3(ID NUMBER,NAME VARCHAR2(10))
2 SEGMENT CREATION DEFERRED;
表已創(chuàng)建。
SQL> SELECT SEGMENT_NAME FROM USER_SEGMENTS WHERE SEGMENT_NAME LIKE'T_TEST%';
SEGMENT_NAME
-------------
T_TEST_2
可以看到,在SEGEMENT CREATION為IMMEDIATE的情況下,ORACLE為T_TEST_2建立了段,在SEGEMENT CREATION為DEFERRED的情況下,ORACLE沒有為表T_TEST_3建立段,當(dāng)向沒有分配段的空表中插入信息時(shí),ORACLE會(huì)自動(dòng)為空表建立段。
SQL> INSERT INTO T_TEST_1 VALUES(1,'STREAM');
已創(chuàng)建 1行。
SQL> SELECT SEGMENT_NAME FROM USER_SEGMENTS WHERE SEGMENT_NAME LIKE'T_TEST%';
SEGMENT_NAME
------------
T_TEST_1
T_TEST_2
也可以用ALLOCATE EXTENT的方式來(lái)為空表建立段信息。
SQL> ALTER TABLE T_TEST_3 ALLOCATE EXTENT;
表已更改。
SQL> SELECT SEGMENT_NAME FROM USER_SEGMENTS WHERE SEGMENT_NAME LIKE'T_TEST%';
SEGMENT_NAME
------------
T_TEST_1
T_TEST_2
T_TEST_3
雖然延遲段創(chuàng)建避免了空表占用空間的問題,但是也為DBA帶點(diǎn)小麻煩,這就是在EXP導(dǎo)出數(shù)據(jù)的時(shí)候,雖然空表的信息也存在數(shù)據(jù)庫(kù)字典內(nèi),但是ORACLE不會(huì)導(dǎo)出未分配段的空表,這樣在使用EXP做數(shù)據(jù)遷移的時(shí)候,就會(huì)遇到點(diǎn)小問題。
SQL> CREATE USER dbdream IDENTIFIED BY dbdream DEFAULT TABLESPACE USERS;
用戶已創(chuàng)建。
SQL> GRANT CONNECT,RESOURCE TO DBDREAM;
授權(quán)成功。
SQL> CREATE TABLE T_TEST_1(ID NUMBER,NAME VARCHAR2(10));
表已創(chuàng)建。
SQL> CREATE TABLE T_TEST_2(ID NUMBER,NAME VARCHAR2(10))
2 SEGMENT CREATION IMMEDIATE;
表已創(chuàng)建。
D:\ >exp dbdream/dbdream file=d:\dbdream.dmp
Export: Release 11.2.0.1.0 - Production on星期一 2月 13 11:35:22 2012
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
連接到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
已導(dǎo)出 ZHS16GBK字符集和 AL16UTF16 NCHAR字符集
即將導(dǎo)出指定的用戶...
...
. .正在導(dǎo)出表 T_TEST_2導(dǎo)出了 0行
...
成功終止導(dǎo)出,沒有出現(xiàn)警告。
EXP只能導(dǎo)出已經(jīng)分配段的表,要導(dǎo)出未分配段的空表EXP就無(wú)能為力了,要導(dǎo)出未分配段的空表就需要使用數(shù)據(jù)泵(EXPDP),使用EXPDP可以導(dǎo)出未分配段的空表。
SQL> CREATE DIRECTORY D_TEST AS 'D:\T_TEST';
目錄已創(chuàng)建。
SQL> GRANT READ,WRITE ON DIRECTORY D_TEST TO DBDREAM;
授權(quán)成功。
D:\ >expdp dbdream/dbdream directory=D_TEST dumpfile=dbdream.dmp
Export: Release 11.2.0.1.0 - Production on星期一 2月 13 11:50:00 2012
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
連接到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
正在使用 BLOCKS方法進(jìn)行估計(jì)...
...
. .導(dǎo)出了 "DES"."T_TEST_1" 0 KB 0行
. .導(dǎo)出了 "DES"."T_TEST_2" 0 KB 0行
...
作業(yè) "DES"."SYS_EXPORT_SCHEMA_01"已于 11:50:47成功完成
如果非要用EXP做遷移,而且所有空表也都需要遷移,那么就需要使用上文提到的利于ALLOCATE EXTENT創(chuàng)建段的方法。在做EXP操作之前,先使用ALLOCATE EXTENT的方法為空表分配段信息。
SQL> DECLARE
2 V_COUNT NUMBER;
3 BEGIN
4 FOR I IN (SELECT TABLE_NAME FROM USER_TABLES) LOOP
5 EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || I.TABLE_NAME INTO V_COUNT;
6 IF V_COUNT = 0 THEN
7 EXECUTE IMMEDIATE 'ALTER TABLE ' || I.TABLE_NAME || ' ALLOCATE EXTENT';
8 END IF;
9 END LOOP;
10 END;
11 /
PL/SQL過程已成功完成。
SQL> SELECT SEGMENT_NAME FROM USER_SEGMENTS WHERE SEGMENT_NAME LIKE'T_TEST%';
SEGMENT_NAME
------------
T_TEST_1
T_TEST_2
然后在用EXP導(dǎo)出數(shù)據(jù),這樣空表就可以被導(dǎo)出了。
D:\ >exp dbdream/dbdream file=d:\dbdream.dmp
Export: Release 11.2.0.1.0 - Production on星期一 2月 13 11:58:03 2012
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
連接到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
已導(dǎo)出 ZHS16GBK字符集和 AL16UTF16 NCHAR字符集
即將導(dǎo)出指定的用戶...
...
. .正在導(dǎo)出表 T_TEST導(dǎo)出了 0行
. .正在導(dǎo)出表 T_TEST_2導(dǎo)出了 0行
...
成功終止導(dǎo)出,沒有出現(xiàn)警告。
上述就是小編為大家分享的ORACLE 11g的新特性延遲段創(chuàng)建是怎么樣的了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。