重新编译修改后的 Table

Recompile an Altered Table

我们有一个 table,它有超过 2000 万条记录和超过 50 列。我最近向它添加了一个 bit 类型的新列。在我的更改完成后,一些使用此 table 的存储过程表现不佳。 DBA 要求我 运行 SP_Recompile 'tableName' 命令来更新 table 统计信息。在我这样做之后,程序运行良好。有人可以解释当 table 被更改并添加新列时会发生什么吗?它如何影响性能?

这个其实在documentation里面有解释。

首先,sys.sp_recompile N'{Table Name}'; 不会更新 table 的统计数据。来自文档:

If object is the name of a table or view, all the stored procedures, triggers, or user-defined functions that reference the table or view will be recompiled the next time that they are run.

重新编译是指下次重新生成该查询的查询计划;不使用旧的缓存。为什么要这样做,也在文档中讨论:

The queries used by stored procedures, or triggers, and user-defined functions are optimized only when they are compiled. As indexes or other changes that affect statistics are made to the database, compiled stored procedures, triggers, and user-defined functions may lose efficiency. By recompiling stored procedures and triggers that act on a table, you can reoptimize the queries.

当您更改 table 时,您可能会影响统计数据。但是,同样,在行和插入、更新和删除的地方,日常使用也是如此。看来这里就是这种情况,程序使用的计划现在不是最有效的。迫使他们重新编译意味着他们可以使用新的统计数据和新的(希望更有效率的)计划。