缺省情况下,当 ALTER TABLE 语句的 ADD CONSTRAINT 或 MODIFY 选项包含 REFERENCES 关键字以定义一个外键约束时,数据库服务器自动验证启用的引用约束。如果被引用表的列(列组)上已经含有与引用约束的键对应的唯一索引或主键约束,则在外键约束验证期间,您可能节省一些时间。
数据库服务器根据如何验证外键约束而做出成本基础决策。在许多情况下索引键算法可能较快,因为它在验证约束时,只扫描索引值而不是扫描表中所有的行。
如果在这种情况下,数据库服务器只需要检查要创建外键约束的列的单独值。而在同一时刻验证两个外键约束需要在同一扫描中使用两个指标,该情况不支持此行为。
如果该 ALTER TABLE 语句正在创建多个约束,则验证 CHECK 约束需要检查每一行,而不是单个值。在这种情况下,索引键算法不能用于验证外键约束。
如果创建外键约束的 ALTER TABLE 语包含更改任何列的数据库类型的 MODIFY 子句,则数据库服务器不会考虑使用索引扫描执行路径来验证约束。
要使快速索引键算法尽可能有效,它排除所有与用户定义或 opaque 数据类型相关联的低效的执行例程,例如:内置与 opaque 类型中的 BOOLEAN 和 LVARCHAR。
如果它是禁用的,则不需要约束检查算法。因为不会发生验证参照完整性的检查。
违例表需要在同一时间检查,不满足新约束的每一行必须插入此违例表。验证时扫描每一行可防止数据库服务器使用快速索引键算法忽略的重复的行。
在一个行或多行违例的情况下,ALTER TABLE ADD CONSTRAINT 或 ALTER TABLE MODIFY 语句可以创建并验证某些不满足上述要求的外键约束。扫描整个表的额外验证成本一般与表的大小成比例。对于很大的表这些成本也将是巨大的。
当您创建了自我引用外键约束(其 REFERENCING 子句指定了定义该约束的同一表)时,数据库服务器可以考虑索引键算法用于验证参照完整性(如果以上条件都满足)。