表分区大家都好理解,就是对表空间做分区,分区有四种类型,By Range, By Hash, By List,还有上边三种的混合。
语法如下:
CREATE TABLE sales
( prod_id NUMBER(6)
, cust_id NUMBER
, time_id DATE
, channel_id CHAR(1)
, promo_id NUMBER(6)
, quantity_sold NUMBER(3)
, amount_sold NUMBER(10,2)
)
PARTITION BY RANGE (time_id)
( PARTITION sales_q1_2006 VALUES LESS THAN (TO_DATE('01-APR-2006','dd-MON-yyyy'))
TABLESPACE tsa
, PARTITION sales_q2_2006 VALUES LESS THAN (TO_DATE('01-JUL-2006','dd-MON-yyyy'))
TABLESPACE tsb
, PARTITION sales_q3_2006 VALUES LESS THAN (TO_DATE('01-OCT-2006','dd-MON-yyyy'))
TABLESPACE tsc
, PARTITION sales_q4_2006 VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-MON-yyyy'))
TABLESPACE tsd
);
索引的概念也好理解,是为了加速查询的,用空间换时间,参考书本前边的索引很好理解。
语法如下:
CREATE INDEX cost_ix ON sales (amount_sold)
那么分区索引,就是分区和索引的结合了,对每个分区都做个索引。
语法如下:
CREATE INDEX cost_ix ON sales (amount_sold)
GLOBAL PARTITION BY RANGE (amount_sold)
(PARTITION p1 VALUES LESS THAN (1000),
PARTITION p2 VALUES LESS THAN (2500),
PARTITION p3 VALUES LESS THAN (MAXVALUE))
amount_sold 是分区键。
Hash的例子:
CREATE INDEX cust_last_name_ix ON customers (cust_last_name)
GLOBAL PARTITION BY HASH (cust_last_name)
PARTITIONS 4;
这期间会遇到Ora 02158的错误,原因是索引键和分区键不一致导致!
例如 :
CREATE INDEX cust_last_name_ix ON customers (cust_last_name)
GLOBAL PARTITION BY Hash(orderNo)
PARTITIONS 4;