Oracle数据库中NOLOGGING和FORCE LOGGING的理解

  原文地址:http://database.ctocio.com.cn/tips/282/8200782.shtml

 

  其实nologging与表模式,插入模式,数据库运行模式(archived/unarchived)都有很大的关系:

  总结如下:

  注意append是一种hint;

  一般我们可以这样来使用

  insert /*+append+/ into mytable values(1,'alan');

  数据库在归档模式下

  当表模式为logging状态时,无论是append模式还是no append模式,redo都会生成。

  当表模式为nologging状态时,只有append模式,不会生成redo.

  数据库在非归档模式下

  无论是在logging还是nologing的模式下,append的模式都不会生成redo,而no append模式下都会生成redo。

  如果我想看一张表是否是logging状态,可以这样

  select table_name,logging from dba_tables where table_name='tablename';

      修改表的logging状态:alter table table_name nologging

  那么在Oracle内部还存在一个内部参数:_disable_logging 默认是false

  通过更改为true可以让Oracle在修改表中的记录的时候完全不记录redo,这个参数要甚用。平时,我们只作为性能测试用。

  force logging(强制日志)模式:

  通过命令:

  alter database force logging来使得Oracle无论什么操作都进行redo的写入。

  通过select force_logging from v$database可以看到当前数据库强制日志模式的状态。

 

 

另:分区表数据删除方法

 

如果有全局索引:
alter table table_name  truncate partition NO_分区号 UPDATE GLOBAL INDEXES;
局索引或者无索引:
alter table table_name  truncate partition NO_分区号 ;

 

 分区表、分区索引和全局索引:
  在一个表的数据超过过2000万条或占用2G空间时,建议建立分区表。
  create table ta(c1 int,c2 varchar2(16),c3 varchar2(64),c4 int constraint pk_ta primary key (c1)) partition by range(c1)(partition p1 values less than (10000000),partition p2 values less than (20000000),partition p3 values less than (30000000),partition p4 values less than (maxvalue));
  分区索引和全局索引:
  分区索引就是在所有每个区上单独创建索引,它能自动维护,在drop或truncate某个分区时不影响该索引的其他分区索引的使用,也就是索引不会失效,维护起来比较方便,但是在查询性能稍微有点影响。
  create index idx_ta_c2 on ta(c2) local (partition p1,partition p2,partition p3,partition p4); 或者 create index idx_ta_c2 on ta(c2) local ;
  另外在create unique index idx_ta_c2 on ta(c2) local ;系统会报ORA-14039错误,这是因为ta表的分区列是c1,oracle不支持在分区表上创建PK主键时主键列不包含分区列,创建另外的约束(unique)也不可以。
  全局索引就是在全表上创建索引,它可以创建自己的分区,可以和分区表的分区不一样,也就是它是独立的索引。在drop或truncate某个分区时需要创建索引alter index idx_xx rebuild,也可以alter table table_name drop partition partition_name update global indexes;实现,但是要花很长时间在重建索引上。可以通过查询user_indexes、user_part_indexes和user_ind_partitions视图来查看索引是否有效。
  create index idx_ta_c3 on ta(c3);
  或者把全局索引分成多个区(注意和分区表的分区不一样):
  create index idx_ta_c4 on ta(c4) global partition by range(c4)(partition ip1 values less than(10000),partition ip2 values less than(20000),partition ip3 values less than(maxvalue));
  注意索引上的引导列要和range后列一致,否则会有ORA-14038错误。
  oracle会对主键自动创建全局索引
  如果想在主键的列上创建分区索引,除非主键包括分区键,还有就是主键建在两个或以上列上。
  在频繁删除表的分区且数据更新比较频繁时为了维护方便避免使用全局索引。 

你可能感兴趣的:(oracle)