Hey!! Sky!

Mar 29, 2006

与 Partitioned Table 的第一次不完全接触

    刚才逛 CNOUG 的时候看到有人问关于分区表的问题,RudolfLu 非常白话的解释了问题,不过还是不是非常明白,正好今天看到 Managing Partitioned Tables and Indexes,还没有看完,先做了些简单的实验。


    创建一个简单的 HASH 分区表:



SQL> ed
Wrote file afiedt.buf


  1  CREATE TABLE scubagear
  2       (id NUMBER,
  3        name VARCHAR2 (60))
  4     PARTITION BY HASH (id)
  5      ( PARTITION id1
  6          TABLESPACE CWMLITE,
  7        PARTITION id2
  8          TABLESPACE TOOLS,
  9        PARTITION id3
 10          TABLESPACE EXAMPLE,
 11        PARTITION id4
 12*         TABLESPACE USERS )
SQL> /


Table created. 


Oracle Concepts 上说,分区表的每个分区都是一个 segment,这个可以从下面的操作看出来,不过他们的 SEGMENT_NAME 都是分区表的名字,而 PARTITION_NAME 才是分区的名字,如果用分区名作为 SEGMENT_NAME 来查询是没有结果的:



SQL> select segment_name,PARTITION_name,tablespace_name,bytes
  2  from user_segments
  3  where segment_name='SCUBAGEAR';


SEGMENT_NAME    PARTITION_NAME  TABLESPACE_NAME      BYTES
--------------- --------------- --------------- ----------
SCUBAGEAR       ID1             CWMLITE              65536
SCUBAGEAR       ID2             TOOLS                65536
SCUBAGEAR       ID3             EXAMPLE              65536
SCUBAGEAR       ID4             USERS                65536


SQL> ed
Wrote file afiedt.buf


  1  select segment_name,PARTITION_name,tablespace_name,bytes
  2  from user_segments
  3* where segment_name='ID1'
SQL> /


no rows selected 


可见,其实分区表只是几个分区组合在一起的一个总称,他本身并不占用空间,可以说不是 segment,但表明依然作为各分区的 segment_name。这也可以从查询 user_extents 看出:



SQL> select segment_name,PARTITION_NAME,SEGMENT_TYPE,EXTENT_ID,BLOCKS
  2  from user_extents
  3  where segment_name='SCUBAGEAR';


SEGMENT_NAME    PARTITION_NAME  SEGMENT_TYPE        EXTENT_ID     BLOCKS
--------------- --------------- ------------------ ---------- ----------
SCUBAGEAR       ID1             TABLE PARTITION             0          8
SCUBAGEAR       ID2             TABLE PARTITION             0          8
SCUBAGEAR       ID3             TABLE PARTITION             0          8
SCUBAGEAR       ID4             TABLE PARTITION             0          8


SQL> ed
Wrote file afiedt.buf


  1  select segment_name,PARTITION_NAME,SEGMENT_TYPE,EXTENT_ID,BLOCKS
  2  from user_extents
  3* where segment_name='ID1'
SQL> /


no rows selected


暂时研究了这些,呵呵,等看完了再上来补充。


Send A Comment