与 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
暂时研究了这些,呵呵,等看完了再上来补充。
Posted by Sky at 04:40 PM | Permalink | comments(0) | Edit | Database