假设执行带有多表联接的SELECT查询,从而选择100000行。连接操作将在内存中执行,结果也将保存在内存中,直到客户机(例如- ssms)消耗了整个结果?
一旦客户端使用了结果,SQL服务器是否从内存中清除查询结果?
发布于 2022-05-03 23:19:05
连接操作输出将在内存中执行,结果将保存在内存中,直到客户机(例如- ssms)使用整个结果为止。
这完全是谬论。根据联接操作的不同,如果查询计划中没有阻塞操作符(如Sort或Hash),那么在任何给定的时间,内存中都可能只有一行。
换句话说,一个完全非阻塞的计划(例如仅使用Loop Join或Merge而不是Hash连接)将通过一系列操作符将从表读取的每一行提供给客户端。如果客户端阻塞,那么下一行就不会被读取。
在阻塞操作符的情况下,操作符本身有内存(必要时有磁盘空间)来保存结果集。一旦操作员完成(这可能是在总体计划完成之前),数据就会被删除。在这种情况下,它永远不会超过查询的生存期。
同样,在行通过时缓存行的操作符或预取行的操作符不会将行保存到操作符完成的点之后。
在查询生存期之后缓存的惟一内容是查询计划本身(它告诉服务器如何服务查询)和表中的原始页面(它们保存在一个称为缓冲池的单独区域)。查询结果根本不被缓存。
发布于 2022-05-03 11:44:37
一旦客户端使用了结果,SQL服务器是否从内存中清除查询结果?
数据的原始页(但不是计算的结果)缓存在内存中,称为缓冲池,并将保持缓存(即使在提供原始查询之后),以便根据需要重新使用。
可能导致从缓存中删除页的内容包括需要为新页数据留出空间,以便进行最近的查询、内存压力或服务器重新启动。(可能还有其他原因,我目前还没有想到。)
https://dba.stackexchange.com/questions/311584
复制相似问题