[bbk5119] 第105集 第13章 表空间管理 03

 /*

  小实验:在11g下创建表、索引等段信息,在不插入数据的情况下查看其段信息是否产生,这是Oracle 11g r2的一个改进;对比oracle 10g版本的功能就会清晰可见;

*/ 

SQL> conn test/test
Connected.
SQL> select table_name,min_extents from user_tables;

TABLE_NAME                     MIN_EXTENTS
------------------------------ -----------
EMP1                                     1
SEG_TEST                                 1
EXT_EMP2
EXT_EMP1

SQL> create table emp3
  2  as
  3  select * from emp1 where 1=2;

Table created.

SQL> create index emp3_empid_idx on emp3(employee_id) ;

Index created.

SQL> select table_name,min_extents from user_tables;

TABLE_NAME                     MIN_EXTENTS
------------------------------ -----------
EMP1                                     1
SEG_TEST                                 1
EMP3
EXT_EMP2
EXT_EMP1

SQL> desc user_segments;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 SEGMENT_NAME                                       VARCHAR2(81)
 PARTITION_NAME                                     VARCHAR2(30)
 SEGMENT_TYPE                                       VARCHAR2(18)
 SEGMENT_SUBTYPE                                    VARCHAR2(10)
 TABLESPACE_NAME                                    VARCHAR2(30)
 BYTES                                              NUMBER
 BLOCKS                                             NUMBER
 EXTENTS                                            NUMBER
 INITIAL_EXTENT                                     NUMBER
 NEXT_EXTENT                                        NUMBER
 MIN_EXTENTS                                        NUMBER
 MAX_EXTENTS                                        NUMBER
 MAX_SIZE                                           NUMBER
 RETENTION                                          VARCHAR2(7)
 MINRETENTION                                       NUMBER
 PCT_INCREASE                                       NUMBER
 FREELISTS                                          NUMBER
 FREELIST_GROUPS                                    NUMBER
 BUFFER_POOL                                        VARCHAR2(7)
 FLASH_CACHE                                        VARCHAR2(7)
 CELL_FLASH_CACHE                                   VARCHAR2(7)

SQL> select segment_name from user_segments;

SEGMENT_NAME
--------------------------------------------------------------------------------
EMP1
SEG_TEST
EMP_EMPLOYEE_ID_IDX

SQL> select index_name,min_extents from user_indexes;

INDEX_NAME                     MIN_EXTENTS
------------------------------ -----------
EMP3_EMPID_IDX
EMP_EMPLOYEE_ID_IDX                      1

SQL> select extent_id from user_extents where segment_name = 'EMP3';


no rows selected

 
SQL> select extent_id from user_extents where segment_name = 'EMP3';

no rows selected

SQL> select extent_id from user_extents where segment_name = 'EMP3_EMPID_IDX';

no rows selected
SQL> select segment_name,tablespace_name from user_segments;

SEGMENT_NAME                   TABLESPACE_NAME
------------------------------ ------------------------------
EMP1                           TEST_TAB
SEG_TEST                       TEST_TAB
EMP_EMPLOYEE_ID_IDX            TEST_TAB

在11g 版本中,在user_segments数据字典中,未插入数据的表,是没有段信息存在的,一旦插入数据,则 段信息(表、索引)信息则会在插入的时候触发,并分配段信息.但是在orage 10g的版本中,新创建的表及其所对应的索引信息即使没有往里面插入数据,其段信息(表及索引)也会存在.导致这种差异变化的原因,是参数

SQL> insert into emp3 select * from emp1;

107 rows created.

SQL> commit;

Commit complete.

SQL> select segment_name,tablespace_name from user_segments;

SEGMENT_NAME                   TABLESPACE_NAME
------------------------------ ------------------------------
EMP1                           TEST_TAB
SEG_TEST                       TEST_TAB
EMP3                           TEST_TAB
EMP_EMPLOYEE_ID_IDX            TEST_TAB
EMP3_EMPID_IDX                 TEST_TAB
SQL> show parameter segment_creation

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation            boolean     TRUE

假如在创建表时,指定参数选项segment creation immediate,则创建表后立即分配segment信息

SQL> conn test/test
Connected.
SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
EMP1                           TABLE
EMP3                           TABLE
EXT_EMP1                       TABLE
EXT_EMP2                       TABLE
SEG_TEST                       TABLE

SQL> select segment_name,tablespace_name from user_segments;

SEGMENT_NAME                   TABLESPACE_NAME
------------------------------ ------------------------------
EMP1                           TEST_TAB
SEG_TEST                       TEST_TAB
EMP3                           TEST_TAB
EMP_EMPLOYEE_ID_IDX            TEST_TAB
EMP3_EMPID_IDX                 TEST_TAB

SQL> create table emp4
  2  segment creation immediate
  3  as
  4  select * from emp1 where 1=2;

Table created.

SQL> select segment_name,tablespace_name from user_segments;

SEGMENT_NAME                   TABLESPACE_NAME
------------------------------ ------------------------------
EMP1                           TEST_TAB
SEG_TEST                       TEST_TAB
EMP3                           TEST_TAB
EMP4                           TEST_TAB
EMP_EMPLOYEE_ID_IDX            TEST_TAB
EMP3_EMPID_IDX                 TEST_TAB

6 rows selected.

SQL> create index emp4_empid_idx on emp4(employee_id);

Index created.

SQL> select segment_name,tablespace_name from user_segments;

SEGMENT_NAME                   TABLESPACE_NAME
------------------------------ ------------------------------
EMP1                           TEST_TAB
SEG_TEST                       TEST_TAB
EMP3                           TEST_TAB
EMP4                           TEST_TAB
EMP_EMPLOYEE_ID_IDX            TEST_TAB
EMP3_EMPID_IDX                 TEST_TAB
EMP4_EMPID_IDX                 TEST_TAB

7 rows selected.

假如将索引修改为unusable状态,其索引段信息将不复存在

SQL> select segment_name,tablespace_name from user_segments;

SEGMENT_NAME                   TABLESPACE_NAME
------------------------------ ------------------------------
EMP1                           TEST_TAB
SEG_TEST                       TEST_TAB
EMP3                           TEST_TAB
EMP4                           TEST_TAB
EMP_EMPLOYEE_ID_IDX            TEST_TAB
EMP3_EMPID_IDX                 TEST_TAB
EMP4_EMPID_IDX                 TEST_TAB

7 rows selected.

SQL> alter index emp4_empid_idx unusable;

Index altered.

SQL> select segment_name,tablespace_name from user_segments;

SEGMENT_NAME                   TABLESPACE_NAME
------------------------------ ------------------------------
EMP1                           TEST_TAB
SEG_TEST                       TEST_TAB
EMP3                           TEST_TAB
EMP4                           TEST_TAB
EMP_EMPLOYEE_ID_IDX            TEST_TAB
EMP3_EMPID_IDX                 TEST_TAB

6 rows selected.

假如将处于unusable状态的索引进行rebuild操作,其段信息将会重新分配

SQL> select segment_name,tablespace_name from user_segments;

SEGMENT_NAME                   TABLESPACE_NAME
------------------------------ ------------------------------
EMP1                           TEST_TAB
SEG_TEST                       TEST_TAB
EMP3                           TEST_TAB
EMP4                           TEST_TAB
EMP_EMPLOYEE_ID_IDX            TEST_TAB
EMP3_EMPID_IDX                 TEST_TAB

6 rows selected.

SQL> alter index emp4_empid_idx rebuild;

Index altered.

SQL> select segment_name,tablespace_name from user_segments;

SEGMENT_NAME                   TABLESPACE_NAME
------------------------------ ------------------------------
EMP1                           TEST_TAB
SEG_TEST                       TEST_TAB
EMP3                           TEST_TAB
EMP4                           TEST_TAB
EMP_EMPLOYEE_ID_IDX            TEST_TAB
EMP3_EMPID_IDX                 TEST_TAB
EMP4_EMPID_IDX                 TEST_TAB

7 rows selected.
原文地址:https://www.cnblogs.com/arcer/p/3127208.html