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

时间:2015-10-26 11:38:14

标签: sql-server azure caching azure-sql-database

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

请注意,SQL Azure还具有一种自动机制,如果发现性能下降,则可以尝试强制执行先前的计划。但是,它有些保守,因此它可能不会在每次回归之前都出现,直到它随着时间的推移出现明显的变化。因此,尽管您可以在SSMS中强制执行操作,但也可以等待(假设这是您所看到的问题)