在 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

如您所见,唯一的区别在于 YX 部分。查询的第一部分完全相同。 我可以指望 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 中缓存并进行查询 - 我可以假设啥以及如何使用此缓存?的主要内容,如果未能解决你的问题,请参考以下文章

Sql Server中执行计划的缓存机制

windows server 2012 r2 怎么设置开机自动启动

如何用sqlserver 2000事件查探器查询sql

SQL Server外连接内连接交叉连接

SQL Server 临时对象缓存

SQL Server 临时对象缓存