首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSMS - SQL执行计划

问SSMS - SQL执行计划
EN

Database Administration用户
提问于 2021-09-14 22:56:54
回答 1查看 157关注 0票数 0

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

我有几个问题。

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

回答 1

Database Administration用户

发布于 2021-09-14 23:15:19

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

要做到这一点,查询必须是相同的临时批处理(直到最后一小部分空白),或者它是存储过程的一部分,此后一直没有更改。

用于计算计划的统计数据必须仍然有效且不变,所有使用的对象(表、索引、列、约束)也必须保持不变。

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

这些计划可以从不同的系统视图和功能中查询,称为DMVs。例如,这个查询将为您提供SQL文本、XML执行计划以及大量其他数据。

代码语言:javascript
复制
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

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

票数 6
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/299596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档