NOVALIDATE 环境选项

使用 NOVALIDATE 环境选项来指定,在缺省情况下,ALTER TABLE ADD CONSTRAINT 语句创建的(或通过 SET CONSTRAINTS 语句已重置了它的约束模式)外键约束是否处于 NOVALIDATE 模式,除非在 DISABLED 模式下创建它们(或更改为 DISABLED 模式)。

启用此会话环境变量可防止在随后的 ALTER TABLE ADD CONSTRAINT 或 SET CONSTRAINTS ENABLED 或 SET CONSTRAINTS FILTERING 操作期间检查外键约束的引用完整性。在没有理由要期待完整性验证的上下文中,或可推迟外键约束的验证直到将表重新定位到另一数据库为止的上下文中,这可提高这些 DDL 语句的性能。
注:

不管是否启用 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 语句正运行时数据库服务器检查表的每行是否符合引用约束。那可节省大量用于移动其引用完整性无可置疑的大型表的时间。

例如,下列语句启用 NOVALIDATE 会话环境变量:
SET ENVIRONMENT NOVALIDATE '1';
在当前的会话被连接到的数据库中,在下列对外键约束的 DDL 操作期间,它有这些后续的影响:
下列示例恢复缺省的约束模式行为,在其中 NOVALIDATE 不是外键的缺省约束模式的一部分,在 SET CONSTRAINTS 或 ALTER TABLE ADD CONSTRAINT 操作期间,不处于 DISABLED 模式下:
SET ENVIRONMENT NOVALIDATE OFF;

对于随后的 SET CONSTRAINTS 或 ALTER TABLE ADD CONSTRAINT 语句,数据库服务器以该外键约束执行全表扫描或表的索引扫描,以便于验证该表的引用完整性。对于有几百万行的表,此验证的成本巨大。

通过启用 NOVALIDATE 会话环境选项,在 SET CONSTRAINTS 或 ALTER TABLE ADD CONSTRAINT 语句期间挂起外键约束检查,对于那些通过强制相同的约束的 OLTP 操作已填写的表,可提高效率。在以他们的被删除或禁用的外键约束将那些表移至另一数据库或数据仓库之后,在恢复引用约束时,您可使用 SET ENVIRONMENT NOVALIDATE ON 语句来避免进行违反检查。