我们有一些生产表具有许多目前不受信任的约束。我们正在检查/信任它们,以便可以再次使用它们。我们知道优化器并未在其计划中使用它们(因为它们不受信任)。在将它们重新设置为受信任之前,我有两个问题。
在使用缓存的查询计划重新运行事务之前,优化器是否会识别更改并考虑它们?换句话说,我是否需要考虑删除任何查询计划?
可以肯定地说这是 SQL Server 一直在重建索引(我们确实启用了此功能)并在整个插入、更新和删除过程中维护索引,但只是不使用外键的情况吗?
谢谢
我们有一些生产表具有许多目前不受信任的约束。我们正在检查/信任它们,以便可以再次使用它们。我们知道优化器并未在其计划中使用它们(因为它们不受信任)。在将它们重新设置为受信任之前,我有两个问题。
在使用缓存的查询计划重新运行事务之前,优化器是否会识别更改并考虑它们?换句话说,我是否需要考虑删除任何查询计划?
可以肯定地说这是 SQL Server 一直在重建索引(我们确实启用了此功能)并在整个插入、更新和删除过程中维护索引,但只是不使用外键的情况吗?
谢谢
是的,优化器应该重新编译计划,因为对基础表的更改是导致计划重新编译的触发器之一。由于检查约束涉及
ALTER TABLE
命令,根据这篇TechNet 文章(从 2008 R2 开始,但对于当前版本也应如此),这应该是更新计划的正当理由,该文章指定了一个
ALTER TABLE
或ALTER VIEW
命令将符合条件。正确的。正如您所观察到的,优化器在创建查询计划时会忽略外键——在不受信任的情况下,涉及表的任何操作都不会使用外键,无论是重建还是插入、更新等。