我有以下问题:
我正在做两个查询 - 一个接一个。 这两个问题具有相同的"子选择":
第一:
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,但我认为这并不重要。
页面(8KB(是SQLServer中的基本存储单元。
所以当你发出下面的查询
select * from table where id=2
假设 id =2 存储在两个页面中。SQL将首先检查,如果它们在缓存中,如果它们不在缓存中,它们将被带到缓存中并读取。
只要没有内存压力,这两个页面就会在缓存中。如果有内存压力,SQLServer 会开始基于 LRU 算法从内存中逐出缓存的页面,大致转化为较少使用的页面
所以有可能,你的下一个查询可能会从磁盘或内存中读取数据。