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


11

我从朋友那里听说过,但是我从未调查过这是否正确。

是否将已执行查询的数据结果存储在缓存中?

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

SELECT * FROM USERLIST

...是将结果(在这种情况下为用户列表)存储在高速缓存中是真的吗?

另外,如果我有这些:

SELECT * FROM USERLIST WHERE user="user"
SELECT * FROM USERLIST WHERE user="userzzz"

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

我不这么认为,但我希望得到您的确认,专家!


Answers:


19

查询结果缓存

但是,第一次使用后,将缓存源表和索引数据以及元数据(不过,可能会继续使用,但会增加负载和内存压力)

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

我怀疑编译后的执行计划将被缓存,这是造成混乱的地方


“也就是说,查询的结果将在每次执行时进行评估,但是查询使用的表(以及任何索引等)很可能已经在内存中了。” :是的,我还不使用SP,我想...这是数据库优化,与Sp无关紧要,对吧?

@markzzz:几乎所有的SQL都编译为执行计划,无论是直接UPDATE,SELECT还是存储过程
gbn11年

6

执行存储过程时,将对其进行优化和编译,并将查询计划放入过程缓存中。

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


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

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


6

当查询准备好由SQL Server处理时,SQL Manager会在cache;中查询它;如果不存在,则必须对其进行编译。编译过程包含一些内容。

当执行存储过程时,将对其进行优化和编译。据此,将查询计划放置在过程高速缓存中。

查看Compilation and Execution有关 Microsoft SQL Server查询处理器内部和体系结构的部分, 以获取有关查询处理等的详细信息。

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

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


-1

SQL Server基本执行以下步骤来执行任何查询(存储过程调用或即席SQL语句):

1)句法检查查询
2)没问题-检查计划缓存以查看是否已经有该查询的执行计划
3)是否有执行计划-该计划已被(重新使用)并执行了查询
4)如果还没有计划,则确定执行计划
5)将该计划存储到计划缓存中以供以后重用
6)执行查询

(Marc_s答案的副本)


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.