我有2个关于sql server cache的问题,这有助于我调整性能问题。
我在一篇文章中读到,当我查询COUNT()时,表的所有页面都被加载到缓存中。这是真的吗?这是否意味着我们使用' select coun()加载相同数量的数据...'和'选择* ...' ??
当我查询'选择顶部...'如果没有顺序,查询结果会加载到缓存中,或者所有数据都会加载到缓存中,然后优化器会在缓存中执行顶级操作来选择所需的数据吗?
提前致谢
答案 0 :(得分:0)
我不禁想知道为什么你需要知道,你有特定的性能问题还是理论上的?像往常一样答案是“它取决于” - sql server将根据查询进行各种缓存和优化。它也不清楚你是指内存数据缓存还是查询计划缓存,但我们假设你的意思是从磁盘加载到内存中的数据量因此被“缓存”。回答此类问题的最简单方法是运行一些启用了某些统计信息的查询
SET STATISTICS IO ON
然后运行您的查询并比较结果。输出将显示“逻辑读取”和“物理读取”。 e.g。
Table 'ProductCostHistory'. Scan count 1, logical reads 5, physical
reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0,
lob read-ahead reads 0.
每次读取都是一个正在加载的数据页面,其中物理是从磁盘读取,逻辑是从内存中读取。一旦从磁盘(物理)加载页面,SQL Server将把它保留在内存中,直到它认为它适合从缓存中逐出它为止,因此第二次读取相同的数据将被视为逻辑。使用此功能,您应该能够测量查询并自行确定从内存缓存中读取更多数据的内容。请注意,如果服务器可以使用索引来回答您的查询,那么通常意味着读取的数据要少得多。