创建高效且易于管理的表以及表的管理和维护

一、创建表的原则;

  将不同的表放在不用的表空间中

  使用本地管理的表空间避免系统表空间碎片

  在表中使用若干标准extent尺寸以减少表空间的碎片

创建本地管理的表空间上的表时可以在后面添加 tablespace tablespace_name子句。在数据字典管理的表空间上创建表时可以同时制定存储参数。

  storage(initial 100k next 100k pctincrease 0 minextents 1 maxextents 100) tablespace tablespace_name;另外还可以使用pctfree,pctused,initrans,maxtrans等参数

二、创建临时表:当需要对某一个或者几个表中的一批数据进行反复操作时,通过为这批数据创建一个临时表可能会简化操作并且有可能会提高效率。

  create global temporary table

    schom_name.table_name

    on commit preserve/delete rows

    as

    select * form table_name1 where ........

临时表中存储的是会话的私有数据,这些数据只有在事务进行或者会话期间存在。通过on commit preserve/delete rows来控制数据的存在周期

  delete说明数据只有在事务中可见也是默认值

  preserve说明数据行在整个会话中可见

每一个会话只能看到和修改自己的数据,因此在临时表的数据上没有也不需要dml锁,这就是临时表操作效率较高 的原因之一。

临时表并不使用默认的表空间而是使用临时段存储数据即临时表空间上存储数据。

三、表的管理和维护

表的管理和维护主要是针对表的存储参数的设置。可以从storage子句中修改或者直接动态修改表的存储参数

其中常用修改的参数包括pctfree pctused

ex:alter table table_name

  pctfree value1

  pctused value2

在大规模装入数据之前为了避免表的动态扩展,可以手工的扩展extent,另外为了平衡i/0可以把extent分配到不同的数据文件中

alter table table_name

  allocate extent[([size 正整数 [k|M]]

  [datafile '数据文件名'])]

如果省略了size子句那么oracle将从dba_tables中获得next_extent值来分配extent,如果省略了datafile子句那么oracle将从包含该表的表空间中的数据文件上分配extent。另外datafile子句指定的文件必须是包含该表的表空间中的数据文件。

获取segment的sql

select segment_name,tablespace_name,extents from dba_segments

  where owner='OWNER'

  and segment_name like '%table_name%'; 

获得指定表的区段中extent的个数,验证是否成功手动添加extent到表中。

注:查看一个用户的默认表空间和临时表空间上的sql:

select username, default_tablespace, temporary_tablespace
from dba_users;

对一个用户设置默认表空间和临时表空间后,在用户进行数据库对象的创建和数据的操作时,如果不显示的指定表空间和临时表空间那么就使用默认表空间和默认临时表空间来存储数据库对象。

使用dba_indexes数据字典查看对应的index是建立在哪张表上的,是基于哪个tablespace的

select index_name,index_type,table_name,tablespace_name from dba_indexes where owner='OWNER_NAME';

    

原文地址:https://www.cnblogs.com/moonfans/p/3871875.html