Memory-Optimized 表的统计信息

查询优化器使用有关列的统计信息来创建可提高查询性能的查询计划。 统计信息从数据库中的表收集,并存储在数据库元数据中。

统计信息会自动创建,但也可以手动创建。 例如,创建索引时会自动为索引键列创建统计信息。 有关创建统计信息的详细信息,请参阅 统计信息

随着行的插入、更新和删除,表数据通常会随着时间推移而变化。 这意味着需要定期更新统计信息。 默认情况下,当优化器确定基于磁盘的表的统计信息可能过期时,会自动更新这些表的统计信息。

默认情况下,内存优化表的统计信息不会更新。 相反,你需要手动更新它们。 对各个列、索引或表使用 UPDATE STATISTICS (Transact-SQL)。 使用 sp_updatestats (Transact-SQL) 更新数据库中所有用户和内部表的统计信息。

使用 CREATE STATISTICS(Transact-SQL)UPDATE STATISTICS (Transact-SQL)时,必须指定 NORECOMPUTE 为内存优化表禁用自动统计信息更新。 对于基于磁盘的表,只有当一个表自上次使用sp_updatestats(Transact-SQL)以来被修改过时,sp_updatestats(Transact-SQL)才会更新统计信息。 对于内存优化表, sp_updatestats(Transact-SQL) 始终生成更新的统计信息。 sp_updatestats(Transact-SQL) 是内存优化表的好选择;否则,需要知道哪些表发生了重大更改,以便可以单独更新统计信息。

可以通过对数据采样或执行完全扫描来生成统计信息。 抽样统计信息仅使用表数据示例来估计数据分布。 Fullscan 统计信息扫描整个表以确定数据分布。 Fullscan 统计信息通常更准确,但计算需要更长的时间。 可以更快地收集抽样统计信息。

默认情况下,基于磁盘的表使用抽样统计信息。 内存优化表仅支持 fullscan 统计信息。 使用 CREATE STATISTICS(Transact-SQL)UPDATE STATISTICS(Transact-SQL)时,必须指定 FULLSCAN 内存优化表的选项。

有关内存优化表的统计信息的其他注意事项:

  • 在创建内存优化表时同时创建索引。 当表为空时,将创建索引键列的统计信息。 因此,将数据加载到表中后,需要更新这些统计信息。

  • 对于本机编译的存储过程,在存储过程编译时,查询的执行计划会进行优化。 仅当创建过程和服务器重启时,而不是更新统计信息时,才会发生这种情况。 因此,表需要包含一组具有代表性的数据和统计信息,需要在创建过程之前 up-to日期。 数据库脱机并重新联机,或者服务器重启时,本地编译的存储过程会被重新编译。)

部署 Memory-Optimized 表时的统计信息指南

为了确保查询优化器在创建查询计划时具有 up-to日期统计信息,请使用以下五个步骤部署内存优化表:

  1. 创建表和索引。 索引在语句中 CREATE TABLE 内联指定。

  2. 将数据加载到表中。

  3. 更新表的统计信息。

  4. 创建用于访问表的存储过程。

  5. 运行工作负荷,其中包含本机编译和解释的 Transact-SQL 存储过程,以及临时的批处理任务。

加载数据并更新统计信息后,创建本机编译的存储过程可确保优化器具有可用于内存优化表的统计信息。 这将确保当该过程被编译时的高效查询计划。

关于维护 Memory-Optimized 表统计信息的指导原则

为了保持统计信息 up-to日期,需定期更新内存优化表上的统计信息。

如果数据频繁更改,则应经常更新统计信息。 例如,在批处理更新后更新表统计信息。 更新统计信息后,删除并重新创建本机编译的存储过程,以便它们可以从更新的统计信息中受益。

.

不要在高峰工作负荷期间更新统计信息。

更新统计信息:

要更新单个内存优化表(myschema.Mytable)的统计信息,请运行以下脚本:

UPDATE STATISTICS myschema.Mytable WITH FULLSCAN, NORECOMPUTE  

若要更新当前数据库中所有内存优化表的统计信息,请运行以下脚本:

DECLARE @sql NVARCHAR(MAX) = N''  
  
SELECT @sql += N'  
   UPDATE STATISTICS ' + quotename(schema_name(schema_id)) + N'.' + quotename(name) + N' WITH FULLSCAN, NORECOMPUTE'  
FROM sys.tables WHERE is_memory_optimized=1  
  
EXEC sp_executesql @sql  

若要更新数据库中所有表的统计信息,请运行sp_updatestats(Transact-SQL)。

以下示例报告上次更新内存优化表的统计信息的时间。 此信息可以帮助你确定是否需要更新统计信息。

select t.object_id, t.name, sp.last_updated as 'stats_last_updated'  
from sys.tables t join sys.stats s on t.object_id=s.object_id cross apply sys.dm_db_stats_properties(t.object_id, s.stats_id) sp  
where t.is_memory_optimized=1  

另请参阅

Memory-Optimized 表