对于已经应用的表(非临时表)统计信息更新条件为 500 20%,具体更新条件 如果统计信息是在常规表上定义的,则在以下情况下已过时: 表大小已从 0 变为0 行。统计gath时表的行数
对于已经应用的表(非临时表)统计信息更新条件为500 20%,具体更新条件
如果在常规表上定义统计信息,则在以下情况下该统计信息已过时:
表格大小已从 0 行变为 >0 行。
收集统计信息时表中的行数为 500 或更少,并且统计对象的前导列的 colmodctr 从那时起已更改超过 500。
收集统计信息时表的行数超过 500 行,并且统计信息对象的前导列的 colmodctr 更改了超过 500 收集统计信息时表中行数的 20%。
如果统计对象是在临时表上定义的,则如上所述,它已经过时,除了在 6 行处重新计算有一个额外的阈值,测试在其他方面与前面列表中的测试 2 相同。
在一些增加的表中触发此更新条件的周期可能会很长,因为可能影响查询的性能。这里介绍sqlserver的一个跟踪标志2371
当开启该标志时,统计信息的更新将根据表数据量的总体大小动态调整触发更新条件
(如1000000数据30000即可触发更新(3%),1000000000数据1000000即可触发(0.1%)),从而有可能提高系统整体性能。
如图所示
注意:由于更新统计信息本身也有一定的资源消耗,开启后会造成统计信息更新相对间隙,所以开启前应全面评估整体成本。
(如未因统计信息更新对全局造成明显影响则消耗开启)
个人想法:关系型数据库发展至今,所有产品差异越来越小,细节更能体现一款产品的优秀程度。
2371的功能如果能作为一个库的选项设置,细化粒度(数据库根据用途可能导致访问特点不尽相同),将使统计信息的管理更加灵活。