首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一旦查询输出被客户端读取,SQL服务器会对它做些什么?

问一旦查询输出被客户端读取,SQL服务器会对它做些什么?
EN

Database Administration用户
提问于 2022-05-03 10:29:08
回答 3查看 2K关注 0票数 7

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

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

EN

回答 3

Database Administration用户

发布于 2022-05-03 23:19:05

连接操作输出将在内存中执行,结果将保存在内存中,直到客户机(例如- ssms)使用整个结果为止。

这完全是谬论。根据联接操作的不同,如果查询计划中没有阻塞操作符(如Sort或Hash),那么在任何给定的时间,内存中都可能只有一行。

换句话说,一个完全非阻塞的计划(例如仅使用Loop Join或Merge而不是Hash连接)将通过一系列操作符将从表读取的每一行提供给客户端。如果客户端阻塞,那么下一行就不会被读取。

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

同样,在行通过时缓存行的操作符或预取行的操作符不会将行保存到操作符完成的点之后。

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

票数 16
EN

Database Administration用户

发布于 2022-05-03 11:44:37

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

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

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

票数 8
EN

Database Administration用户

发布于 2022-05-03 11:45:18

Server缓存计划和数据,但不缓存查询结果。如果您有一个重复运行相同查询的场景,则可能可以改进体系结构。例如,可以使用查询通知通知客户端数据已经更改--不需要一直询问它是否已经更改。

Oracle 有除了查询通知之外,还有一个结果缓存。

票数 3
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/311584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档