这个问题的一个快速背景:我们有一个应用程序,并且有许多这个应用程序的实例正在为客户端运行。虽然它们的版本可能略有不同,但它们基本上是相同的。
昨天,一个客户端出现了SQL超时问题。通过查看查询,我们发现了某些表中的一个问题,并使用OUTER APPLY并重写了它来规避这个问题。
查看今天的查询计划,我可以清楚地看到统计数据是糟糕的,因为它预计大约有250万行,这是不正确的。我更新了统计数据,它解决了这个问题,现在需要30行。
当我检查其他客户端数据库的查询计划时,统计数据似乎关闭,但查询在大约1秒内返回,而不是所面临的问题中所看到的45秒。
这两个数据库都打开了自动统计数据。这是否表明问题数据库中的自动统计数据存在问题?
在测试过程中,我确实清除了缓存DBCC FREEPROCCACHE,因此引擎每次都必须生成一个计划。但是,我还没有在一个及时返回数据的数据库上这样做。
遗憾的是,由于信息敏感,我很遗憾无法共享查询计划。
目前,我们只运行自动统计更新(没有计划的统计信息/索引维护)。这将发生变化;数据库在某种程度上被忽视了。我还要提一下,这些数据库都在Azure。我不确定这是否改变了什么?
发布于 2020-11-10 13:57:02
自动统计和统计本身只是一个方面.另一个是计划,经过计算的选择性,以及计划可以缓存的事实。
因此,假设当stats为"ok“时生成了一个计划(以及其他情况,比如嗅探参数值)。这可以在缓存中停留一段时间,即使数据恶化(一点),您的“好计划”也可以在缓存中停留。
然后,您就有了自动统计数据样本的方面。数据集越大,所采样的数据集中的部分就越小。因此,即使当自动统计启动,与一个更大的数据集,您可能会得到较低的质量统计。
https://dba.stackexchange.com/questions/279456
复制相似问题