在 SQL Server 2012 中缓存并进行查询 - 我可以假设啥以及如何使用此缓存?
Posted
技术标签:
【中文标题】在 SQL Server 2012 中缓存并进行查询 - 我可以假设啥以及如何使用此缓存?【英文标题】:Caching in SQL Server 2012 and doing queries - What can I assume and how to use this cache?在 SQL Server 2012 中缓存并进行查询 - 我可以假设什么以及如何使用此缓存? 【发布时间】:2017-03-17 08:07:11 【问题描述】:我有以下问题: 我正在做两个查询 - 一个接一个。这两个问题具有相同的“子选择”:
第一:
SELECT SomeColumn
FROM
SomeFunction(id)
WHERE
A and B and C
CROSS JOIN
X
第二个:
SELECT SomeColumn
FROM
SomeFunction(id)
WHERE
A and B and C
CROSS JOIN
Y
如您所见,唯一的区别在于 Y
和 X
部分。查询的第一部分完全相同。
我可以指望 SQLServer 缓存它并且第二个查询会比第一个更快吗?问题是:
何时以及如何在 SQLServer 中进行缓存?我可以手动完成,我的意思是先获取
SELECT SomeColumn
FROM
SomeFunction(id)
然后在第一个和第二个查询中使用它
上下文是mybatis和spring-boot,不过这里没关系,我觉得。
【问题讨论】:
我认为您在这里提出了错误的问题。您的查询运行足够快吗?如果是这样,它是否是某个特定的缓存或其他意味着它的手段是否重要?如果不是,您不应该考虑any 机制来加速它,而不是再次专注于缓存,特别是? (如果您的查询甚至有效也会有所帮助,最好使用一些示例数据,以便我们甚至可以运行它们) 为什么不开启执行计划并查看执行时间的结果? 【参考方案1】:页(8KB)是 SQLServer 中的基本存储单元。属于特定表的页存储在逻辑 ID 下。
所以当你发出下面的查询时说
select * from table where id=2
假设,id =2 存储在两个页面中。SQL 会首先检查,如果它们在缓存中,如果不在,则将它们带到缓存中并读取..
只要没有内存压力,这两个页面都会在缓存中。如果有内存压力,SQLServer会根据LRU算法开始从内存中逐出缓存的页面,大致转化为使用较少的页面
所以你的下一个查询可能会从磁盘或内存中读取数据..
【讨论】:
所以只有机会,没有保证。所以我不应该指望在 SQLerver 中缓存 如果您的查询运行缓慢,您也可以忽略这一点并检查进一步的性能方面以上是关于在 SQL Server 2012 中缓存并进行查询 - 我可以假设啥以及如何使用此缓存?的主要内容,如果未能解决你的问题,请参考以下文章