为 1 个查询忽略内存中的页面的方法

MAW*_*656 4 sql-server t-sql sql-server-2008-r2

对于单个查询或批处理,是否有某种方法可以忽略缓存的查询计划和内存中的任何数据页?像表格提示或其他选项之类的东西可以仅为当前连接打开?

我想强制这个查询命中磁盘,因为我正在尝试调整它并且执行时间到处都是。试图减少游戏中的变量。

Han*_*non 6

使用OPTION (RECOMPILE)查询提示将有助于在每次执行查询时强制执行新计划。

阻止从缓存中读取数据是不可能的。但是,您可以清除缓存,假设您没有使用生产机器进行这些测试。清除缓存会强制从磁盘读取数据;在每次运行查询之前执行此操作。请勿在生产中执行此操作,因为您将导致针对服务器运行的所有查询的性能非常快速且显着下降。

用于DBCC DROPCLEANBUFFERS在不关闭和重新启动服务器的情况下使用冷缓冲区缓存测试查询。您可能希望首先运行该CHECKPOINT命令以确保首先将所有脏页写入磁盘。

显然,您将要查看实际的执行计划;通过单击 SSMS 菜单中的“查询 - > 包含实际执行计划”(或CTRL - M在运行查询之前按)来执行此操作

您可能还想STATISTICS IO, TIME ON在会话开始时转向以从服务器获得更好的诊断信息。打开“客户端统计”也是查看 SSMS 对结果影响的好工具。点击“查询 -> 包括客户端统计”菜单,或按Shift - Alt - s


Bob*_*mes 6

要不使用缓存计划,您可以向查询添加选项(重新编译)。我认为内存中的页面没有类似的选项。您可以使用 DBCC DROPCLEANBUFFERS 但这将清除缓冲区中的所有页面,而不仅仅是为了您的查询。不要在生产中运行它。

理想情况下,您希望内存中的所有数据都可以调整查询,因为这是最有可能的情况,除非查询正在读取很少使用的数据。

  • @MAW74656 第一次运行查询时,所有数据页访问都将加载到内存中。它们将保留在内存中,直到它们被其他数据页推出、删除清理缓冲区或重新启动。如果您在测试期间很快将数据页推出内存,那么我怀疑您的内存不足。您可以使用 sys.dm_os_buffer_desrciptors 验证缓冲区中的内容。 (2认同)