您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)ORACLE 11g的新特性延遲段創(chuàng)建是怎么樣的,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
很多數(shù)據(jù)庫都有存在空表的情況,較多的空表會(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語法的人可能會(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的方式來為空表建立段信息。
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ù)庫字典內(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就無能為力了,要導(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)注億速云行業(yè)資訊頻道。
免責(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)容。