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)以清除您的问题:
| 归档时间: |
|
| 查看次数: |
18704 次 |
| 最近记录: |