SSMS - SQL 执行计划

Chi*_*les 0 sql-server execution-plan plan-cache

我是 SQL 执行计划的新手,我正在尝试了解更多有关它们的信息。

我有几个问题。

  1. SQL执行计划在内存中保留多长时间?如果我断开连接,下次就无法使用了?有什么办法可以改变这个吗?
  2. 我可以导出执行计划并在下次重新连接到 SQL Server 时将其加载到内存中以绕过查询优化器并节省时间吗?

Cha*_*ace 6

编译器生成查询计划后,会将其存储在缓存中。当编译器认识到它可以这样做时,查询计划会自动重用。

要发生这种情况,查询必须是相同的临时批处理(直到最后一位空格),或者它是存储过程的一部分,此后从未更改过。

用于计算计划的统计信息必须仍然有效且未更改,所有使用的对象(表、索引、列、约束)也是如此。

  1. 该计划将保留在内存中,直到 SQL Server 服务关闭。在此之前,它仍可用于任何其他连接。它可以被填充缓存的其他计划驱逐,或者通过调用DBCC FREEPROCCACHE.
  2. 您无法从文件恢复计划。您可以通过使用查询存储强制编译器使用已编译的特定计划,尽管在某些情况下这不起作用。您可以强制执行计划指南,但它只是一个指南,并不总是意味着编译器会遵守它,并且它仍然需要一些编译。

可以从各种系统视图和功能(称为 DMV)查询计划。例如,此查询将为您提供 SQL 文本、XML 格式的执行计划以及一大堆其他数据。

SELECT * 
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp
Run Code Online (Sandbox Code Playgroud)

如果您担心不稳定的计划,它会不断地在好版本和坏版本之间切换,您应该查看参数嗅探之类的东西,并尝试了解什么会导致坏计划浮出水面,以避免它发生。您可能需要更好的索引或统计信息,或者重新制定查询。