清除 SQL Azure 执行计划/查询缓存

Wil*_*son 6 sql-server caching azure azure-sql-database

我尝试在 Azure SQL (v12) 上调试一些“低效”查询。我遇到的问题是,在第一次执行查询后(尽管是很多秒),Azure 似乎缓存了查询/执行计划。我做了一些研究,有几个人建议添加和删除列会清除缓存,但这似乎不起作用。如果我将服务器单独放置几个小时/一夜之间并重新运行查询,则执行它需要通常的时间,但缓存再次就位 - 这使得优化我的查询变得非常困难。有谁知道如何强制 Azure SQL 不缓存我的查询/执行计划?

Con*_*SFT 5

ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE 旨在帮助解决此问题。

https://learn.microsoft.com/en-us/sql/t-sql/statements/alter-database-scoped-configuration-transact-sql?view=sql-server-2017

这与 SQL Server 中的 DBCC FREEPROCCACHE 最接近,但范围仅限于数据库而不是服务器实例。这不会阻止查询计划的缓存 - 它只是使当前的缓存条目无效。

请注意,查询存储可以在 SQL Azure 中为您提供帮助(默认情况下)。它存储计划选择和计划性能(每个计划)的历史记录。因此,如果您有一个在应用程序历史记录中执行得更好的先前计划,并且希望让查询优化器在每次查询编译时选择该计划,则可以使用 SSMS 强制执行该计划。您所看到的一个常见原因是计划选择中的参数敏感性,其中优化器将使用传递的参数值来尝试生成查询计划,假设它代表您运行该查询时的常见模式。如果该值实际上并不接近常见值(就其在表中出现的频率而言),那么您有时可以编译并缓存一个对于您的应用程序来说平均而言并不更好的计划。

查询存储在这里有概述: https://learn.microsoft.com/en-us/sql/relational-databases/performance/monitoring-performance-by-using-the-query-store ?view=sql-server-2017

请注意,SQL Azure 还具有一个自动化机制,可以在发现性能下降时尝试强制执行先前的计划。然而,它有点保守,因此它可能不会对每一次回归都起作用,直到随着时间的推移看到明显的模式。因此,虽然您可以在 SSMS 中强制执行某些操作,但您也可以只是等待(假设这是您遇到的问题)