内存优化表:
据我了解,内存优化(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。