使用 NOVALIDATE 环境选项来指定,在缺省情况下,ALTER TABLE ADD CONSTRAINT 语句创建的(或通过 SET CONSTRAINTS 语句已重置了它的约束模式)外键约束是否处于 NOVALIDATE 模式,除非在 DISABLED 模式下创建它们(或更改为 DISABLED 模式)。
不管是否启用 SET ENVIRONMENT NOVALIDATE 会话环境选项,在那个 DDL 语句执行完成之后,自动地删除 ALTER TABLE ADD CONSTRAINT 语句或 SET Database Object Mode 语句的 SET CONSTRAINTS 选项将其应用到外键约束的对象模式的任何 NOVALIDATE 属性。外键约束的模式成为任何注册在 sysobjstate 系统目录表中的 SET CONSTRAINTS 或 ALTER TABLE 语句,不理会 NOVALIDATE 属性。
在您正在以 ALTER TABLE ADD CONSTRAINT 语句创建 ENABLED 或 FILTERING 外键约束,或以 SET CONSTRAINTS 语句将外键约束的模式更改为 ENABLED 或 FILTERING 时,NOVALIDATE 选项防止在 ALTER TABLE 或 SET CONSTRAINTS 语句正运行时数据库服务器检查表的每行是否符合引用约束。那可节省大量用于移动其引用完整性无可置疑的大型表的时间。
SET ENVIRONMENT NOVALIDATE '1';
SET ENVIRONMENT NOVALIDATE OFF;
对于随后的 SET CONSTRAINTS 或 ALTER TABLE ADD CONSTRAINT 语句,数据库服务器以该外键约束执行全表扫描或表的索引扫描,以便于验证该表的引用完整性。对于有几百万行的表,此验证的成本巨大。
通过启用 NOVALIDATE 会话环境选项,在 SET CONSTRAINTS 或 ALTER TABLE ADD CONSTRAINT 语句期间挂起外键约束检查,对于那些通过强制相同的约束的 OLTP 操作已填写的表,可提高效率。在以他们的被删除或禁用的外键约束将那些表移至另一数据库或数据仓库之后,在恢复引用约束时,您可使用 SET ENVIRONMENT NOVALIDATE ON 语句来避免进行违反检查。