SQL服务器选择所有行内存性能

3
我编写了一个数据库迁移脚本,它连接了来自SQL Server 2005的3个表,并将结果上传到AWS数据库。查询类似于以下内容:
SELECT a.x, b.y, c.z 
FROM Books a join Editions b on a.id = b.book_id
join BookExtras c on c.edition_id = b.id

Books、Editions和BookExtras表共有数百万行记录。SQL服务器将会把所有这些记录加载到内存中进行联接。我的一些队友担心这样会增加内存压力,从而导致脚本崩溃。我认为操作系统会根据需要为该进程分配足够的物理内存,我们不必担心,因为虚拟内存机制会处理好这一切。
有人能否列举一下使用操作系统页面的超大查询和在查询本身中使用分页加载少量记录之间的利弊呢?
1个回答

3
你应该了解SQL Server执行查询的方式。在此帖子中,我发现一些错误的假设:

SQL Server将加载所有这些记录到内存中

使用许多物理连接算法,包括那些会溢出到磁盘上的算法。SQL Server在正常操作下不会使用操作系统分页。它会控制自己的内存使用和溢出。

无论如何,在处理数据时,并非必须始终驻留在内存中。

你可以连接100TB大小的表而SQL Server最终将完成处理。

数百万行

这听起来不像很多,只有几GB的数据?

我的一些团队成员担心它会增加内存压力并导致脚本崩溃。

这确实会增加内存压力,但大多数情况下你不会注意到。默认查询内存限制为SQL Server内存的10%。它不会因内存压力而崩溃。SQL Server会将其溢出到磁盘(而非操作系统)。

SQL Server是专门用于执行此类查询的。该产品被设计用于执行此类精确查询。这是数据仓库式查询。完全没问题。

鉴于你并不完全了解查询的执行方式,并且在短期内学习所有内容是不现实的,你应该在开发服务器上测试脚本。


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