假设执行多表连接的 SELECT 查询,结果选择了 100000 行。连接操作将在内存中执行,结果也将保存在内存中,直到客户端(例如 - ssms)消耗整个结果?
一旦客户端使用了结果,SQL Server 是否会从内存中清除查询结果?
Cha*_*ace 16
连接操作输出将在内存中执行,结果将保存在内存中,直到客户端(例如 - ssms)消耗整个结果。
这完全是谬论。根据联接操作,如果查询计划中没有阻塞运算符(例如Sort
或Hash
),则在任何给定时间内存中可能只有一行。
换句话说,完全非阻塞计划(例如,仅使用Loop Join
or Merge
not进行连接Hash
)将通过一系列运算符将从表中读取的每一行提供给客户端。如果客户端阻塞,那么下一行将不会被读取。
在阻塞运算符的情况下,运算符本身具有内存(或磁盘空间,如果需要)来保存结果集。一旦操作员完成(可能在总体计划完成之前),数据就会被删除。在这种情况下,它永远不会超出查询的生命周期。
同样,在行通过时缓存行或预取行的运算符在运算符完成后不会保留它们。
在查询生命周期之外缓存的唯一内容是查询计划本身(它告诉服务器如何为查询提供服务)和表中的原始页面(保存在称为缓冲池的单独区域中)。查询结果根本不被缓存。