查询行为 - 关于统计

Kei*_*ith 3 sql-server statistics index-statistics azure-sql-database

问题的快速背景:我们有一个应用程序,我们有许多为客户端运行的应用程序实例。虽然它们的版本可能略有不同,但它们基本上是相同的。

昨天,一位客户遇到了 SQL 超时问题。查看查询,我们发现某些表存在问题,并使用OUTER APPLY并重新编写它来规避该问题。

今天检查查询计划,我可以清楚地看到统计数据很糟糕,因为它预计大约有 250 万行,这是不正确的。我更新了统计数据,它已经解决了这个问题,现在预计有 30 行。

我的困惑来自于我检查其他客户数据库的查询计划时,统计信息似乎关闭,但是,查询在大约 1 秒内返回,而不是在所面临的问题中看到的 45 秒。

两个数据库都打开了自动统计。这是否表明问题数据库上的自动统计有问题?

在测试时,我确实清除了缓存,DBCC FREEPROCCACHE因此引擎每次都必须生成一个计划。但是,我没有在及时返回数据的数据库上执行此操作。

抱歉含糊不清,很遗憾,由于敏感信息,我无法分享查询计划。

目前,我们只运行自动统计更新(没有预定的统计/索引维护)。这会改变;数据库在某种程度上被忽视了。我还应该提到,这些数据库在 Azure 中。我不确定这是否会改变什么?

Tib*_*szi 7

自动统计和统计本身只是一方面。另一个是计划,计算出的选择性,以及计划可以被缓存的事实。

所以想象一个计划是在统计数据“正常”时生成的(以及其他情况,例如嗅探参数值)。这现在可以在缓存中停留一段时间,即使统计数据恶化(有点),你的“好计划”也可以留在缓存中。

然后你有 autostats 采样数据的方面。数据集越大,采样的数据集部分就越小。因此,即使自动统计开始,对于较大的数据集,您也可能会获得较低质量的统计数据。

  • @Keith,您可能会发现通过在其中一个数据库中运行 DBCC FREEPROCCACHE 来测试 Tibor 的观点很有帮助,这些数据库当前的统计数据很差,但查询速度很快(并查看之前和之后的执行计划)。如果执行计划发生变化并且查询现在运行缓慢,那么这绝对是一个操作顺序,首先缓存一个好的查询,然后随着时间的推移统计数据恶化。 (3认同)