我是SQL Server的初学者。我已经了解到SQL Server中的缓存区,我认为这是在系统RAM中执行查询后数据将被存储的位置。如果我的理解正确,那么我有几个关于查询执行的问题。
1) 如果我的RAM大小为2GB,并且我在SQL Server中有10GB大小的数据,如果我执行检索所有数据(10 GB)的SQL语句,会发生什么情况(能完成/不能完成)?
2) 在同样的情况下,如果多个用户执行检索每个5GB的查询(总共10GB),会发生什么情况?
我是SQL Server的初学者。我已经了解到SQL Server中的缓存区,我认为这是在系统RAM中执行查询后数据将被存储的位置。如果我的理解正确,那么我有几个关于查询执行的问题。
1) 如果我的RAM大小为2GB,并且我在SQL Server中有10GB大小的数据,如果我执行检索所有数据(10 GB)的SQL语句,会发生什么情况(能完成/不能完成)?
2) 在同样的情况下,如果多个用户执行检索每个5GB的查询(总共10GB),会发生什么情况?
SELECT * FROM [MyTable]
并且您的表在只有2Gb RAM的系统上占用了10Gb时,数据库不必一次性在内存中读取整个10 Gb。选择将开始扫描数据,从第一个数据页面开始。为此,它仅需要该页面(即8Kb)在内存中,因此它读取该页面并消耗8Kb RAM。当它扫描此页面时,它会产生输出,您将其视为结果集。一旦完成此页面,它需要下一页,因此它在内存中读取。它扫描其中的记录并为您的结果生成输出。然后是下一页,再下一页。关键点是一旦完成页面,就不再需要它。随着它将这些8kb页面添加到RAM中,它们最终会累积并消耗所有可用RAM。在那一刻,SQL将释放RAM中旧的、未使用的页面,从而为新页面腾出空间。它会继续这样做,直到读取整个10Gb的表为止。谢天谢地,你不必担心这个问题。当然,调整查询、减少网络传输的结果集等等都很重要,但是SQL Server已经存在了很长时间,并且它非常擅长自己的内存管理。除非你遇到一个具体的查询出现问题,否则我会说不用担心。
SQL Server不会将查询的完整结果集存储在RAM中以便重用。可以存储的是查询所使用的执行计划。
SQL Server存储数据以进行操作,例如在更新语句中,它从数据库中读取数据,存储在RAM中,进行编辑,然后另一个进程将其写回到数据库中。但正如@n8wrl所说,您不需要担心这个问题。