表分区与表空间

表分区:把大型表的行划分成多个较小的分区

优点:1.改善表的查询性能(不用查询全表)
   2.表更容易管理
   3.备份和恢复会执行得更好(针对小表的备份和恢复方法更多)

创建分区表:

范围分区:
  在create子句后加上

partition by range (category_name)
    (partition part1 values less than ('B') tablespace part1_ts,
     partition part2 values less than (maxvalue) tablespace part2_ts);

  其中:category_name是字段名,表根据该字段的值进行分区;
    part1、part2是分区名;
    part1_ts、part2_ts是分区所在的表空间名;
    通过less than()指定每个分区中的最大值,该分区中响应字段的值小于但不等于该值。(即part1中不包含对应字段首字母为’B’的记录)
散列分区:

partition by hash (category_name)
partitions 16
store in (part1_ts,part2_ts);

  将’partition by range’替换为’partition by hash’,只需声明分区个数即可。
  建议将分区数设为2的乘方(2、4、8、16)。
  可以通过’store in()’来指定表空间。

散列分区把记录分布在更多的分区上,降低了I/O争用的可能性。

列表分区:

partition by list(category_name)
    (partition part1 values('adultfic','adultnf','adultref') tablespace part1_ts,
    partition part2 values('childrenfic','childrennf','childrenpic') tablespace part2_ts);

  即手动指定将哪些记录加入到哪个表空间的哪个分区上。

Oracle11g引入了两个新的分区方式:引用分区和间隔分区。

引用分区:
  引用分区可以根据这样一个列来创建分区:该列不在被分区的列表中,但它是另一个表的外键引用。

  假设有两个表:invoice_headers和invoice_line_items。
  其中invoice_headers中包含invoice_date列,而出于数据规范化等角度,在invoice_line_items表中没有date类型的列。
  此时想根据日期对invoice_line_items表进行分区,就要用到引用分区。

用法如下(假定invoice_headers表已经存在并已根据invoice_date列进行分区):

create table invoice_line_items
(
invoicenum    number    not null,
line_id       number    not null,
sales_amt     number,
constraint fk_inv_01 foreign key (invoicenum) references invoice_headers
)
partition by reference (fk_inv_01);

  创建invoice_line_items表时,将根据invoice_headers表分区所用的列进行分区,即与该表同步分区。
  通过使用引用分区,可以使多个相关联的表的分区同步,这大大减轻了维护负担。

间隔分区:
  在间隔分区中,不必为每个分区指定特定范围,而是指定间隔长度。
例如要根据时间进行分区,不必指定分区1在1月31日结束,分区2在2月29日结束,而是指定每个分区为1个月长的时间。当插入新行时,Oracle将根据间隔定义确定此行插入到哪个分区。如果还没有为相应的范围建立分区,Oracle将自动创建一个新的分区。

用法如下:

create table invoice_headers
(
    invoice_num    number,
    customer_num   number,
    invoice_date   date
)
partition by range(invoice_date)
interval (numtoyminterval(1,'month'))
(
    partition p1101 values less than (to_date('2017-02-01','yyyy-mm-dd'))
);

  需要注意两点:
  1.使用间隔分区要在插入新行之前自己执行数据检查,否则如果数据输入失误,可能会创建不想要的分区。
  2.如果使用间隔分区,应用程序开发人员将得不到一致的分区名,因为Oracle为自动创建的分区自动命名。

表空间

1.可以通过ALTER TABLESPACE来重命名表空间。
2.可以通过查询USER_TABLESPACES数据字典视图来查看现有表空间。
3.表空间由具有权限的用户通过CREATE TABLESPACE命令来创建,基本语法如下:

CREATE TABLESPACE tablespace_name DATAFILE 'tablespace_file' SIZE filesize;

示例如下:

create tablespace ETL datafile 'E:\ORACLE\product\12.2.0\dbhome_1\oradata\BI\ETL.dbf' size 1000M autoextend on;

4.如果创建了表而没指定表空间,那么该表将存储到默认表空间中。可以通过USER_USERS数据字典视图来查看默认表空间:

select default_tablespace,temporary_tablespace from user_users;

通过ALTER USER可以设置表空间
查询该数据字典其它字段会显示关于用户的更多信息
以上是关于表空间最基本的内容,若想了解只读表空间、无日志表空间、大文件表空间,表空间的移动等内容,另行查阅资料

规划表空间的使用

  有了表空间的众多特性,Oracle可以灵活地适应各种复杂环境。例如可以在维护活动事务表的同时,维护一组只读的历史数据表。也可以将使用最频繁的表存储在I/O速度最快的磁盘上,等等。
  表空间体系结构应该遵循以下准则
  1.分离活动表与静态表:静态表与活动表在使用上有很大的不同,如静态表用来存储历史数据,可能永远也不需要更改或移动,而活动表则需要进行频繁的CRUD操作,二者在管理上有不同的特点,因此可以存储在不同的表空间上。更进一步,可以将表和索引分为活动分区和静态分区。
  2.分离索引与表:索引可以与表分开管理,将索引保存在专门的表空间中,在创建和重建索引时就无须担心对表所需空间的影响。
  3.分离大对象与小对象:一般来说,小型表往往作为静态的查找表——如国家列表等,记录数目基本固定。而大型表则诸如公司运营数据、银行数据等每天都产生大量记录的表。Oracle对两种表的优化方式是不同的,因此对大型表和小型表的管理可能会有很大的差别,所以应该尽量将它们分开。
  

你可能感兴趣的:(Oracle数据库)