Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数据将如何加载到sql server中的内存中_Sql_Sql Server - Fatal编程技术网

数据将如何加载到sql server中的内存中

数据将如何加载到sql server中的内存中,sql,sql-server,Sql,Sql Server,我是sql server的初学者。我读过sql server中的缓冲区缓存。我认为它是执行查询后在系统RAM中存储数据的位置。如果这是正确的,我有几个关于查询执行的问题 1) 如果我的RAM大小为2GB,并且我的sql server中有10GB大小的数据,并且如果我执行SQLStation从数据库中检索所有数据(10GB),会发生什么(工作/不工作) 2) 在相同的情况下,如果多个用户执行查询,每个用户检索5 GB(总计10 GB),会发生什么情况 谢天谢地,你不必为此担心。当然,优化查询、最小

我是sql server的初学者。我读过sql server中的缓冲区缓存。我认为它是执行查询后在系统RAM中存储数据的位置。如果这是正确的,我有几个关于查询执行的问题

1) 如果我的RAM大小为2GB,并且我的sql server中有10GB大小的数据,并且如果我执行SQLStation从数据库中检索所有数据(10GB),会发生什么(工作/不工作)


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

谢天谢地,你不必为此担心。当然,优化查询、最小化网络传输的结果集等都很重要。但是SQL Server已经存在很长时间了,它在自己的内存管理方面非常出色。除非您遇到一个行为不正常的特定查询,否则我会说不要担心。

sql server不会将查询的完整结果集存储在RAM中以供重用。可以存储的是查询中使用的执行计划


SQLServer存储数据以对其进行操作,就像在update语句中一样,它从数据库中读取数据,存储在RAM中,编辑数据,然后另一个进程将其写回数据库。但正如@n8wrl所说,您不必担心它。

正如您所指出的,检索到的数据会进入缓冲区缓存。其中一些是真正的内存,一些是假脱机到磁盘

您可以通过查看页面预期寿命性能计数器(也有其他指示器,但这是一个快速速记)来观察是否正在重用内存。如果运行的查询返回大量数据并将其他数据从缓存中推出,则可以看到页面预期寿命下降。当您运行大量的小查询时,您可以看到页面的预期寿命增加,有时会延长到几天


这并不是衡量系统内存压力的一个很好的方法,但它可以告诉您看到缓存中的数据被重用的程度。

当您发出
SELECT*FROM[MyTable]
并且您的表在只有2Gb RAM的系统上有10Gb时,数据库不必在内存中一次读取整个10Gb。选择将从第一页开始,开始一段数据。为此,它只需要内存中的该页(8Kb),因此它读取该页并消耗8Kb的RAM。当它扫描此页面时,它会生成您看到的结果集输出。一旦完成此页,它就需要下一页,以便在内存中读取。它扫描其中的记录并为您的结果生成输出。然后是下一页,然后是下一页。关键的一点是,一旦完成了一个页面,它就不再需要了。当它不断地将这些8kb的页面添加到RAM中时,它们最终会累积起来并消耗所有的空闲RAM。在那一刻,SQL将释放RAM中旧的、未使用的页面,从而为新页面腾出空间。它将一直这样做,直到读取表的整个10Gb

如果有两个用户分别读取一个5GB的表,则工作原理完全相同。每个用户的查询一次只扫描一个页面,当他们继续阅读页面时,他们会填满内存。当所有可用的RAM都被使用时,SQL将开始从RAM中丢弃旧页面,为新页面腾出空间

在现实世界中,由于考虑到以下因素,事物变得更加奇特


另外,您不应该扫描10Gb的数据。您的应用程序应该始终只请求所需的数据,并且应该使用索引快速检索数据,以避免需要检查整个表的如此大的扫描量。

这是毫无疑问的…@Yuck@Curt它也是在meta上提出来的。这种直译的问题在于,它通常对以英语为母语的人具有非常负面的含义。实际上,SQL Server内部最大的内存部分是缓冲区缓存,也就是从磁盘读取、存储在内存中的数据,因此,希望它可以在多个查询中重用。简而言之,如果有足够的RAM,查询的结果集存储在RAM中。如果没有,它将尽可能地循环。您可以通过观察PageLifeExpection来观察这种情况。是的,但这是一个非常复杂的场景,有多种可能性。假设您的select返回2行,并按您所说的方式缓存它们。如果在数据库中更改了其中一个,则缓存将过时。如果再次运行相同的select,SQL Server会从缓存、数据库或每行中读取数据吗?更复杂的是,您可以添加并发性、不同的事务隔离级别等:)无论如何,它将产生正确的结果,当然正如@n8wrl所说的,但是它是如何产生的呢?我们需要一个对SQL Server的内部行为有很多了解的人来告诉我们,如果数据发生更改,它将在缓存中被标记为脏的。事实上,对数据的更改首先在缓存中完成,然后传输到磁盘。您可以在卡伦·德莱尼的优秀著作《SQLServer2008内部构件》的第1章第30、31页中了解到这一点。