【问题标题】:Does SQL Server have an equivalent to MySql's sql_no_cache modifier?SQL Server 是否有等效于 MySql 的 sql_no_cache 修饰符?
【发布时间】:2013-01-11 21:25:47
【问题描述】:

在 MySql 中测试单个查询的性能,并从图片中取出查询缓存,您可以在 select 语句中使用 sql_no_cache 修饰符:

select sql_no_cache * from Foo;

Microsoft SQL Server 中是否有类似的按查询选项?我看过很多关于使用的帖子:

CHECKPOINT
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

但这似乎有点矫枉过正,并且在尝试将同一非缓存查询的性能与 MySql 进行比较时,可能会给 SQL Server 带来不利影响。

【问题讨论】:

  • 对于我们这些不熟悉 MySQL 的人来说,sql_no_cache 控制什么?缓存执行计划还是缓存数据页?
  • @MartinSmith:SQL_NO_CACHE 告诉 MySQL 不要将结果存储在查询缓存中。
  • @eggyal - 哦,它实际上存储了查询结果? SQL Server 无论如何都不会这样做。执行计划被编译和缓存,页面读入缓冲池可以使后续执行受益,但不会缓存实际的查询结果。
  • @MartinSmith:确实如此——见The MySQL Query Cache。

标签: mysql sql sql-server database


【解决方案1】:

要从缓存中删除特定的查询计划,请获取查询的计划句柄:

SELECT
    t.text,
    s.plan_handle,
    s.creation_time,
    s.last_execution_time
FROM sys.dm_exec_query_stats as s
CROSS APPLY sys.dm_exec_sql_text (s.sql_handle) as t
-- optionally filter based on query text
-- WHERE t.text LIKE '%blah%';

SQL Server 2008+ 允许将计划句柄传递给 DBCC FREEPROCCACHE 以从缓存中删除特定计划:

DBCC FREEPROCCACHE (<plan_handle>);

【讨论】:

  • 谢谢,这似乎对执行时间的影响很小
猜你喜欢
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
  • 2011-03-24
相关资源
最近更新 更多