Loading

SQLServer2008R2 | 执行超时已过期。完成操作之前已超时或服务器未响应。

之前从没出现过这种情况,代码一直正常跑,但是在某个时刻再次运行,就一直提示timeout,具体错误如下:执行超时已过期。完成操作之前已超时或服务器未响应。操作已被用户取消。 语句已终止。

没找到具体原因,只找到一个解决方案,直接在数据库执行此存储过程,即可解决:

  exec sp_updatestats;

以下是一些官方解释,我没懂,有明白的大佬可以给解释一下下。

sp_updatestats UPDATE STATISTICS 通过 ALL 在数据库中的所有用户定义表和内部表中指定关键字,sp_updatestats 执行。 sp_updatestats 显示指示其进度的消息。 完成更新之后,此存储过程将报告已为所有的表更新了统计信息。

sp_updatestats 更新已禁用的非聚集索引的统计信息,并且不更新已禁用聚集索引的统计信息。

对于基于磁盘的表, sp_updatestats根据dm_db_stats_properties sys.databases目录视图中的modification_counter信息更新统计信息,并更新至少包含一行的统计信息。 Sp_updatestats执行时,将始终更新内存优化表的统计信息。 因此, sp_updatestats 不需要执行更多的操作。

sp_updatestats 可以触发存储过程或其他已编译代码的重新编译。 但是,如果在引用的表和索引上只有一个查询计划,则 sp_updatestats 可能不会导致重新编译。 在这些情况下,即便更新了统计信息也不必进行重新编译。

 这里面又涉及一个 统计信息 的概念

查询优化的统计信息是二进制大型对象 (BLOB),这些对象包含与值在表或索引视图的一列或多列中的分布有关的统计信息。 查询优化器使用这些统计信息来估计查询结果中的基数或行数。 通过这些基数估计,查询优化器可以创建高质量的查询计划。 例如,查询优化器可以根据谓词使用基数估计选择索引查找运算符而不是更耗资源的索引扫描运算符,假如这样做能提高查询性能。

每个统计信息对象都在包含一个或对个表列的列表上创建,并且包括将值的分布显示在第一列的直方图。 在多列上的统计信息对象也存储与各列中的值的相关性有关的统计信息。 这些相关性统计信息(或 密度)根据列值的不同行的数目派生。

posted @ 2022-12-06 16:05  河耶悦悦  阅读(1903)  评论(0编辑  收藏  举报