表空间
表空间是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间 。
分区表
当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。
注意:已经存在的表没有方法可以直接转化为分区表
范围分区
1.以表中的一个列或一组列的值的范围将行映射到分区
2.由表的分区规范进行定义;partition by range(column_list)
3.由每个单独分区的分区规范进行定义:values less than(value_list);
范围分区的语法:
PARTITION BY RANGE (column_name)( PARTITION part1 VALUES LESS THAN(range1), PARTITION part2 VALUES LESS THAN(range2), ... [PARTITION partN VALUES LESS THAN(MAXVALUE)]);
范围分区示例
CREATE TABLE Sales( Product_ID varchar2 (5), Sales_Cost number (10))PARTITION BY RANGE (Sales_Cost) --根据 Sales_Cost 创建分区( PARTITION P1 VALUES LESS THAN (1000), --包含销售成本低于1000 的所有产品的值 PARTITION P2 VALUES LESS THAN (2000), PARTITION P3 VALUES LESS THAN (3000));--P1,P2,P3分区的名称
CREATE TABLE SALES2 (PRODUCT_ID VARCHAR2(5),SALES_DATE DATE NOT NULL,SALES_COST NUMBER(10))PARTITION BY RANGE (SALES_DATE)( PARTITION P1 VALUES LESS THAN (DATE '2003-01-01'), PARTITION P2 VALUES LESS THAN (DATE '2004-01-01'), PARTITION P3 VALUES LESS THAN (MAXVALUE));
散列分区
1.允许用户对不具有逻辑范围的数据进行分区
2.通过在分区键上执行HASH函数决定存储的分区
3.将数据平均地分布到不同的分区
散列分区语法
PARTITION BY HASH (column_name)PARTITIONS number_of_partitions;或PARTITION BY HASH (column_name)( PARTITION part1 [TABLESPACE tbs1], PARTITION part2 [TABLESPACE tbs2], ... PARTITION partN [TABLESPACE tbsN]);
散列分区示例
CREATE TABLE Employee( Employee_ID varchar2 (5), Employee_Name varchar2(20), Department varchar2 (10))PARTITION BY HASH (Department) --在表 Employee上创建分区键 Department( --创建 3 个分区 Partition D1, Partition D2, Partition D3); --D1,D2,D3分区的名称
CREATE TABLE EMPLOYEE( EMP_ID NUMBER(4), EMP_NAME VARCHAR2(14), EMP_ADDRESS VARCHAR2(15), DEPARTMENT VARCHAR2(10))PARTITION BY HASH (DEPARTMENT)PARTITIONS 4;
列表分区
1.允许用户将不相关的数据组织在一起
列表分区的语法
PARTITION BY LIST (column_name)( PARTITION part1 VALUES (values_list1), PARTITION part2 VALUES (values_list2), ... PARTITION partN VALUES (DEFAULT));
列表分区示例
CREATE TABLE Employee( Emp_ID number (4), Emp_Name varchar2 (14), Emp_Address varchar2 (15))--根据职员住址在表上创建的列表分区PARTITION BY LIST (Emp_Address) ( Partition north values ('芝加哥'), --包含住在芝加哥的职员的记录 Partition west values ('旧金山’, ‘洛杉矶'), Partition south values ('亚特兰大', '达拉斯', '休斯顿'), Partition east values ('纽约', '波斯顿'));--north,west......分区的名称
复合分区
1.范围分区与散列分区或列表分区的组合
复合分区的语法:
PARTITION BY RANGE (column_name1)SUBPARTITION BY HASH (column_name2)SUBPARTITIONS number_of_partitions( PARTITION part1 VALUE LESS THAN(range1), PARTITION part2 VALUE LESS THAN(range2), ... PARTITION partN VALUE LESS THAN(MAXVALUE));
复合分区示例
SQL> CREATE TABLE SALES( PRODUCT_ID VARCHAR2 (5), SALES_DATE DATE NOT NULL, SALES_COST NUMBER (10))PARTITION BY RANGE (SALES_DATE) --在表的 Sales_Date 列中创建范围分区SUBPARTITION BY HASH (PRODUCT_ID) --在表的 Product_ID 列创建散列子分区SUBPARTITIONS 5 --在每个范围分区中创建 5 个散列子分区( PARTITION S1 VALUES LESS THAN (TO_DATE('01/4月/2001', 'DD/MON/YYYY')), PARTITION S2 VALUES LESS THAN (TO_DATE('01/7月/2001', 'DD/MON/YYYY')), PARTITION S3 VALUES LESS THAN (TO_DATE('01/9月/2001', 'DD/MON/YYYY')), PARTITION S4 VALUES LESS THAN (MAXVALUE));--S1,S2,S3创建的四个范围分区的名称
操纵已分区的表
在已分区的表中插入数据与操作普通表完全相同,Oracle会自动将数据保存到对应的分区。查询、修改和删除分区表时可以显式指定要操作的分区。
INSERT INTO SALES3 VALUES ('P001', '02-3月-2001', 2000);INSERT INTO SALES3 VALUES ('P002', '10-5月-2001', 2508);INSERT INTO SALES3 VALUES ('P003', '05-7月-2001', 780);INSERT INTO SALES3 VALUES ('P004', '12-9月-2001', 1080);SELECT * FROM SALES3 PARTITION (P3);DELETE FROM SALES3 PARTITION (P2);
分区维护操作
查询表上有多少分区
SELECT * FROM useR_TAB_PARTITIONS WHERE TABLE_NAME='tableName'
分区维护操作修改已分区表的分区。
分区维护的类型:
1.计划事件 - 定期删除最旧的分区
2.非计划事件 - 解决应用程序或系统问题
分区维护操作有:
1.添加分区
2.删除分区
3.截断分区
4.合并分区
5.拆分分区
添加分区 – 在最后一个分区之后添加新分区
ALTER TABLE SALES ADD PARTITION P4 VALUES LESS THAN (4000);
删除分区 – 删除一个指定的分区,分区的数据也随之删除
ALTER TABLE SALES DROP PARTITION P4;
截断分区 – 删除指定分区中的所有记录
ALTER TABLE SALES TRUNCATE PARTITION P3;
合并分区 - 将范围分区或复合分区的两个相邻分区连接起来
ALTER TABLE SALES MERGE PARTITIONS S1, S2 INTO PARTITION S2;
拆分分区 - 将一个大分区中的记录拆分到两个分区中
ALTER TABLE SALES SPLIT PARTITION P2 AT (1500) INTO (PARTITION P21, PARTITION P22);
原标题:Oracle学习笔记八 表空间
关键词:oracle