Sql server 是否重新生成索引+;更新统计数据实际上解决了倾斜缓存计划的问题?

Sql server 是否重新生成索引+;更新统计数据实际上解决了倾斜缓存计划的问题?,sql-server,database-performance,sql-execution-plan,Sql Server,Database Performance,Sql Execution Plan,背景 我们有一个导出功能,允许用户在一定的时间范围内从许多设备导出测量值 数据库不断更新来自许多设备的传感器数据(每个设备每秒10到50次测量)。因此,由于这些CSV导出通常包含数百万行(每行包含来自多个不同设备的数据,其中每个设备位于单独的数据库中),因此编写CSV是为了从这些表中分块获取数据(我想是为了避免减慢插入速度,因为导出是一项优先级较低的任务) 问题 查询第一个区块时,SQL Server将创建一个符合所传递参数的执行计划。但是,在导出开始时,可能由于连接不足而丢失数据范围,或者由于

背景

我们有一个导出功能,允许用户在一定的时间范围内从许多设备导出测量值

数据库不断更新来自许多设备的传感器数据(每个设备每秒10到50次测量)。因此,由于这些CSV导出通常包含数百万行(每行包含来自多个不同设备的数据,其中每个设备位于单独的数据库中),因此编写CSV是为了从这些表中分块获取数据(我想是为了避免减慢插入速度,因为导出是一项优先级较低的任务)

问题

查询第一个区块时,SQL Server将创建一个符合所传递参数的执行计划。但是,在导出开始时,可能由于连接不足而丢失数据范围,或者由于时间同步错误而以不同方式标记数据范围,这意味着以下重用此缓存计划的查询可能无法获得其参数的最佳计划

一种选择是向每个查询添加
option(RECOMPILE)
,但许多消息来源声称,这将给CPU带来不必要的负担,并且仅定期更新统计数据应该有助于SQL Server创建更好的计划

但是,这没有太大意义,因为即使计划缓存无效,下次用户创建查询时,第一个块也会再次指示执行计划的“形状”

这个推理正确吗?


我应该在每个查询中使用
选项(重新编译)
,还是只添加一个“更新统计信息”维护计划?

可能有助于查看您正在使用的搜索子句/参数我的第一选择是
选项(重新编译)
。然后我会衡量不同方法的影响。您可能需要同时具有
选项(重新编译)
和更新统计信息。可能有助于查看您正在使用的搜索子句/参数。我的首选是
选项(重新编译)
。然后我会衡量不同方法的影响。您可能需要同时具有
选项(重新编译)
和更新统计信息。