所以我很难完全迷茫,但想看看其他人对我所经历的事情的看法。
我被要求查看运行缓慢的存储过程。目前大约需要8-12分钟才能运行。
所以我注意到一个有用的索引缺失并添加它 - 现在需要8秒。但是,如果我重新启动SQL Server并重新运行存储过程,则需要8-12分钟。
如果我然后停止查询并删除新索引然后重新运行存储过程,则需要几秒钟。奇异。
有没有人经历过这样的事情?如果存在任何差异,则存储过程正在调用View。
答案 0 :(得分:1)
问。 if I restart SQL Server and re-run the stored proc it's taking 8-12 minutes again.
执行查询时,数据将以块的形式读入内存。这些块保留在内存中,但它们会老化"。这意味着块被标记为最后一次访问,并且当Sql Server需要另一个块用于新查询并且内存缓存已满时,最近最少使用的块(最旧的)被踢出内存。 (在大多数情况下 - 全表扫描块会立即老化,以防止全表扫描超出内存并阻塞服务器。)
问。 If I then stop the query and delete the new index then re-run the stored proc it takes seconds again.
这里发生的事情是,第一个查询的内存中的数据块已被踢出内存,因此可以用于第二次查询,这意味着可以避免磁盘访问并提高性能。