您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關ORACLE 11g的新特性延遲段創建是怎么樣的,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
很多數據庫都有存在空表的情況,較多的空表會占用大量的磁盤空間,ORACLE 在11gR2版本推出延遲段創建新特性,所謂延遲段創建,顧名思義就是在創建一張新空表的時候,ORACLE默認不會為這張空表分配段(SEGMENTS),也就是不會為這張空表分配空間,這樣就避免了空表占用空間的情況,如下實驗:
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));
表已創建。
SQL> SELECT SEGMENT_NAME FROM USER_SEGMENTS WHERE SEGMENT_NAME='T_TEST_1';
未選定行
默認情況下ORACLE沒有為空表(T_TEST_1)分配空間,如果查看過ORACLE11gR2官方文檔關于CREATE TABLE語法的人可能會看到SEGEMENT CREATION信息,如下:
當SEGEMENT CREATION為IMMEDIATE的情況下,ORACLE在建表的時候,會為表建立段(SEGMENTS),當SEGEMENT CREATION為DEFERRED的情況下,ORACLE不會為空表建立段,下面分別演示下這兩種情況的效果。
SQL> CREATE TABLE T_TEST_2(ID NUMBER,NAME VARCHAR2(10))
2 SEGMENT CREATION IMMEDIATE;
表已創建。
SQL> CREATE TABLE T_TEST_3(ID NUMBER,NAME VARCHAR2(10))
2 SEGMENT CREATION DEFERRED;
表已創建。
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建立段,當向沒有分配段的空表中插入信息時,ORACLE會自動為空表建立段。
SQL> INSERT INTO T_TEST_1 VALUES(1,'STREAM');
已創建 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
雖然延遲段創建避免了空表占用空間的問題,但是也為DBA帶點小麻煩,這就是在EXP導出數據的時候,雖然空表的信息也存在數據庫字典內,但是ORACLE不會導出未分配段的空表,這樣在使用EXP做數據遷移的時候,就會遇到點小問題。
SQL> CREATE USER dbdream IDENTIFIED BY dbdream DEFAULT TABLESPACE USERS;
用戶已創建。
SQL> GRANT CONNECT,RESOURCE TO DBDREAM;
授權成功。
SQL> CREATE TABLE T_TEST_1(ID NUMBER,NAME VARCHAR2(10));
表已創建。
SQL> CREATE TABLE T_TEST_2(ID NUMBER,NAME VARCHAR2(10))
2 SEGMENT CREATION IMMEDIATE;
表已創建。
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
已導出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
即將導出指定的用戶...
...
. . 正在導出表 T_TEST_2導出了 0 行
...
成功終止導出, 沒有出現警告。
EXP只能導出已經分配段的表,要導出未分配段的空表EXP就無能為力了,要導出未分配段的空表就需要使用數據泵(EXPDP),使用EXPDP可以導出未分配段的空表。
SQL> CREATE DIRECTORY D_TEST AS 'D:\T_TEST';
目錄已創建。
SQL> GRANT READ,WRITE ON DIRECTORY D_TEST TO DBDREAM;
授權成功。
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 方法進行估計...
...
. . 導出了 "DES"."T_TEST_1" 0 KB 0 行
. . 導出了 "DES"."T_TEST_2" 0 KB 0 行
...
作業 "DES"."SYS_EXPORT_SCHEMA_01" 已于 11:50:47 成功完成
如果非要用EXP做遷移,而且所有空表也都需要遷移,那么就需要使用上文提到的利于ALLOCATE EXTENT創建段的方法。在做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:\ >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
已導出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
即將導出指定的用戶...
...
. . 正在導出表 T_TEST導出了 0 行
. . 正在導出表 T_TEST_2導出了 0 行
...
成功終止導出, 沒有出現警告。
上述就是小編為大家分享的ORACLE 11g的新特性延遲段創建是怎么樣的了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。