我正在尝试导入一个较长的 SQL 脚本(350 万行,大小为 1.5 GB),其中主要包含带有数据的短 INSERT INTO 语句,sqlcmd -E -d <database> -S 127.0.0.1 -i <scriptfile>
并且它几乎停止(大约每秒 150 行)而没有推断出任何明显的SQL server 主机上的负载(所有 CPU 内核几乎处于空闲状态,磁盘吞吐量约为 200 KB/s)。
由于源文件位于 NFS 共享上,我首先怀疑这是罪魁祸首,但本地可用的相同脚本以相同的速度运行。
数据库基本上是空的,表是由相同的脚本创建的,没有触发器或其他花哨的东西——只是原始的,主要是数字或 varchar 数据。
SQLCMD 还在等什么?有什么办法可以加快速度吗?
编辑:
我们在更改 SQL 脚本文件中的数据方面受到限制。数据由第三方提供用于导入程序。我相信它最初是使用 Management Studio 2005“脚本表作为...”功能导出的。
由于庞大的文件大小,编辑文件很乏味 - 任何操作都需要使用普通文本编辑器,尽管预先设置“SET NOCOUNT ON”是通过将两个文件复制在一起完成的 - 它带来了大约 50% 的加速。
由于文本编码 (Unicode-LE),如果不进行转换,就不可能使用通用的 GNU textutils 集(否则它可以很好地处理大文件)进行编辑 - 而且由于数据保真度问题可能会导致我不愿意转换来吧。
因此,我对如何应用有关插入 BEGIN TRAN/COMMIT TRAN 块或将单个插入转换为更大集合的建议感到有些困惑。
一些想法:
GO
每几千行或几千行注入一些命令。然后,它不是一个巨大的批次,而是分成多个批次。将您的个人INSERT
陈述更改为INSERT ... VALUES ()
每组一千套。GO
)。您的手表和日志会感谢您。SET NOCOUNT ON
- 否则 UI、SQL Server 和其间的网络会花费大量时间1 row(s) affected
来回发送每次插入的消息。