告诉 SQL Server 查询是临时的,而不是基于它进行优化

Kev*_*ski 7 sql-server

有没有办法对生产 SQL Server 数据库运行一次性查询,并告诉它不要根据该查询做出任何未来的判断。例如存储执行计划、推荐索引等。

或者也许我不应该这么担心。

Kri*_*yer 7

您可以添加查询提示OPTION (RECOMPILE)

这有效地告诉 SQL Server,“给我一个执行此查询一次的计划,但不要将其保存在计划缓存中”。

看一看 Kendra Little 的关于RECOMPILE提示和执行计划缓存的文章。她涵盖了所有用途和潜在影响。

重新编译提示和执行计划缓存

另见:

参数嗅探、嵌入和重新编译选项

关于禁用缺少的索引功能,唯一支持的方法是从命令行使用-xswitch启动 SQL Server。这不是您想要的,但它确实限制了您的选择。


Kin*_*hah 2

\n

有没有一种方法可以对生产 SQL Server 数据库运行一次性查询,并告诉它不要根据该查询做出任何未来的判断。例如存储执行计划、推荐索引等。

\n
\n\n

在回答你的问题之前,你需要先了解一下背景。

\n\n

计划缓存:

\n\n
\n\n

在 SQL Server 上开始执行查询批处理之前,该批处理会被编译成计划。然后执行计划以产生效果或产生结果。

\n\n

执行计划的编译是一项相对昂贵的操作,因此尝试通过将编译的计划缓存在称为计划缓存的 SQL Server 内存区域中来避免这些成本。当需要执行另一个查询批处理时,SQL Server 会在计划缓存中搜索可能的计划重用机会。如果实现了计划重用,就可以避免编译成本。

\n\n

SQL Server 决定从缓冲池向计划缓存分配适当的内存。

\n\n

在此输入图像描述

\n\n

由于您的问题是针对临时查询的,所以让我们了解一下临时查询如何影响计划缓存?

\n\n

Ad-hoc 查询是不包含参数且未预先准备的 TSQL 批处理。

\n\n
\n

在重用之前,SQL Server 需要两个即席查询的文本完全匹配。文本匹配区分大小写和空格,即使在不区分大小写的服务器上也是如此。

\n
\n\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开关。

\n\n

ad-hoc由于您知道正在运行的特定查询并且您不想缓存该计划(稍后我们将讨论缺少索引 DMV 详细信息),因此您可以使用DBCC FREEPROCCACHE (@plan_handle);

\n\n
-- 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

这不会阻止即席查询显示在建议索引列表中。我运行了一个将从索引中受益的查询,它显示在 sys.dm_db_missing_index_details 中。select x from y where z > \'8/1/15\' 选项(重新编译)

\n
\n\n

无法清除/重置 、和统计信息,就像一样。请参阅清除 \xe2\x80\x9cmissing index\xe2\x80\x9d 针对单个表的建议dm_db_missing_index_columnsdm_db_missing_index_groupsdm_db_missing_index_group_statsdm_db_missing_index_detailsDBCC SQLPERF (\xe2\x80\x98sys.dm_os_wait_stats\xe2\x80\x99, CLEAR)

\n\n
\n

或者也许我不应该这么担心。

\n
\n\n

如果查询只是“ONE OFF”,您不必担心。如果您觉得需要运行更多“AD HOC”查询,请寻找打开该选项。optimize for ad hoc workloads sp_configure

\n\n

参考:SQL Server 2012 中的计划缓存和重新编译

\n