版本和内部版本:SQL Server 2005 SP4 (9.0.5000)
作为某种免责声明,我提出这个问题是为了引起对该主题的一些讨论和/或辩论。我不知道是否真的有一个正确的答案,或者正确的答案是否是一个大胖子“It Depends”。因此,我会很慢地接受答案,除非提供了无法被反对意见反驳的明确证据。
该问题涉及 OBJECTPROPERTY CnstIsNotTrusted 和 OBJECTPROPERTY CnstIsNotRepl,以及它们之间的关系。CnstIsNotTrusted 属性在添加或检查约束时由 WITH CHECK|NOCHECK 控制。CnstIsNotTrusted 属性意味着在不检查现有行的情况下启用了约束;因此,约束可能不适用于所有行。当为 true 时,约束不能用于查询优化。例如,我有一个 Person 表,其 LastName 的检查约束确保 LastName LIKE 'Mc%'。如果 CnstIsNotTrusted = 1,那么如果我搜索 LastName = 'Smith',查询计划仍然需要扫描/查找索引。如果 CnstIsNotTrusted = 0 则执行计划甚至不会触及表格。这已在此处得到证明:
https://sqlserverfast.com/blog/hugo/2007/03/can-you-trust-your-constraints/
OBJECTPROPERTY CnstIsNotRepl(DDL 中的 NOT FOR REPLICATION)强制在复制同步期间不检查约束。更准确地说,将检查发布方,但不会检查订阅方。这确保不会多次检查相同的约束。但是,使用 NOT FOR REPLICATION 将使您的约束不受信任。
我的问题是,为了有时获得更有效的执行计划,不使用 NOT FOR REPLICATION 是否值得额外的 CPU 周期?