在SQL Server中,数据将如何加载到内存中?

6

我是SQL Server的初学者。我已经了解到SQL Server中的缓存区,我认为这是在系统RAM中执行查询后数据将被存储的位置。如果我的理解正确,那么我有几个关于查询执行的问题。

1) 如果我的RAM大小为2GB,并且我在SQL Server中有10GB大小的数据,如果我执行检索所有数据(10 GB)的SQL语句,会发生什么情况(能完成/不能完成)?

2) 在同样的情况下,如果多个用户执行检索每个5GB的查询(总共10GB),会发生什么情况?


6
这是“问题”而不是“怀疑”…… - Yuck
1
@Yuck http://english.stackexchange.com/questions/2429/can-doubt-sometimes-mean-question - Curtis
@Curt 这也在元上被提出了。这种字面翻译的问题在于,对于以英语为母语的人来说,它通常具有非常负面的含义。 - Yuck
4个回答

7

当您发出SELECT * FROM [MyTable]并且您的表在只有2Gb RAM的系统上占用了10Gb时,数据库不必一次性在内存中读取整个10 Gb。选择将开始扫描数据,从第一个数据页面开始。为此,它仅需要该页面(即8Kb)在内存中,因此它读取该页面并消耗8Kb RAM。当它扫描此页面时,它会产生输出,您将其视为结果集。一旦完成此页面,它需要下一页,因此它在内存中读取。它扫描其中的记录并为您的结果生成输出。然后是下一页,再下一页。关键点是一旦完成页面,就不再需要它。随着它将这些8kb页面添加到RAM中,它们最终会累积并消耗所有可用RAM。在那一刻,SQL将释放RAM中旧的、未使用的页面,从而为新页面腾出空间。它会继续这样做,直到读取整个10Gb的表为止。
如果有两个用户读取每个5GB的表,情况完全相同。每个用户的查询一次只扫描一个页面,随着他们不断阅读页面并取得进展,他们会填满RAM。当所有可用的RAM都被使用时,SQL将开始从RAM中丢弃旧页面以为新页面腾出空间。
在现实世界中,由于预读等考虑因素,情况更加复杂。
另外需要注意的是,您永远不应扫描10GB的数据。您的应用程序应始终仅请求所需的数据,并且可以使用索引快速检索数据,以避免需要检查整个表格的大型扫描。

关键点在于一旦页面完成,它就不再需要了。但是对于经常访问的表格呢?将其存储在内存中对于SQL Server来说非常重要,因为这比从磁盘读取/写入更有效率。 - Jez

2

谢天谢地,你不必担心这个问题。当然,调整查询、减少网络传输的结果集等等都很重要,但是SQL Server已经存在了很长时间,并且它非常擅长自己的内存管理。除非你遇到一个具体的查询出现问题,否则我会说不用担心。


2
正如您所指出的那样,检索到的数据会进入缓存缓冲区。其中一些是真正的内存,一些则被拆分到磁盘上。
您可以通过观察页面生存期性能计数器(还有其他指标,但这是一个快速的简写)来观察是否正在重复使用内存。如果运行返回大量数据并将其他数据推出缓存的查询,则可以观察页面生存期下降。当您运行许多小型查询时,可以看到页面生存期增长,有时长度达到几天甚至更长时间。
这不是衡量系统内存压力的好方法,但它可以给您一个指示,表明您正在很好地重复使用缓存中的数据。

1

SQL Server不会将查询的完整结果集存储在RAM中以便重用。可以存储的是查询所使用的执行计划。

SQL Server存储数据以进行操作,例如在更新语句中,它从数据库中读取数据,存储在RAM中,进行编辑,然后另一个进程将其写回到数据库中。但正如@n8wrl所说,您不需要担心这个问题。


4
SQL Server中最大的内存部分是缓冲池,它实际上是从磁盘读取的数据,存储在内存中,以便于多次查询时可以重复使用。简而言之,如果有足够的RAM,查询的结果集将存储在RAM中。如果没有足够的RAM,它将尽可能地进行循环运算。你可以通过观察pagelifeexpectancy来观察这种情况的发生。 - Grant Fritchey
是的,但这是一个非常复杂的情况,有几种可能性。想象一下,您的选择返回2行,并且正如您所说,它们被缓存了。如果其中一个在数据库中更改,则缓存将变为过时。如果再次运行相同的选择,SQL Server会从缓存、数据库还是每行读取一行数据呢?为了更加复杂,您可以添加并发性、不同的事务隔离级别等等... :) 无论如何,它肯定会产生正确的结果,正如@n8wrl所说,但我们需要一个对SQL Server内部行为有很多了解的人来告诉我们它是如何做到的。 - Diego
2
如果数据发生变化,它会在缓存中被标记为脏数据。实际上,对数据的更改首先在缓存中完成,然后再传输到磁盘上。您可以在Kalen Delaney的优秀书籍《SQL Server 2008 Internals》第1章的第30、31页中了解更多相关信息。 - Grant Fritchey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接