2

内存优化表:

据我了解,内存优化 (MO) 表的统计信息是在创建表时创建的,并且是空的,并且永远不会更新。为了更新索引上的 MO 表统计信息,一旦表中有数据,我需要手动强制更新统计信息。

我的大多数 MO 表都替换了存储过程中的 #temp 表,并且定义为仅模式持久性。

对存储过程的每次调用都会被赋予一个“会话 ID”,我有一项工作会根据旧的“会话 ID”定期清理 MO 表。

话虽如此,MO表拥有最多数据的时间恰好是在清理之前。因此,在清理过程中并在删除语句之前更新表统计信息是有意义的。

本机编译的存储过程:

与 MO 表非常相似,本地编译 (NC) 存储过程的查询计划是在创建过程时生成的,并且仅在 SQL Server 重新启动时才更新。在创建过程或 SQL Server 重新启动时,MO 表是空的,因为它们是使用仅模式持久性定义的。重新创建查询计划的唯一方法是删除 NC 存储过程并在 MO 表中有数据时重新创建它们。这意味着该过程必须在没有适当查询计划的情况下至少运行一次。这是不可接受的——既不必在没有适当查询计划的情况下运行一次程序,也不必在正常操作期间重新创建 NC 程序。

另一种选择是在 NC 存储过程中的每个查询上使用索引提示和强制顺序。这迫使开发人员构建查询计划并忽略 SQL Server。如果是这样的话,我们还不如在 C++ 或 C# 中工作,而不必为 NC 程序而烦恼。

有没有关于如何更好地利用 MO 表和 NC 存储过程的建议?我正在使用 SQL Server 2014,但我相信这些适用于更新版本的 SQL Server。

4

0 回答 0