SQL Server 存储过程是否缓存数据结果?

11 sql-server stored-procedures

我是从朋友那里听说的,但我从未调查过这是否属实。

执行查询的数据结果存储在缓存中是真的吗?

我的意思是,如果我有一个像这样的存储过程:

SELECT * FROM USERLIST
Run Code Online (Sandbox Code Playgroud)

...结果(在本例中为用户列表)是否存储在缓存中。

另外,如果我有这些:

SELECT * FROM USERLIST WHERE user="user"
SELECT * FROM USERLIST WHERE user="userzzz"
Run Code Online (Sandbox Code Playgroud)

(其中 user/userzzz 作为参数传递),它在数据库缓存中存储 2 个不同的结果是否正确。

我不这么认为,但我需要您的确认,专家!

gbn*_*gbn 21

查询结果缓存

但是,源表和索引数据和元数据在第一次使用后会被缓存(但会受到继续使用、负载和内存压力的影响)

也就是说,查询的结果将在每次执行时进行评估,但查询使用的表(和任何索引等)很可能已经在内存中。

编译后的执行计划将被缓存,这就是我怀疑的混乱之处


小智 8

当一个存储过程被执行时,它被优化和编译,查询计划被放置在过程缓存中。

只要有空间,过程就会保留在缓存中供其他用户使用。使用最近最少使用 (LRU) 算法删除过程。


虽然存储过程的初始执行需要从磁盘上的 sysprocedures 中检索,但对于后续执行,可以简单地从过程缓存中检索优化计划。此行为可导致显着的性能提升。

因此,缓存中的内容是来自存储过程的优化计划,而不是存储过程的结果。


小智 7

当 SQL Server 准备好处理查询时,SQL 管理器会在cache; 如果它不存在,则必须对其进行编译。编译过程包括一些事情。

当一个存储过程被执行时,它被优化和编译。据此,一个查询计划被放置在过程缓存中。

检查Compilation and Execution上一节 的Microsoft SQL Server查询的处理器内部与建筑 有关的查询处理等的详细信息

编译阶段的最终产品是一个查询计划,它被放入过程缓存中。SQL 查询结果/操作的大小可能以 MB、GB 为单位,因此不会放入过程缓存或查询计划中。

检查存储过程执行的下图(来自 MSDN)以清除您的问题: 在此处输入图片说明