1、分区表
通过分区技术可以有效地解决大表、大索引带来的问题。用户对分区表执行的 SQL 查询或 DML 语句与对普通数据表的语句一样。但是定义了分区后,DDL 语句可以访问、操作一个单独的分区,而不是整个表或索引,这样通过分区技术就能简化对大数据库对象的管理工作。分区对应用程序是透明的。(要注意分区对应用程序是透明的,查询、插入等语句对分区和不分区表没有区别。但可以针对单独的一个表分区进行处理,语句为 select * from table table_part partition(part1))。
表分区方法有范围分区、列表分区、哈希分区和复合分区。
范围分区:
CREATE TABLE sales_range (
salesman_id NUMBER(5),
salesman_name VARCHAR2(30),
sales_amount NUMBER(10),
sales_date DATE)
PARTITION BY RANGE(sales_date)(
PARTITION sales_jan2000 VALUES LESS THAN(TO_DATE('02/01/2000','MM/DD/YYYY')),
PARTITION sales_feb2000 VALUES LESS THAN(TO_DATE('03/01/2000','MM/DD/YYYY')),
PARTITION sales_mar2000 VALUES LESS THAN(TO_DATE('04/01/2000','MM/DD/YYYY')),
PARTITION sales_apr2000 VALUES LESS THAN(TO_DATE('05/01/2000','MM/DD/YYYY'))
);
列表分区:
CREATE TABLE sales_list(
salesman_id NUMBER(5),
salesman_name VARCHAR2(30),
sales_state VARCHAR2(20),
sales_amount NUMBER(10),
sales_date DATE)
PARTITION BY LIST(sales_state)(
PARTITION sales_west VALUES('California', 'Hawaii'),
PARTITION sales_east VALUES ('New York', 'Virginia', 'Florida'),
PARTITION sales_central VALUES('Texas', 'Illinois'),
PARTITION sales_other VALUES(DEFAULT)
);
哈希分区:
CREATE TABLE sales_hash(
salesman_id NUMBER(5),
salesman_name VARCHAR2(30),
sales_amount NUMBER(10),
week_no NUMBER(2))
PARTITION BY HASH(salesman_id)
PARTITIONS 4
STORE IN (ts1, ts2, ts3, ts4);
以下是关于何时应该对表进行分区的一些建议:
- 如果表数据量超过 2GB,就应该考虑进行分区。
- 如果表中包含历史数据,且新数据会被添加到最新的表空间中。典型的例子是一种历史表,其中只有当前月份的数据可以被修改,而其他十一个月的数据为只读。
2、索引:
b-tree索引可以同样使用。位图索引需要为本地索引,和非分区表不用同样使用。
3、非分区表转为分区表方法
如果此分区表中,所涉及的查询条件sql谓词都包含某个字段,比如时间stime,可以依照时间进行分区。首先建一个和分区表一样的数据表,是分区表,用stime做分区字段。然后insert into table_test_partition values select * from table_test。oracle会依据分区特性,自动插入到相应表分区中。然后此表转换为分区表,新的应用可以从此表中进行查询。(这个办法比较土,但可行,就是会慢一些,因为非分区表的数据量都是比较大的。)
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9521459/viewspace-687794/
,如需转载,请注明出处,否则将追究法律责任。