sql - 如何提高 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 的限制?
解决方案
我已经很久没有问这个问题了。
感谢所有做出贡献的人。
我尝试了所有建议,结果好坏参半。我不想进入一个输出文本文件然后重新导入它们的过程,我需要保留表中的所有列。
最后,唯一让我“尽可能快”的事情是创建没有索引的目标表,运行 32 个并行读/写数据流,然后创建必要的索引。
我永远无法使 10Gb 连接饱和,但目标机器(Threadripper 2950X)上 CPU 的所有 32 个线程都达到了 100%。这可能是由于软件 NVME RAID。
使用这种方法并使用插入提交大小最终使我达到了大约 600-700MB/s。之后添加聚集索引相当快,只需几分钟。
希望这对尝试做同样事情的其他人有所帮助。
推荐阅读
- java - 我可以在 Firebase 托管中运行身份验证服务器吗?
- ionic-framework - 如何为 Google Auth 调用 Capacitor 插件
- reactjs - 加载微调器未显示在 React 组件中
- python - Python 中的版本号
- python - 带有 Xarray 的字典中 pandas DataFrame 的总和
- python - 我想制作一个gpu名称相同但价格不同的df
- java - 如何在 foreach 中获取值以设置为父数组?
- javascript - 如何将时区从数字/数字转换为日期 openweathermapAPI
- java - docker-container中的Java web socket客户端无法连接到另一个容器中的websocket java服务器
- r - 需要解决此“chk.H2OFrame(x) 中的错误:必须是 H2OFrame”