客户端读取查询输出后,SQL Server 将对其执行什么操作?

var*_*ble 7 sql-server

假设执行多表连接的 SELECT 查询,结果选择了 100000 行。连接操作将在内存中执行,结果也将保存在内存中,直到客户端(例如 - ssms)消耗整个结果?

一旦客户端使用了结果,SQL Server 是否会从内存中清除查询结果?

Cha*_*ace 16

连接操作输出将在内存中执行,结果将保存在内存中,直到客户端(例如 - ssms)消耗整个结果。

这完全是谬论。根据联接操作,如果查询计划中没有阻塞运算符(例如SortHash),则在任何给定时间内存中可能只有一行。

换句话说,完全非阻塞计划(例如,仅使用Loop Joinor Mergenot进行连接Hash)将通过一系列运算符将从表中读取的每一行提供给客户端。如果客户端阻塞,那么下一行将不会被读取。

在阻塞运算符的情况下,运算符本身具有内存(或磁盘空间,如果需要)来保存结果集。一旦操作员完成(可能在总体计划完成之前),数据就会被删除。在这种情况下,它永远不会超出查询的生命周期。

同样,在行通过时缓存行或预取行的运算符在运算符完成后不会保留它们。

在查询生命周期之外缓存的唯一内容是查询计划本身(它告诉服务器如何为查询提供服务)和表中的原始页面(保存在称为缓冲池的单独区域中。查询结果根本不被缓存。


J.D*_*.D. 8

一旦客户端使用了结果,SQL Server 是否会从内存中清除查询结果?

原始数据页(但不是计算结果)缓存在内存中,称为缓冲池,并且将保持缓存状态(即使在提供原始查询之后)以便根据需要重新使用。

可能导致页面从缓存中删除的因素包括需要空间来容纳新的数据页面以进行最近的查询、内存压力或服务器重新启动。(可能还有其他我目前没有想到的原因。)