create table dinya_test 2 ( 3 transaction_id number primary key, 4 item_id number(8) not null, 5 item_description varchar2(300), 6 transaction_date date 7 ) 8 partition by range(transaction_date)subpartition by hash(transaction_id) 9 subpartitions 3 store in (dinya_space01,dinya_space02,dinya_space03) 10 ( 11 partition part_01 values less than(to_date(''''2006-01-01'''',''''yyyy-mm-dd'''')), 12 partition part_02 values less than(to_date(''''2010-01-01'''',''''yyyy-mm-dd'''')), 13 partition part_03 values less than(maxvalue) 14 );
Table created.
SQL>
该例中,先是根据交易日期进行范围分区,然后根据交易的ID将记录散列地存储在三个表空间中。
2 分区表操作
以上了解了三种分区表的建表方法,下面将使用实际的数据并针对按日期的范围分区来测试分区表的数据记录的操作。
2.1 插入记录:
SQL> insert into dinya_test values(1,12,''''BOOKS'''',sysdate); 1 row created. SQL> insert into dinya_test values(2,12, ''''BOOKS'''',sysdate+30); 1 row created. SQL> insert into dinya_test values(3,12, ''''BOOKS'''',to_date(''''2006-05-30'''',''''yyyy-mm-dd'''')); 1 row created. SQL> insert into dinya_test values(4,12, ''''BOOKS'''',to_date(''''2007-06-23'''',''''yyyy-mm-dd'''')); 1 row created. SQL> insert into dinya_test values(5,12, ''''BOOKS'''',to_date(''''2011-02-26'''',''''yyyy-mm-dd'''')); 1 row created. SQL> insert into dinya_test values(6,12, ''''BOOKS'''',to_date(''''2011-04-30'''',''''yyyy-mm-dd'''')); 1 row created. SQL> commit; Commit complete. SQL>
按上面的建表结果,2006年前的数据将存储在第一个分区part_01上,而2006年到2010年的交易数据将存储在第二个分区part_02上,2010年以后的记录存储在第三个分区part_03上。
2.2 查询分区表记录:
SQL> select * from dinya_test partition(part_01);
TRANSACTION_ID ITEM_ID ITEM_DESCRIPTION TRANSACTION_DATE -------------------------------------------------------------------------------- 1 12 BOOKS 2005-1-14 14:19: 2 12 BOOKS 2005-2-13 14:19: SQL>
SQL> select * from dinya_test partition(part_02);
TRANSACTION_ID ITEM_ID ITEM_DESCRIPTION TRANSACTION_DATE -------------------------------------------------------------------------------- 3 12 BOOKS 2006-5-30 4 12 BOOKS 2007-6-23 SQL>
SQL> select * from dinya_test partition(part_03);
TRANSACTION_ID ITEM_ID ITEM_DESCRIPTION TRANSACTION_DATE -------------------------------------------------------------------------------- 5 12 BOOKS 2011-2-26 6 12 BOOKS 2011-4-30 SQL>
从查询的结果可以看出,插入的数据已经根据交易时间范围存储在不同的分区中。这里是指定了分区的查询,当然也可以不指定分区,直接执行select * from dinya_test查询全部记录。在也检索的数据量很大的时候,指定分区会大大提高检索速度。
2.3 更新分区表的记录:
SQL> update dinya_test partition(part_01) t set t.item_description=''''DESK'''' where t.transaction_id=1;
1 row updated.
SQL> commit;
Commit complete.
SQL>
这里将第一个分区中的交易ID=1的记录中的item_description字段更新为“DESK”,可以看到已经成功更新了一条记录。但是当更新的时候指定了分区,而根据查询的记录不在该分区中时,将不会更新数据,请看下面的例子:
SQL> update dinya_test partition(part_01) t set t.item_description=''''DESK'''' where t.transaction_id=6;
0 rows updated.
SQL> commit;
Commit complete.
SQL>
指定了在第一个分区中更新记录,但是条件中限制交易ID为6,而查询全表,交易ID为6的记录在第三个分区中,这样该条语句将不会更新记录。
2.4 删除分区表记录:
SQL> delete from dinya_test partition(part_02) t where t. 上一页 [1] [2] [3] [4] 下一页 没有相关教程
|