我知道这是一个有趣的请求,但我想在我们的开发数据库禁用页面caching。 我相信这样做可以更容易地看到已经完成的各种调整的影响,而且我非常好奇时间检索未caching的页面,而不是如此高效地MSSQL可以从caching中获取数据。
但是,这必须在数据库级别完成,所以我不能只将服务器的内存caching设置到一个荒谬的低水平(这有可能会导致我不想做的索引caching,而我们的开发系统有其他数据库,我宁愿不碰)。
刷新数据库AFAIK的命令将在所有数据库中刷新,而且我宁愿不这样做到我们的开发数据库。
这不是一个强制性的事情,但是当我可以将整个开发数据库放在页面caching中时,基准testing是相当困难的。
在运行testing之前考虑使用DBCC DROPCLEANBUFFERS。 这将做你想要的,作为一次性的caching下降。 您需要在每次testing开始时运行它。
如果你的testing数据库没有被别的东西使用,你可以分离,然后立即重新连接数据库。 (你可以用一些系统存储过程调用,sp_detach_db和sp_attach_db来做到这一点。)这将抛出caching中的任何页面,并且只有很less的数据页面被caching,直到开始运行查询。
当然,如果基准testing的是比单个查询更复杂的事情,而其他人在共享开发系统上的某个其他数据库上运行一个大的查询,那么您的结果(以秒为单位进行测量以运行查询)可能会出现偏差,因为部分或全部您的页面可能会被抛出数据caching,使您的查询运行时间比其他方式。
如果你的目标是对单个查询(或一组查询,或一个存储过程)进行基准testing,并着眼于优化它们,而你没有自己的服务器,那么我build议你专注于页面读取,而不是花时间运行查询。
如果您的服务器速度较慢(开发)和快速(生产)服务器具有相同的数据和代码,则查询可能在慢速服务器上运行10秒,在快速服务器上运行1秒钟。 他们将读取相同数量的页面。 (你会发现一些小的变化,但通常不到1%。)如果你改进查询,以便在慢速服务器上读取更less的页面,它将在快速服务器上读取更less的页面。 读取较less页面的查询几乎总是performance最好的。
您可以从Profiler获取页面读取信息,可以查看任何客户端程序。 (当使用Profiler时,一定要过滤掉所有不需要的连接/数据库/事件/列,并且不影响正在分析的服务器的性能。)
(当开发系统是单核,服务器可能是双核或四核的时候,以前这样做会比较困难,开发系统上的计划对于大型查询是不同的,这是你通常想要优化的)。
另一个工作angular度是在SSMS中运行它们时查看查询的逻辑读取和物理读取。 查询选项的对话框中的“设置统计I / O在”选项。 这是在“高级”部分。 这适用于单个查询或简单的存储过程。 对于那些碰到很多桌子的复杂的东西,它变得很难看。 在这种情况下,试着找出一些最坏的人,并隔离真正的坏的部分,然后仔细看看这些部分。
您将希望最小化逻辑读取。 如果最小化逻辑读取,则当服务器需要从磁盘提取数据时,物理读取也应该下降。 另外,在需要caching数据的情况下,最小化逻辑读取将使查询运行得更快。