溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ORACLE 11g的新特性延遲段創(chuàng)建是怎么樣的

發(fā)布時(shí)間:2021-11-05 17:29:23 來源:億速云 閱讀:148 作者:柒染 欄目:建站服務(wù)器

這期內(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信息,如下:
ORACLE 11g的新特性延遲段創(chuàng)建是怎么樣的

當(dāng)SEGEMENT CREATIONIMMEDIATE的情況下,ORACLE在建表的時(shí)候,會(huì)為表建立段(SEGMENTS),當(dāng)SEGEMENT CREATIONDEFERRED的情況下,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 CREATIONIMMEDIATE的情況下,ORACLET_TEST_2建立了段,在SEGEMENT CREATIONDEFERRED的情況下,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è)資訊頻道。

向AI問一下細(xì)節(jié)

免責(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)容。

AI