首页 > 解决方案 > 如何提高 SQL Server 读取速度?

问题描述

我正在尝试将表从一个 SQL Server 复制到另一个。源是 SQL Server 2014,目标是 SQL Server 2016。我无法获得超过 60MB/s 的速度。我有大约 15 亿行要复制,总表大小约为 1TB。

源服务器具有 SATA SSD 的 RAID 5,目标服务器具有 NVME SSD 的 RAID 0。两台机器都通过 10GbE 直接连接,无需交换机。我能够在几秒钟内复制几 GB 的文件,所以我认为网络和磁盘都配置正确。

我正在使用 SSIS,我只尝试了一个“表”源和一个select *查询。该包创建目标表,我正在使用快速加载。我已经尝试过用于 SQL Server 的 oledb,以及用于连接类型的 SQL 本机客户端。我已经在我的数据流中尝试了 1 到 12 个并行源/目标,我得到的速度大约是从 1 到 12 的 3 倍。但是我没有一种简单的方法来进一步划分数据以增加并行度。

我玩过缓冲区和数据包大小无济于事。

源表有大约 100 列。

我期望为此至少获得 300-500MB/s,并希望至少使源磁盘读取速度饱和(~800MB/s)。我错过了什么还是这只是 SQL Server 的限制?

标签: sqlsql-serverssisetl

解决方案


我已经很久没有问这个问题了。
感谢所有做出贡献的人。

我尝试了所有建议,结果好坏参半。我不想进入一个输出文本文件然后重新导入它们的过程,我需要保留表中的所有列。

最后,唯一让我“尽可能快”的事情是创建没有索引的目标表,运行 32 个并行读/写数据流,然后创建必要的索引。

我永远无法使 10Gb 连接饱和,但目标机器(Threadripper 2950X)上 CPU 的所有 32 个线程都达到了 100%。这可能是由于软件 NVME RAID。

使用这种方法并使用插入提交大小最终使我达到了大约 600-700MB/s。之后添加聚集索引相当快,只需几分钟。

希望这对尝试做同样事情的其他人有所帮助。


推荐阅读