有没有办法对生产 SQL Server 数据库运行一次性查询,并告诉它不要根据该查询做出任何未来的判断。例如存储执行计划、推荐索引等。
或者也许我不应该这么担心。
您可以添加查询提示OPTION (RECOMPILE)
。
这有效地告诉 SQL Server,“给我一个执行此查询一次的计划,但不要将其保存在计划缓存中”。
看一看 Kendra Little 的关于RECOMPILE
提示和执行计划缓存的文章。她涵盖了所有用途和潜在影响。
另见:
关于禁用缺少的索引功能,唯一支持的方法是从命令行使用-x
switch启动 SQL Server。这不是您想要的,但它确实限制了您的选择。
\n\n\n有没有一种方法可以对生产 SQL Server 数据库运行一次性查询,并告诉它不要根据该查询做出任何未来的判断。例如存储执行计划、推荐索引等。
\n
在回答你的问题之前,你需要先了解一下背景。
\n\n计划缓存:
\n\n在 SQL Server 上开始执行查询批处理之前,该批处理会被编译成计划。然后执行计划以产生效果或产生结果。
\n\n执行计划的编译是一项相对昂贵的操作,因此尝试通过将编译的计划缓存在称为计划缓存的 SQL Server 内存区域中来避免这些成本。当需要执行另一个查询批处理时,SQL Server 会在计划缓存中搜索可能的计划重用机会。如果实现了计划重用,就可以避免编译成本。
\n\nSQL Server 决定从缓冲池向计划缓存分配适当的内存。
\n\n\n\n由于您的问题是针对临时查询的,所以让我们了解一下临时查询如何影响计划缓存?
\n\nAd-hoc 查询是不包含参数且未预先准备的 TSQL 批处理。
\n\n\n\n\n在重用之前,SQL Server 需要两个即席查询的文本完全匹配。文本匹配区分大小写和空格,即使在不区分大小写的服务器上也是如此。
\n
-- get a count of the number of adhoc query plans use\nselect count(*) as CountOfAdHocQP from sys.dm_Exec_Cached_plans\nwhere cacheobjtype = \'Compiled Plan\'\nand objtype = \'Adhoc\'\n
Run Code Online (Sandbox Code Playgroud)\n\n上面的答案建议使用查询提示OPTION (RECOMPILE)
或-x
开关。
ad-hoc
由于您知道正在运行的特定查询并且您不想缓存该计划(稍后我们将讨论缺少索引 DMV 详细信息),因此您可以使用DBCC FREEPROCCACHE (@plan_handle);
-- for details, refer above ooutwire\'s code : http://dba.stackexchange.com/a/112571/8783\ndeclare @plan_handle as varbinary(64)\n\nSELECT @plan_handle = cp.plan_handle \nFROM sys.dm_exec_cached_plans AS cp \nCROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st\nWHERE [text] LIKE N\'%FROM\n dbo.tbl\nWHERE\n c2%\' -- here goes your EXACT query (along with WHITE SPACE, case UPPER or lower, etc) text to search !!\noption (recompile)\nselect @plan_handle as PlanHandle\nDBCC FREEPROCCACHE (@plan_handle); -- remove the plan handle !! ***CAUTION***\n
Run Code Online (Sandbox Code Playgroud)\n\n\n\n\n\n\n这不会阻止即席查询显示在建议索引列表中。我运行了一个将从索引中受益的查询,它显示在 sys.dm_db_missing_index_details 中。select x from y where z > \'8/1/15\' 选项(重新编译)
\n
无法清除/重置 、和的统计信息,就像一样。请参阅清除 \xe2\x80\x9cmissing index\xe2\x80\x9d 针对单个表的建议dm_db_missing_index_columns
dm_db_missing_index_groups
dm_db_missing_index_group_stats
dm_db_missing_index_details
DBCC SQLPERF (\xe2\x80\x98sys.dm_os_wait_stats\xe2\x80\x99, CLEAR)
\n\n\n或者也许我不应该这么担心。
\n
如果查询只是“ONE OFF”,您不必担心。如果您觉得需要运行更多“AD HOC”查询,请寻找打开该选项。optimize for ad hoc workloads
sp_configure
参考:SQL Server 2012 中的计划缓存和重新编译
\n 归档时间: |
|
查看次数: |
2916 次 |
最近记录: |