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

8
我有一些“效率低下”的查询需要在Azure SQL(v12)上调试。问题是,当查询第一次执行后(尽管可能需要数秒),Azure似乎会缓存查询/执行计划。我做了一些研究,有几个人建议添加和删除列会清除缓存,但这似乎不起作用。如果我让服务器静置几个小时/过夜并重新运行查询,则它需要通常的时间来执行,但再次缓存 - 这使得优化我的查询非常困难。是否有人知道如何强制Azure SQL不缓存我的查询/执行计划?

你尝试过使用 OPTION(RECOMPILE) 运行查询吗?这样每次执行查询时都会有一个新的执行计划,确保了查询的准确性。 - Mike de Klerk
我发现我需要使用微软的Azure SQL实例做类似的事情,但很难找到任何显示这可能是可能的东西。这里的文档说可能不行... https://learn.microsoft.com/en-us/sql/relational-databases/performance/best-practice-with-the-query-store?view=sql-server-ver15 - mochsner
1个回答

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中强制执行某些内容,但也可以等待(假设这是您所看到的问题)。


这对我没有起作用。 - Akira Yamamoto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接