Oracle系统进行过多的约束检查大大地降低Oracle数据库系统的效率。在某些情况下,例如在数据仓库系统中大规模的装入数据时,为了系统的效率可能不得不牺牲数据的完整性来关闭(禁止)一些约束。任何一个完整性约束都可能处于以下4种状态
之一:
*disable novalidate(禁止而无效):不做任何约束所定义的检查。表中的数据以及
输入或修改的数据都可能不遵守约束所定义的规则。
*disable validate(禁止而有效):表中由约束所限制的列不能做任何的修改。
还有约束上的索引将被删除掉,而且约束也将被禁止(关闭).
*enable novalidate(激活而无效):新的违反约束的数据不能输入到表中。但是表中可能包含违反约束的数据。在将有效的联机事务处理系统数据装入数据仓库时,这种状态可能很有用。
*enable validate(激活而有效):任何违反约束的数据行都不能插入到表中。不过可能有一些违反约束的数据行在约束被禁止期间已经插入了表中。这样的数据行被称为例外,它们必须或者被修改或者被删除
、、、
当一个约束从禁止(disable)状态变为enable validate时,表中所有的数据都会被上锁以检验数据的完整性,这可能造成DML操作的等待,因此建议:为了系统的效率,在生产数据库系统上最好不要在繁忙期间将约束从禁止状态变为enable validate,在
繁忙期间,可以先将约束从禁止状态变为enable novalidate状态,之后等系统平静下来,再将约束变为enable validate状态。
Oracle完整性约束的各种状态之间的变化遵循以下原则:
*如果在激活约束时没有说明novalidate,就意味着enable validate
*如果在禁止(disable)约束时没有说明validate,就意味着disable novalidate
*如果唯一约束或主键约束从禁止(disable)状态变为激活(enable)状态时没有索引,Oracle系统就会自动的为之创建一个唯一索引。与此类似,如果唯一约束或主键约束从激活(enable)状态变为禁止(disable)状态时其索引为唯一索引,Oracle系统将会自动的删除这一索引。
*当任何一个索引从无效(novalidate)状态变为有效(validate)时,Oracle系统必须检查所有的数据;但是从有效变为无效,Oracle系统将不进行数据的检查。
*将一个约束从enable novalidate状态变为enable validate状态时,Oracle系统并不阻塞任何读,写操作以及其它的DDL语句。
之一:
*disable novalidate(禁止而无效):不做任何约束所定义的检查。表中的数据以及
输入或修改的数据都可能不遵守约束所定义的规则。
*disable validate(禁止而有效):表中由约束所限制的列不能做任何的修改。
还有约束上的索引将被删除掉,而且约束也将被禁止(关闭).
*enable novalidate(激活而无效):新的违反约束的数据不能输入到表中。但是表中可能包含违反约束的数据。在将有效的联机事务处理系统数据装入数据仓库时,这种状态可能很有用。
*enable validate(激活而有效):任何违反约束的数据行都不能插入到表中。不过可能有一些违反约束的数据行在约束被禁止期间已经插入了表中。这样的数据行被称为例外,它们必须或者被修改或者被删除
、、、
当一个约束从禁止(disable)状态变为enable validate时,表中所有的数据都会被上锁以检验数据的完整性,这可能造成DML操作的等待,因此建议:为了系统的效率,在生产数据库系统上最好不要在繁忙期间将约束从禁止状态变为enable validate,在
繁忙期间,可以先将约束从禁止状态变为enable novalidate状态,之后等系统平静下来,再将约束变为enable validate状态。
Oracle完整性约束的各种状态之间的变化遵循以下原则:
*如果在激活约束时没有说明novalidate,就意味着enable validate
*如果在禁止(disable)约束时没有说明validate,就意味着disable novalidate
*如果唯一约束或主键约束从禁止(disable)状态变为激活(enable)状态时没有索引,Oracle系统就会自动的为之创建一个唯一索引。与此类似,如果唯一约束或主键约束从激活(enable)状态变为禁止(disable)状态时其索引为唯一索引,Oracle系统将会自动的删除这一索引。
*当任何一个索引从无效(novalidate)状态变为有效(validate)时,Oracle系统必须检查所有的数据;但是从有效变为无效,Oracle系统将不进行数据的检查。
*将一个约束从enable novalidate状态变为enable validate状态时,Oracle系统并不阻塞任何读,写操作以及其它的DDL语句。